Powershell:将八位字符串(SNMP)输出转换为十六进制(Mac地址)

时间:2018-02-12 14:24:28

标签: powershell snmp printers octetstring

所以我将很快解释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

尝试解释此输出但没有任何成功。谷歌不能再帮助我了,因为我也不了解,搜索的方式或内容。

所以我在这里并希望得到一些帮助或建议,我如何将此查询的输出更改为可读的内容。

2 个答案:

答案 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为十进制

2110xD3

1930xC1

在Unicode.GetBytes调用期间,可能已添加每个字节之间的附加零,我认为您不需要使用它。

我怀疑你需要将$PMac读作一个字节数组,然后对每个字节进行十六进制字符串转换。这可能不是最优雅的,但可能会完成工作:

[byte[]] $arrayofBytes = @(160,211,193)

[string] $hexString
foreach ($b in $arrayofBytes) {
    $HexString += [convert]::toString($b,16)
    $HexString += ' '
}