【发布时间】:2020-08-28 17:30:38
【问题描述】:
我目前正在尝试使用 python3.8 获取保存在我的设备上的 MAC 地址,但出现以下错误:
在位置 3 的 fromhex() arg 中找到非十六进制数
我知道这是一个解码错误。 这是代码:
def val2addr(val):
if val:
address = ""
for ch in val:
if(not int(ch)):
address += ':'.join(format(s, '02x') for s in bytes.fromhex(str(ch))).replace("\0", "")
address = address.strip(' ').replace(' ', ':')[0: 17]
else:
address += str(ch)
return address + ':'.join(format(s, '02x') for s in bytes.fromhex(str(ch))).replace("\0", "")
return "[!] No MAC [!]"
def print_networks():
net = u"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"+\
"\\NetworkList\\Signatures\\Unmanaged"
print(str(HKEY_LOCAL_MACHINE) + net)
key = OpenKey(HKEY_LOCAL_MACHINE, net, 0, (KEY_WOW64_64KEY + KEY_READ))
print('\n[*] Networks You have Joined:\n')
for network in range(100):
try:
guid = EnumKey(key, network)
netkey = OpenKey(key, str(guid))
mac = QueryValueEx(netkey, 'DefaultGatewayMac')[0]
mac = val2addr(mac)
network_name = QueryValueEx(netkey, 'Description')[0]
print("[+] Network Name: " + network_name + "[+] Mac: " + mac)
CloseKey(netkey)
except Exception as e:
print(e)
break
def main():
print_networks()
if __name__ == '__main__':
main()
我几乎尝试了所有可以在这里或互联网上找到的解决方案,但没有一个对我有用!
提前感谢您的帮助!
【问题讨论】:
-
你能举一个输入和预期输出的例子吗?
-
不需要输入。我有第二种方法是使用 winreg 从注册表中“获取”信息。上面的错误是唯一的输出
-
“输入”是指您作为“val”传递给此函数的参数。如果您不确定该输入是什么样的,那可能就是您难以让事情正常工作的原因! :) 一种快速的调试方法是将
print(val)添加到此函数的开头,以便在引发错误之前将其转储到控制台。 -
我试了一下运行它并得到了一个
Access is denied。在您的环境中接收到的相关val2addr函数的val的单个示例比查看print_networks代码更有助于构建最小的可重现示例。 -
是的,你应该以管理员身份运行文本编辑器/空闲
标签: python registry mac-address