-2

我正在使用 psexec 在我们网络上的所有 PC 上从 cmd 自动运行,以检查某个进程是否正在运行。但我想要一个包含所有运行服务的电脑名称的列表。我怎么能从powershell做到这一点?

这就是我现在正在运行的。2个批处理文件和1个文本文件。

获取.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 名称?

请提示!

4

2 回答 2

1

根据可用的远程处理类型:

  • 如果 Windows 远程管理(例如 Services.msc 可以连接),那么只需使用

    Get-Service -Name theService -computer TheComputer
    

    如果服务正在运行,则返回一个对象,其中包含有关该服务的信息(如其状态),如果未安装,则返回任何内容,因此假设pclist.txt每行一个计算机名称,以获取运行该服务的计算机列表(替换serviceName为正确的名称后:这可能与进程名称不同):

    Get-Content pclist.txt | Where-Object {
      $s = Get-Service -name 'serviceName' -computer $_
      $s -or ($s.Status -eq Running)
    }
    
  • 如果使用上面的Get-WmiObject win32_service -filter 'name="serviceName"' and theState member of the returned object in theWhere-Object 可以使用 WMI。

  • PowerShell 远程处理:使用在远程计算机上Invoke-Command -ComputerName dev1 -ScriptBlock { Get-Service serviceName } 运行Get-Service以返回相同的对象(但PSComputerName 添加了属性)

于 2013-02-20T17:21:54.020 回答
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 回答