所以我将很快解释env: 需要使用Powershell 4.0的Win2k8服务器
我想获得一些使用SNMP的信息(所以打印机类型和打印机MAC地址):
$SNMP = new-object -ComObject olePrn.OleSNMP
$SNMP.open($P_IP,"public",2,3000)
$PType = $SNMP.get(".1.3.6.1.2.1.25.3.2.1.3.1")
$PMac = $SNMP.get(".1.3.6.1.2.1.2.2.1.6.2")
echo $PType
echo $PMac
因此,输出看起来像这样(作为示例):
$ PType = HP Officejet Pro 251dw打印机
$ PMac =ÓÁÔ*
所以,首先,我开始检查,如果我使用了正确的OID - 使用SnmpSoft公司的命令行工具。在那里,输出效果很好:
OID = OID = .1.3.6.1.2.1.2.2.1.6.2
类型=八位组
值= A0 D3 C1 D4 2A 95 .... *。
好吧,所以我开始检查,这个OID值有什么样的数据类型:它是八位字符串。在接下来的步骤中,我开始寻找可能性,如何将这个八位字节串值转换为一些可读的十六进制 - 直到现在没有任何进展。我试图通过这种方式将其转换为字节:
$bytes = [System.Text.Encoding]::Unicode.GetBytes($PMac)
[System.Text.Encoding]::ASCII.GetString($bytes)
echo $bytes
但输出让我很困惑
160 0 211 0 193 0 212 0 42 0 34 32
尝试解释此输出但没有任何成功。谷歌不能再帮助我了,因为我也不了解,搜索的方式或内容。
所以我在这里并希望得到一些帮助或建议,我如何将此查询的输出更改为可读的内容。
答案 0 :(得分:2)
这是编码问题。
1.3.6.1.2.1.2.2.1.6 is the interface physical address。所以我希望该值是接口的MAC地址。您的命令行结果以A0-D3-C1开头,它是HP MAC address range,因此它是一致的。您的打印机MAC地址必须是A0 D3 C1 D4 2A 95?你没有说明,所以你让我猜不到。
我怀疑$PMac
应该是[byte[]]
(字节数组),但输出将其转换为字符串,而PowerShell的输出系统将其解释为字符。
示例:
PS C:\> [byte[]]$bytes = 0xa0, 0xd3, 0xc1, 0xd4, 0x2a, 0x95
PS C:\> [System.Text.Encoding]::Default.GetString($bytes)
ÓÁÔ*•
你可能需要这样做:
$MAC = [System.Text.Encoding]::Default.GetBytes($PMac) | ForEach-Object {
$_.ToString('X2')
}
$MAC = $MAC -join '-'
您可能希望使用[System.Text.Encoding]::ASCII.GetBytes($PMac)
,因为原始SNMP应该使用ASCII编码。我不知道olePrn.OleSNMP使用的是什么。
您也可以查看其中一个SNMP PowerShell modules on the PowerShell Gallery。这比在PowerShell中处理COM对象要容易得多。
我也遇到了this page on #SNMP's handling of OCTET STRING
。 #SNMP是.Net SNMP库,OCTET STRING
似乎是此OID的基础类型。该页面描述了使用.Net处理此特定对象类型的一些困难。您还可以使用此库在PowerShell中开发自己的Cmdlet; it's available through NuGet
答案 1 :(得分:0)
您获得的输出几乎是您预期的MAC地址
对于十六进制160 0 211 0 193 0 212 0 42 0 34 32
160
, 0xA0
为十进制
211
是0xD3
193
是0xC1
在Unicode.GetBytes调用期间,可能已添加每个字节之间的附加零,我认为您不需要使用它。
我怀疑你需要将$PMac
读作一个字节数组,然后对每个字节进行十六进制字符串转换。这可能不是最优雅的,但可能会完成工作:
[byte[]] $arrayofBytes = @(160,211,193)
[string] $hexString
foreach ($b in $arrayofBytes) {
$HexString += [convert]::toString($b,16)
$HexString += ' '
}