我刚开始使用powershell,我有以下脚本:
Get-ADComputer -Filter * |
ForEach-Object {
if(Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet)
{
write-host $_.dnshostname
Get-WmiObject Win32_Process -cn $_.dnshostname | Select ProcessID,ProcessName,ThreadCount
Get-WmiObject Win32_DiskDrive -cn $_.dnshostname;
}
ELSE { write-host $_.dnshostname unavlible }
}
基本上我想要实现的是从我的DC中提取每台计算机的列表,测试它们是否已启动,然后使用多个WMI查询轮询它们。我遇到的问题是,当我在第一个Wmi对象上进行选择时,我不会得到第二个wmi对象的结果,因为我假设select正在应用于第二个对象,导致没有数据被返回。
知道如何做到这一点。此外,我现在使用ping来测试机器的可用性,但这不是最好的,因为ICMP在某些系统上被阻止但WMI仍然可能。 ICMP可用但wmi被阻止也是如此。有没有更好的方法来执行获取WMI查询将起作用的系统列表的测试?
答案 0 :(得分:2)
我从powershell v1到v3找到的一个简单的解决方法是:
Get-ADComputer -Filter * |
ForEach-Object {
if(Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet)
{
write-host $_.dnshostname
Get-WmiObject Win32_Process -cn $_.dnshostname |
Select ProcessID,ProcessName,ThreadCount
out-string -inputobject "" #this line does the trick or just out-default
Get-WmiObject Win32_DiskDrive -cn $_.dnshostname;
}
else { write-host "$($_.dnshostname) unavailable }
}
对于测试可用性服务器,我使用this function它使用ping和其他协议来查看服务器是否已启动,您只需true
即可知道是否还活着。
(作为系统管理员在域(不在DMZ域中)建议启用icmp
协议作为第一个诊断工具)