PowerShell 学习笔记 (3):获得远程计算机的有关信息
本文在ITECN首发,未经许可严禁转载。
写过vbs脚本的朋友们一定知道,如果我们想获得远程计算机的相关信息的话,WMI无疑是我们最强有力的工具。而在VBS 中使用WMI都有固定的格式,比如:
|
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( "SELECT * FROM Win32_BIOS",,48)
For Each objItem in colItems
Wscript.Echo "Version: " & objItem.Version
Next |
而PowerShell中如果想使用WMI的话相当简单,只需要使用一个cmdlet就能解决,那就是 get-wmiobject ,别名为 gwmi
比如我们想获得当前计算机的bios信息,只需要输入以下语句即可
输出结果

当然我的标题是获得远程计算机的有关信息
那么我们用get-help gwmi -full 看看这个cmdlet还给我们提供了哪些参数

-credential 及 -computer 参数就是我们需要的(computer参数支持NETBIOS 名称、IP 地址或完全限定域名。)
因此我们如果想要获得远程计算机的信息的话,只需要输入以下命令(参数支持缩写,但不能混淆,比如credential和computer都是c打头的,你当然不能偷懒只输入c就结束了,必须要明确区别)
|
gwmi win32_computersystem -cred contoso\administrator -comp win2003 |
输出结果

当然诸位不会满足这样一台台去获得远程计算机的信息,我下面提供的代码是根据IP地址批量获得远程信息(可以直接下载附件,而不用复制这里的代码)
|
$subnet = "192.168.1."
#$cred = Get-Credential contoso\anna
function CustomPing {
$ping = New-Object system.Net.NetworkInformation.Ping
$ping.Send($args).status
}
for ($i=4;$i -lt 10; $i++) {
$result = CustomPing $subnet$i
if ($result -eq "success") {
Write-Host -foregroundcolor green Successfully Ping $subnet$i
gwmi win32_LogicalDisk -comp $subnet$i | ft name,Description,freespace -a
} else {
Write-host -foregroundcolor red Ping $subnet$i - $result
}
} |
输出结果
如果诸位细细品味过上期笔记的代码的话,相信以上代码也不难理解。
这里主要使用了.net对象自定义了 “ping”,然后根据ping的结果来决定是否连接到远程计算机,当然这样判断是存在不足的,诸位可以阅读脚本大师Don Jones写的《Windows PowerShell:筛选的力量》一文。
当然使用gwmi还有个比较难处理的问题,就是当远程计算机能ping通,但就是无法用WMI链接,这时会造成脚本运行缓慢。目前的方法除了ping之外,都无法有效的解决这个问题,期望不久以后能有相应的方法。
还值得一提的是 脚本第二行被注释掉的语句 Get-Credential,诸位都不想当循环语句开始执行后,一次次的输入用户名和密码吧。因此Get-Credential就是将用户名和密码储存到变量中,供以后反复使用。在以上脚本中,大家只要在gwmi那行按照对应格式 "gwmi win32_bios -cred $cred -comp win2003"添加上即可,当然所提供的用户凭据需要有相应权限来获得信息。
PowerShell和WMI是非常强势的组合,希望诸位可以多多探索其中解决实际问题的方法。
补充:比较运算符
|
-eq |
等于 |
|
-ne |
不等于 |
|
-gt –ge |
大于,大于或等于 |
|
-lt –le |
小于,小于或等于 |
可以在运算符前加上“i”或“c”以指定不区分大小写或区分大小写的操作(例如,–ceq)