-2

psexecを使用して、ネットワーク上のすべてのPCでcmdから自動実行し、特定のプロセスが実行されているかどうかを確認しています。しかし、サービスが実行されているすべてのPC名のリストが必要です。どうすればPowerShellからそれを行うことができますか?

これは私が今走っているものです。2つのバッチファイルと1つのテキストファイル。

get.bat


タスクリスト| findstr pmill.exe >> dc-01 \ c $ \ 0001.txt


run_get.bat


psexec @%1-u管理者-pパスワード-c"C:\ get.bat"


pclist.txt


結果としてこれから得たものはすべてpmill.exeですが、pmill.exeが実行されているPC名を出力できるかどうか疑問に思っていますか?

ヒントplz!

4

2 に答える 2

1

すべてのコンピューターにリモート処理が有効になっているPowerShellがインストールされている場合は、以下のスクリプトを試すことができます。また、到達できなかったコンピューターを出力するため、必要に応じて後で再テストできます。不要な場合は、catch-block(またはすべてtry/catch)内のコンテンツを削除してください。

$out = @()
Get-Content "pclist.txt" | foreach {
    $pc = $_ 
    try {
        if((Get-Process -Name "pmill" -ComputerName $pc) -ne $null) {
            $out += $_
        }
    } catch { 
        #Unknown error
        $out += "ERROR: $pc was not checked. $_.Message"
    }
}

$out | Set-Content "out.txt"

pclist.txt:

graimer-pc
pcwithoutprocesscalledpmill
testcomputer
testpc
graimer-pc

Out.txt(ログ):

graimer-pc
ERROR: testcomputer is unreachable
ERROR: testpc is unreachable
graimer-pc
于 2013-02-20T17:16:22.510 に答える
1

利用可能なリモーティングの種類に応じて:

  • Windowsリモート管理(Services.mscなどが接続できる)の場合は、

    Get-Service -Name theService -computer TheComputer
    

    これは、サービスがそのサービスに関する情報(ステータスなど)で実行されている場合はオブジェクトを返し、インストールされていない場合は何も返さないため、サービスが実行されているpclist.txtコンピューターのリストを取得するために、1行に1つのコンピューター名があると仮定します(正しい名前に置き換えserviceNameた後:これはプロセス名とは異なる可能性があります):

    Get-Content pclist.txt | Where-Object {
      $s = Get-Service -name 'serviceName' -computer $_
      $s -or ($s.Status -eq Running)
    }
    
  • 上記のStateWhere-Object`Get-WmiObject win32_service -filter 'name="serviceName"' and theを使用してWMIを使用できる場合。member of the returned object in the

  • PowerShellリモーティング:リモートマシンでInvoke-Command -ComputerName dev1 -ScriptBlock { Get-Service serviceName } runを使用して、同じオブジェクトを返します(ただし、 プロパティが追加されています)Get-ServicePSComputerName

于 2013-02-20T17:21:54.020 に答える