none
コマンドプロンプトの実行結果の取得方法について RRS feed

  • 質問

  • $cre = Get-Credential
    
    Invoke-Command -Credential $cre -ComputerName adserver01 {
        net user testuser01 /times:"M-Th,09:00-20:00;F,09:00-18:00;Sa,09:00-12:00;Su,09:00-18:00"
        $user = net user testuser01
    }

    上記の実行により、testuser01のログオン時間を制御しております。

    実現したいことは、$userにセットされた実行結果から、「ログオン可能時間」の結果を配列で取得することです。

    サンプル

    上記リンクの実行結果の、月曜日 09:00:00 - 19:00:00 の部分を取得したいと考えています。

    ユーザーによっては、「すべて」と1行だけ表示されるユーザーや、7行表示されるユーザーなど、返ってくる行数は分かりませんが、コマンドプロンプトの実行結果にアクセスする方法は可能でしょうか。

    PowerShellコマンドでADのログオン時間を取得する方法は確認しておりますが、今回はnet userの結果を取得することを考えています。

    よろしくお願いします。

    2017年9月20日 7:15

回答

  • こんにちは。

    $user = net user testuser01

    の$userにはnet userコマンドを実行した結果コンソールに出力される文字列が配列として保存されており、net userコマンドを使わなければならないのであればこれが取得できる全てとなります。

    このため、「ログオン可能時間」を取りたい場合はこの結果の文字列を自力でパースしてやる必要があります。

    超雑な例ですが、こんな感じのコードでとりあえず必要な部分を取得することはできます。

    # Windows 2012 R2、日本語環境を想定
    $user = net user testuser01
    $user | ForEach-Object -Begin { $matching = $false } `
                -Process { 
                    if($_ -match "ログオン可能時間"){$matching = $true}
                    if($_ -match "所属しているローカル グループ"){$matching = $false}
                    if($matching){
                        if ($_ -ne ""){
                            Write-Output $_.Replace("ログオン可能時間","").Trim()
                        }
                    }
                }

    厳密な「ログオン可能時間」が必要であればnet userではなくADSIを使うのが良いかと思います。


    • 編集済み stknohg 2017年9月20日 8:54 想定環境の追記
    • 回答としてマーク TwSoft 2017年9月20日 8:57
    2017年9月20日 8:52

すべての返信

  • こんにちは。

    $user = net user testuser01

    の$userにはnet userコマンドを実行した結果コンソールに出力される文字列が配列として保存されており、net userコマンドを使わなければならないのであればこれが取得できる全てとなります。

    このため、「ログオン可能時間」を取りたい場合はこの結果の文字列を自力でパースしてやる必要があります。

    超雑な例ですが、こんな感じのコードでとりあえず必要な部分を取得することはできます。

    # Windows 2012 R2、日本語環境を想定
    $user = net user testuser01
    $user | ForEach-Object -Begin { $matching = $false } `
                -Process { 
                    if($_ -match "ログオン可能時間"){$matching = $true}
                    if($_ -match "所属しているローカル グループ"){$matching = $false}
                    if($matching){
                        if ($_ -ne ""){
                            Write-Output $_.Replace("ログオン可能時間","").Trim()
                        }
                    }
                }

    厳密な「ログオン可能時間」が必要であればnet userではなくADSIを使うのが良いかと思います。


    • 編集済み stknohg 2017年9月20日 8:54 想定環境の追記
    • 回答としてマーク TwSoft 2017年9月20日 8:57
    2017年9月20日 8:52
  • stknohg 様

    こんにちは

    早々にご教示いただき、ありがとうございます。

    サンプルのコードで実現できました。

    ADSIについても確認し、違いについて理解したいと思います。

    ありがとうございます。

    2017年9月20日 9:00