我正在使用psexec从我们网络上所有PC上的cmd自动运行,以检查某些进程是否正在运行。但我想要一个列表,其中包含运行该服务的所有PC名称。我怎么能从powershell做到这一点?
这就是我现在正在运行的。 2个批处理文件和1个文本文件。
get.bat
任务列表| findstr pmill.exe>> dc-01 \ c $ \ 0001.txt
run_get.bat
psexec @%1 -u administrator -p password -c“C:\ get.bat”
pclist.txt
我从结果中得到的只是所有pmill.exe,我想知道是否还有我可以输出运行pmill.exe的PC名称?
提示plz!
答案 0 :(得分:1)
如果所有计算机都安装了PowerShell并启用了远程处理,则可以尝试下面的脚本。它还输出无法访问的计算机,以便您可以在以后重新测试它们。如果您不需要,只需删除catch
- 块(或全部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
答案 1 :(得分:1)
取决于可用的远程处理类型:
如果Windows远程管理(例如,Services.msc可以连接),则只需使用
Get-Service -Name theService -computer TheComputer
如果服务正在运行该服务的信息(如它的话),它将返回一个对象
如果没有安装,则没有任何内容,所以假设pclist.txt
是每行一个计算机名,
获取正在运行服务的计算机列表(在用正确的serviceName
替换之后
name:这可能与进程名称不同):
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 the
州member of the returned object in the
Where-Object`可以使用WMI。
PowerShell远程处理:使用Invoke-Command -ComputerName dev1 -ScriptBlock { Get-Service serviceName }
运行远程计算机上的Get-Service
以返回相同的对象(但使用PSComputerName
已添加的财产)