SNMP 响应被 PowerShell 破坏?

2024-05-09

考虑以下 PowerShell 代码:

$SNMP = New-Object -COMObject OLEPrn.OLESNMP
$SNMP.Open("10.178.230.105", "public", 2, 3000)
$MACAddress = $SNMP.Get(".1.3.6.1.2.1.2.2.1.6.1")
$SNMP.Close()

在此刻,$MACAddress应该包含一个六字节字符串,当解码为十六进制时,应该是打印机的 MAC 地址。这是一台 Xerox 打印机,前两个字节应该是0x9C 0x93。然而,

for ($i = 0; $i -lt 6; $i++) {
    "{0}: {1:X2}" -f $MACAddress[$i],[BYTE]$MACAddress[$i]
}

前两个字节抛出错误:

Cannot convert value "œ" to type "System.Byte". Error: "Value was either too large or too small for an unsigned byte."
At Z:\Scripts\Powershell\SNMPscratch.ps1:10 char:4
+    "{0}: {1:X2}" -f $MACAddress[$i],[BYTE]$MACAddress[$i]
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastIConvertible

Cannot convert value "“" to type "System.Byte". Error: "Value was either too large or too small for an unsigned byte."
At Z:\Scripts\Powershell\SNMPscratch.ps1:10 char:4
+    "{0}: {1:X2}" -f $MACAddress[$i],[BYTE]$MACAddress[$i]
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastIConvertible

N: 4E
s: 73
-: 2D
|: 7C

(最后四个字节已正确转换。)

如果我投射到[int]相反,将十六进制值字段改为四个字符:

for ($i = 0; $i -lt 6; $i++) {
    "{0}: {1:X4}" -f $MACAddress[$i],[int]$MACAddress[$i]
}

我没有收到任何错误,但是...

œ: 0153
“: 201C
N: 004E
s: 0073
-: 002D
|: 007C

...前两个“字节”是not 0x9C 0x93,他们应该是这样的。

出了什么问题、出在哪里以及如何修复或解决它?

补充信息:

我认为也许编码是问题,并尝试了

[byte[]]$MACAddress = ([System.Text.Encoding]::ASCII).GetBytes($SNMP.Get(".1.3.6.1.2.1.2.2.1.6.1"))

这避免了引发错误,但生成了

63: 003F
63: 003F
78: 004E
115: 0073
45: 002D
124: 007C

这是also错误 - 但这使它看起来像问题may be in $SNMP.Get(),而不是我正在做的任何事情。如果是这样,除了使用第三方库之外,还有其他选择吗?我们的信息安全人员会使用第三方库not批准?


这对我有用,“[System.Text.Encoding]::Default.GetBytes()”。尽管如果 mac 地址以 0 开头,.Get() 返回一个空字符串。 Net-SNMP snmpwalk Windows 二进制文件始终存在旧版本。

# snmpmac.ps1

param($PrinterAddress)

$oid = '.1.3.6.1.2.1.2.2.1.6.1' # mac address

$SNMP = New-Object -ComObject olePrn.OleSNMP

foreach($printer in $PrinterAddress) {
  $SNMP.Open($Printer, "public", 2, 3000)

  $string = $SNMP.Get($oid)

  $MacAddress = ([System.Text.Encoding]::Default.GetBytes($string) |
    % tostring X2) -join '-'
  [pscustomobject]@{Name = $Printer; MacAddress = $MacAddress}
  $SNMP.Close()
}

.\snmpmac a-cp2,a-mfp1,a-mfp2,a-mfp3,a-mfp4

Name        MacAddress
----        ----------
a-cp2
a-mfp1      58-38-79-23-AE-54
a-mfp2      58-38-79-23-AD-E8
a-mfp3      58-38-79-23-AE-70
a-mfp4      58-38-79-23-B0-B0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SNMP 响应被 PowerShell 破坏? 的相关文章

随机推荐