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脚本支持的一点差别