多个网络适配器和单个网络适配器的 Inno Setup mac id 验证

Sra*_*van 6 inno-setup

我是 Inno setup 的新手,

我有一个问题

当我从 cmd 行执行“getmac”命令时,我得到了以下输出。我有多个 mac 地址(我在我的机器上安装了 VM Virtual player) 卸载 VM 播放器前 mac 地址命令的屏幕截图

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

卸载VM播放器后mac地址命令截图

我的问题是,

1.在创建用于MAC验证的EXE文件时,我需要在多个mac地址中考虑哪个mac地址。

2.安装时INNO Setup将从本地机器获取MAC地址,并将其与我们在使用mac地址创建EXE文件时给出的mac地址进行比较。在这种情况下,如果机器有多个 mac 地址Inno Setup将比较哪个 mac 地址。

  1. 在我的情况下,我使用 Inno setup 和我的 mac 地址创建了 EXE 文件,在创建 exe 文件时,我的机器有一个 mac 地址,后来我安装了 VM 播放器,然后我的机器有几个 mac 地址,我在安装后尝试安装VM palyer Inno setup 正在考虑新创建的 MAC ADDRESS,并说 MAC 地址无效 **

有没有人知道如何解决这个问题。**

提前致谢 :-)

Ors*_*ong 2

如果您只需要查找永久 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+。

希望这些解决方案之一适合您。