当NSIS调用脚本时,硬盘驱动器序列号不同

时间:2014-04-26 05:55:34

标签: python installer nsis

我发生了一个非常奇怪的错误。我有一个Python脚本打印出用户的硬盘序列号。

如果我在空闲时运行此脚本(或只是双击脚本),它会将我的硬盘驱动器序列号打印为: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 :(得分:0)

在NSIS中使用WMI有几种方法,只需在NSIS wiki和论坛上进行搜索。

我的猜测是WPython是翻转半字节的原因。仅仅因为NSIS是父进程,python部分会发生变化。您可以尝试将Exec '"cmd.exe" /k'添加到安装程序,然后从那里运行WPython应用程序,看看会发生什么......