Powershell SNMP 转换 IP 地址:获取错误值

Powershell SNMP converting IP Address: Getting wrong value

如何正确地将通过 OleSNMP 获得的 IP 地址转换为可用值?

我正在尝试编写一个 Powershell 脚本来使用 SNMP 查询设备,然后显示数据。 Stuff 适用于简单类型,但我在 IP 地址(和 MAC 地址,但现在让我们坚持使用 IP)方面遇到问题

这是我的(简化为问题space):

param ($ipaddr='10.1.128.114', $community='Public')

$snmp = New-Object -ComObject oleprn.OleSNMP
$snmp.open($ipaddr, $community)

$result = $snmp.get(".1.3.6.1.2.1.4.20.1.1.10.1.128.114")
$enc = [system.Text.Encoding]::ASCII
$bytes = $enc.GetBytes($result)
write-host( "bytes:" + $bytes)

输出:

bytes:10 1 63 114

如我所料

bytes:10 1 128 114

相比之下,snmp-get 输出:

$ snmpget 10.1.128.114 -c Public -v2c -On .1.3.6.1.2.1.4.20.1.1.10.1.128.114
.1.3.6.1.2.1.4.20.1.1.10.1.128.114 = IpAddress: 10.1.128.114

是的,我意识到在我的最终脚本中我将不得不走 table 而不是使用直接的“get”,但我需要先修复我的解析。

如评论中所述,ASCII编码将其有效范围之外的字符替换为问号?,即ASCII字符63。

有关 ASCIIEncoding.GetBytes 的文档中提供了更多信息 - 搜索“?”你会发现:

ASCIIEncoding does not provide error detection. Any Unicode character greater than U+007F is encoded as the ASCII question mark ("?").

请注意,0x7F 是 127,因此由于 [char] 128 超出此范围,因此当您调用 GetBytes.

您的代码基本上是这样做的:

$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)

$encoding = [System.Text.Encoding]::ASCII
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 63 (i.e. "?")
# 114

您需要使用编码器将高于 0x7F 的字符转换为等效字节 - iso-8859-1 之类的东西似乎可以工作:

$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)

$encoding = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 128
# 114