我正在尝试使用Python解密存储在配置文件xml文件中的Windows无线密码。我遇到了一个blog post,给出了一个如何使用Python的win32crypt模块调用Windows CryptUnprotectData的示例。我的问题是我收到Key not valid for use in specified state
错误,需要使用LocalSystem运行它。
即使您以管理员身份运行cmd.exe,也会收到该错误。在这里您需要了解一些关于Windows的信息,作为Windows n00b,我不知道:LocalSystem帐户与管理员权限不同。要使用LocalSystem帐户运行cmd.exe,您需要安装名为PsTools的Microsoft程序包。在PsTools里面有一个名为PsExec的程序,它有点像un * x上的sudo。只需下载上面Microsoft TechNet页面底部链接的zip,然后将其解压缩到可以找到它的位置。
要使用PsExec,请以管理员身份打开cmd.exe(打开屏幕左下角的开始菜单,在搜索框中键入cmd.exe,然后按Ctrl + Shift + Enter以管理员身份运行它)。在打开的“用户帐户控制”对话框中单击“继续”。在打开的命令shell中,导航到解压缩PsTools的目录。现在运行“psexec.exe / s / i cmd.exe”。在您同意PsTools的EULA之后,PsTools应该打开一个新的cmd.exe shell窗口 以LocalSystem身份运行。
如果博客文章中没有使用psexec.exe
,是否可以解决此错误?也许使用CryptoPy或PyCrypto?
作为参考,我检索的加密密码是Windows Vista配置文件xml文件中的keyMaterial密钥。
我正在使用的代码:
import win32crypt
mykey='01000000D08C9DDF.....' # 308 characters long
binout = []
for i in range(len(mykey)):
if i % 2 == 0:
binout.append(chr(int(mykey[i:i+2],16)))
pwdHash=''.join(binout)
output = win32crypt.CryptUnprotectData(pwdHash,None,None,None,0)
print "hex:", "".join(["%02X" % ord(char) for char in output[1]])
print "ascii:", output[1]
提前致谢。
答案 0 :(得分:1)
如果您需要,不要求系统管理员为您提供LocalSystem权限吗?
顺便说一下,不要理会从十六进制到二进制的复杂转换。只是做:In [5]: '01000000D08C9DDF'.decode('hex')
Out[5]: '\x01\x00\x00\x00\xd0\x8c\x9d\xdf'