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

Posted

技术标签:

【中文标题】NSIS调用脚本时硬盘序列号不同【英文标题】:Hard Drive Serial Number Is Different When NSIS Calls Script 【发布时间】:2014-04-26 05:55:34 【问题描述】:

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

如果我在空闲状态下运行此脚本(或直接双击脚本),它会将我的硬盘序列号打印为:09sd01u4ctzn

但是如果我的 NSIS 安装程序运行相同的 Python 脚本,它会将我的硬盘驱动器序列号打印为:90ds104utcnz。即,每2个字符颠倒(而不是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】:

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

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

【讨论】:

感谢您的建议。我确信这是一个 NSIS 特定问题(或 NSIS 运行的模式 - 64 位/32 位模式等)。请查看我的编辑并自己运行它。

以上是关于NSIS调用脚本时硬盘序列号不同的主要内容,如果未能解决你的问题,请参考以下文章

用JavaScript写代码将硬盘序列号从16进制字符串转换为ASCII字符串,兼谈EditPlus和Edge浏览器对JavaScript脚本支持的一点差别

硬盘序列号在哪看

国产电脑linux系统如何查看硬盘序列号

如何在 OS X 上获取 USB 驱动器的硬盘驱动器序列号?

硬盘序列号读取工具-硬盘序列号查询软件推荐

硬盘序列号是否只有一个?