欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

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信息,只需要输入以下语句即可

gwmi win32_bios

输出结果

image

当然我的标题是获得远程计算机的有关信息

那么我们用get-help gwmi -full 看看这个cmdlet还给我们提供了哪些参数

image

-credential 及 -computer 参数就是我们需要的(computer参数支持NETBIOS 名称、IP 地址或完全限定域名。)

因此我们如果想要获得远程计算机的信息的话,只需要输入以下命令(参数支持缩写,但不能混淆,比如credential和computer都是c打头的,你当然不能偷懒只输入c就结束了,必须要明确区别)

gwmi win32_computersystem -cred contoso\administrator -comp win2003

输出结果

image

当然诸位不会满足这样一台台去获得远程计算机的信息,我下面提供的代码是根据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

    }

}

输出结果

image

如果诸位细细品味过上期笔记的代码的话,相信以上代码也不难理解。

这里主要使用了.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)

已发表 2007年8月31日 20:57 作者 ghjconan
归档在:

Attachment(s): RemoteWmi.zip

评论

# re: PowerShell 学习笔记 (3):获得远程计算机的有关信息

2007年8月31日 21:38 by anders

"当然使用gwmi还有个比较难处理的问题,就是当远程计算机能ping通,但就是无法用WMI链接"

=====================================

Get-WMIObject应该是可以链接到远程计算机和进行管理的,只是对方计算机必须运行WMI。

不过你使用的帐户必须是该远程计算机上本地管理员组的成员

# re: PowerShell 学习笔记 (3):获得远程计算机的有关信息

2007年8月31日 21:49 by ghjconan

还有一些其它的问题,也有可能造成无法链接……

只可惜现在的办法要么ping,要么就是 -ea:slinetlycontinue 不过这个还是会使脚本运行缓慢

# re: PowerShell 学习笔记 (3):获得远程计算机的有关信息

2007年8月31日 22:02 by anders

“只可惜现在的办法要么ping,要么就是 -ea:slinetlycontinue 不过这个还是会使脚本运行缓慢

不是很明白这句话,不是可以用gwmi进行ping通的远程机器连接么

# re: PowerShell 学习笔记 (3):获得远程计算机的有关信息

2007年8月31日 22:36 by ghjconan

是啊,是可以对ping通的机器进行WMI链接,但也不排除ping通但是连不上的问题,比如凭据错误

-ea 是 erroraction Slientlycontinue表示不显示错误。

这个错误你可以搜 "gwmi rpc server unavailable"

我搜了下现在没什么好方法

# re: PowerShell 学习笔记 (3):获得远程计算机的有关信息

2007年8月31日 22:40 by anders

厄。。。明白了。。。:)是我理解成另个意思了。。

禁止匿名发表评论