NSIS调用脚本时硬盘序列号不同
我遇到了一个很奇怪的错误。我有一个Python脚本,它可以打印出用户硬盘的序列号。
如果我在idle环境中运行这个脚本(或者直接双击脚本),它会打印出我的硬盘序列号,像这样:09sd01u4ctzn
。
但是,如果我的NSIS安装程序运行同样的Python脚本,它打印出的硬盘序列号却是:90ds104utcnz
。也就是说,每两个字符的位置都反了(比如09
变成了90
,依此类推)。
你知道为什么会这样吗?
一些重要的信息:
- NSIS安装程序以管理员权限运行
- 我的笔记本电脑是64位的
- 我使用的是Python 2.7
- 如果我以管理员权限运行Python脚本(通过Idle),它仍然会打印出相同的序列号(
09sd01u4ctzn
),所以我觉得管理员权限不是原因。 - 可能的原因是WPython.exe以UTF-8(或非ASCII)格式运行?
- 也许NSIS安装程序是64位的,这影响了序列号的解释?
这是我的简单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")
1 个回答
0
在NSIS中使用WMI有好几种方法,你可以在NSIS的维基和论坛上搜索一下。
我猜测是WPython导致了数据的反转。因为NSIS是父进程,所以Python部分不太可能会有什么变化。你可以试着在你的安装程序中添加Exec '"cmd.exe" /k'
,然后从那里运行WPython应用,看看会发生什么...