考虑以下 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批准?