我发生了一个非常奇怪的错误。我有一个Python脚本打印出用户的硬盘序列号。
如果我在空闲时运行此脚本(或只是双击脚本),它会将我的硬盘驱动器序列号打印为:09sd01u4ctzn
。
但如果我的NSIS安装程序运行相同的Python脚本,则会将我的硬盘驱动器序列号打印为:90ds104utcnz
。即,每两个字符相反(而不是09
,其90
等等。
你知道为什么会这样吗?
一些重要信息:
09sd01u4ctzn
)所以我不认为提升特权是原因。 这是我简单的python脚本:
import wmi
def get_hard_drive_serial():
c = wmi.WMI()
for item in c.Win32_PhysicalMedia():
if "PHYSICALDRIVE" in str(item.Tag).upper():
return str(item.SerialNumber)
return None
print "HD Serial as Regular User: " + get_hard_drive_serial()
注意:显然我没有导出调用python脚本的NSIS安装程序(因为并非所有windows用户都安装了python)。所以我从该python脚本创建一个.exe并让NSIS安装程序调用它。我需要一个外部.exe,因为NSIS没有简单的方法来确定用户硬盘驱动器序列号。
-------------------------------------------- -----
编辑:
所以我测试了一个简单的NSIS脚本和python脚本。 NSIS脚本使用EXECWAIT
调用python脚本。正如你可以看到序列号。当NSIS调用脚本时,与自己调用脚本或通过C#程序调用脚本(我已经测试过它)不同。
任何想法到底是怎么回事?
InstallDir "abc"
Name "def"
OutFile "def.exe"
Section
DetailPrint "Hello World"
ExecWait '"cmd.exe" /k' # Then type GetMACAddress.py in cmd (make sure python script is in same dir as the installer)
SectionEnd
GetMACAddress.py
import wmi
c = wmi.WMI()
for item in c.Win32_PhysicalMedia():
if "PHYSICALDRIVE" in str(item.Tag).upper():
print item.Tag + ", " + item.SerialNumber
raw_input("Pause")
答案 0 :(得分:0)
在NSIS中使用WMI有几种方法,只需在NSIS wiki和论坛上进行搜索。
我的猜测是WPython是翻转半字节的原因。仅仅因为NSIS是父进程,python部分会发生变化。您可以尝试将Exec '"cmd.exe" /k'
添加到安装程序,然后从那里运行WPython应用程序,看看会发生什么......