从Python访问WMI信息
我有一个小的PS脚本,它可以输出一份iSCSI发起器的IP地址和对应的ID列表。现在我想用这些信息做一些更复杂的事情,但我对PS不是很了解,也不知道它是怎么工作的,所以我想把这个脚本迁移到Python上,然后继续进行。
这个PS脚本是通过WMI获取这些信息的。以下是脚本:
function Get-IscsiPortNumber {
$PortalSummary = @()
$portalInfo = get-wmiobject -namespace root\wmi -class msiscsi_portalinfoclass
$eScriptBlock ={([Net.IPAddress]$_.ipaddr.IPV4Address).IPAddressToString}
$customLabel = @{Label="IpAddress"; expression = $eScriptBlock}
foreach ($portal in $portalInfo) {
foreach ($p in ($portal.portalinformation)) {
$CurrentPort = New-Object PsObject -Property @{ `
NetID = $p.port;`
IP = ([net.ipaddress]$p.ipaddr.IpV4Address).IPAddressToString `
}
$PortalSummary += $CurrentPort
}
}
return $PortalSummary
}
Get-IscsiPortNumber | ft -AutoSize
在Python中,我开始尝试做类似的事情,但每次运行时总是会出现错误:
import wmi
test = wmi.WMI(namespace='root\wmi',moniker='msiscsi_portalinfoclass')
错误信息是:
Traceback (most recent call last):
File "C:\Users\rg\Desktop\diskchecktptest\getnicids.py", line 2, in <module>
test = wmi.WMI(namespace='root\wmi',moniker='msiscsi_portalinfoclass')
File "C:\Python27\lib\site-packages\wmi.py", line 1290, in connect
handle_com_error ()
File "C:\Python27\lib\site-packages\wmi.py", line 241, in handle_com_error
raise klass (com_error=err)
wmi.x_wmi: <x_wmi: Unexpected COM Error (-2147217406, 'OLE error 0x80041002', No
ne, None)>
我希望有懂这个主题的人能给我一些启发。
1 个回答
1
我搞明白了。
from win32com.client import GetObject
def Int2IP(ipnum):
o1 = int(ipnum / 16777216) % 256
o2 = int(ipnum / 65536) % 256
o3 = int(ipnum / 256) % 256
o4 = int(ipnum) % 256
return '%(o4)s.%(o3)s.%(o2)s.%(o1)s' % locals()
objWMI = GetObject('winmgmts:\\\\.\\root\\WMI').InstancesOf('MSiSCSI_PortalInfoClass')
for obj in objWMI:
for p in obj.PortalInformation:
print str(p.port) + ' | ' + Int2IP(p.ipaddr.IpV4Address) + '\n')
不过挺奇怪的,它把IP地址保存成了一个没有格式的数字……