我是 Inno setup 的新手,
我有一个问题
当我从 cmd 行执行“getmac”命令时,我得到了以下输出。我有多个 mac 地址(我在我的机器上安装了 VM Virtual player)

当我卸载 VM 虚拟播放器并执行相同的命令时,我得到了不同的输出,以下是它的屏幕截图。

我的问题是,
1.在创建用于MAC验证的EXE文件时,我需要在多个mac地址中考虑哪个mac地址。
2.安装时INNO Setup将从本地机器获取MAC地址,并将其与我们在使用mac地址创建EXE文件时给出的mac地址进行比较。在这种情况下,如果机器有多个 mac 地址,Inno Setup将比较哪个 mac 地址。
有没有人知道如何解决这个问题。**
提前致谢 :-)
如果您只需要查找永久 MAC 地址,则应首先过滤物理网卡:
wmic nic where "PhysicalAdapter='True'"
Run Code Online (Sandbox Code Playgroud)
获得该列表后,您会发现某些虚拟接口仍然显示为物理接口。过滤它们的一个好方法是检查它们的设备路径,因为只有真正的网卡连接到 PCI 总线。这也适用于 USB 总线,但由于这些卡不是永久连接的,因此您可以安全地忽略它们。
检索设备路径与 MAC 地址的一个好方法是
wmic nic where "PhysicalAdapter='True'" get MACAddress,PNPDeviceID
Run Code Online (Sandbox Code Playgroud)
这会输出类似:
MACAddress PNPDeviceID
E0:94:67:XX:XX:XX PCI\VEN_8086&DEV_3165&SUBSYS_40108086&REV_81\E094XXXXXXXXXXXXXX
D8:CB:8A:XX:XX:XX PCI\VEN_1969&DEV_E0A1&SUBSYS_115A1462&REV_10\FFEFXXXXXXXXXXXXXX
E0:94:67:XX:XX:XX BTH\MS_BTHPAN\6&5XXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,您可以看到两个“真正的”以太网接口(wifi 和 eth)和一个蓝牙设备。只需按关键字 PCI 进行过滤,您就可以获得非可变 MAC 地址列表。您可以通过 inno setup Turbo pascal 函数或通过 cmd 进行过滤。
最终结果可能如下所示:
wmic nic where "PhysicalAdapter='True'" get MACAddress,PNPDeviceID | findstr "PCI"
Run Code Online (Sandbox Code Playgroud)
如果您只想显示 MAC 地址,您可以将整个内容包装在批处理脚本中(IMO 不是最好的主意,因为它是一种混乱的脚本语言):
for /f "delims=" %%i in ('wmic nic where "PhysicalAdapter='True'" get MacAddress^,PNPDeviceID ^| findstr PCI') do (set res=%%i && echo %res:~0,17%)
Run Code Online (Sandbox Code Playgroud)
请注意^逗号和竖线之前的符号,它的作用类似于转义字符,因此 cmd 不会将它们视为小字符。
还有一种使用 Pascal 脚本的 Inno Setup 方法。这是我修改过的(原始版本此处),仅列出物理永久接口的 MAC 地址。变量列表中的结果:
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('localhost', 'root\cimv2');
WQLQuery := 'Select MACAddress,PNPDeviceID from Win32_NetworkAdapter where PhysicalAdapter=true';
WbemObjectSet := WbemServices.ExecQuery(WQLQuery);
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
Result := WbemObjectSet.Count;
SetArrayLength(List, WbemObjectSet.Count);
for I := 0 to WbemObjectSet.Count - 1 do
begin
WbemObject := WbemObjectSet.ItemIndex(I);
if not VarIsNull(WbemObject) then
begin
if pos('PNP', WbemObject.PNPDeviceID) = 1 then
begin
List[I].MacAddress := WbemObject.MACAddress;
end;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
请注意,此 pascal 脚本仅适用于 win7+。
希望这些解决方案之一适合您。
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |