NSIS调用脚本时硬盘序列号不同

0 投票
1 回答
669 浏览
提问于 2025-04-18 04:19

我遇到了一个很奇怪的错误。我有一个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应用,看看会发生什么...

撰写回答