1

所以我将简要解释一下环境:需要在带有 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

试图解释这个输出没有任何成功。谷歌不能再帮助我了,因为我也慢慢地不明白如何搜索或搜索什么。

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

4

2 回答 2

4

这是一个编码问题。

1.3.6.1.2.1.2.2.1.6 是接口物理地址。所以我希望该值是接口的 MAC 地址。您的命令行结果以 A0-D3-C1 开头,这是一个HP MAC 地址范围,因此是一致的。您的打印机 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 使用什么。

您还可以查看PowerShell Gallery 上的 SNMP PowerShell 模块之一。这比在 PowerShell 中处理 COM 对象要容易得多。

我还看到了这个关于#SNMP 处理OCTET STRING. #SNMP 是一个 .Net SNMP 库,并且OCTET STRING似乎是此 OID 的基础类型。该页面描述了使用 .Net 处理这种特定对象类型的一些困难。您还可以使用此库在 PowerShell 中开发您自己的 Cmdlet;它可以通过 NuGet 获得

于 2018-02-12T15:34:49.083 回答
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 += ' '
}
于 2018-02-12T15:34:19.373 回答