【问题标题】:Collect mac adresss in an array an found a specific value in this array在一个数组中收集mac地址,并在这个数组中找到一个特定的值
【发布时间】:2017-12-17 17:03:47
【问题描述】:

我是初学者,需要您的帮助。 我正在尝试使用以下函数在数组中收集客户端的 MAC 地址。先前定义的特定 MAC 地址应检入数组,如果找到则保存在变量中。

function WbemQuery(WbemServices: Variant; Query: string): Variant;
var
  WbemObjectSet: Variant;
begin
  Result := Null;
  WbemObjectSet := WbemServices.ExecQuery(Query);
  if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
  begin
    Result := WbemObjectSet.ItemIndex(0);
  end;
end;

procedure CollectInformation;
var
  Query: string;
  WbemLocator, WbemServices: Variant;
  ComputerSystem, OperatingSystem, Processor, NetworkAdapters, NetworkAdapter: Variant;
  IPAddresses: array of string;
  I, I2: Integer;
begin
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices := WbemLocator.ConnectServer('.', 'root\CIMV2');

  Query :='SELECT IPEnabled, IPAddress, MACAddress FROM Win32_NetworkAdapterConfiguration';
  NetworkAdapters := WbemServices.ExecQuery(Query);
  if not VarIsNull(NetworkAdapters) then
  begin
    for I := 0 to NetworkAdapters.Count - 1 do
    begin
      NetworkAdapter := NetworkAdapters.ItemIndex(I);
      if (not VarIsNull(NetworkAdapter.MACAddress)) and NetworkAdapter.IPEnabled then
      begin
        Log(Format('Adapter %d MAC=%s', [I, NetworkAdapter.MACAddress]));
        if not VarIsNull(NetworkAdapter.IPAddress) then
        begin
          IPAddresses := NetworkAdapter.IPAddress;
          for I2 := 0 to GetArrayLength(IPAddresses) - 1 do
          begin
            Log(Format('Adapter %d IP %d=%s', [I, I2, IPAddresses[I2]]));
          end;
        end;
      end;
    end;
  end;
end;

感谢您的帮助 问候


我在 Windows 命令行上执行此操作时得到以下列表:powershell -command Get-WmiObject -Query 'select * from Win32_NetworkAdapterConfiguration'

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : RasSstp
Description      : WAN Miniport (SSTP)
Index            : 0

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : RasAgileVpn
Description      : WAN Miniport (IKEv2)
Index            : 1

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : Rasl2tp
Description      : WAN Miniport (L2TP)
Index            : 2

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : PptpMiniport
Description      : WAN Miniport (PPTP)
Index            : 3

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : RasPppoe
Description      : WAN Miniport (PPPOE)
Index            : 4

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : NdisWan
Description      : WAN Miniport (IPv6)
Index            : 5

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : NdisWan
Description      : WAN Miniport (Network Monitor)
Index            : 6

DHCPEnabled      : True
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : e1express
Description      : Intel(R) 82566DM-2-Gigabit-Netzwerkverbindung
Index            : 7

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : NdisWan
Description      : WAN Miniport (IP)
Index            : 8

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : tunnel
Description      : Microsoft-ISATAP-Adapter
Index            : 9

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : AsyncMac
Description      : RAS Async Adapter
Index            : 10

DHCPEnabled      : True
IPAddress        : {192.168.178.65, fe80::39c2:13d2:50ce:82c1, 2a02:8070:d296:f900:39c2:13d2:50ce:82c1, 2a02:8070:c1a8:aa00:ad48:fe3a:543c:1bc...}
DefaultIPGateway : {192.168.178.1, fe80::2665:11ff:fe2b:3ddc}
DNSDomain        : fritz.box
ServiceName      : netr7364
Description      : AirPlus G DWL-G122-Drahtlos-USB-Adapter(rev.C)
Index            : 11

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : tunnel
Description      : Microsoft-Teredo-Tunneling-Adapter
Index            : 12

DHCPEnabled      : False
IPAddress        :
DefaultIPGateway :
DNSDomain        :
ServiceName      : tunnel
Description      : Microsoft-ISATAP-Adapter
Index            : 13

【问题讨论】:

  • "如果找到则保存在变量中" - 你想在变量中保存什么?真/假 = 找到/未找到?要不然是啥?为什么要将 MAC 地址保存在数组中?除了在列表中搜索“先前定义的地址”之外,您想对它们做任何事情吗?
  • 你试图编辑我的答案,而不是评论。你的帖子是:你好,对不起我的英语我仍然不明白如何使用上面的函数来确定我的 Macadress。例如,我的电脑有三个 nic,地址如下(nic01=XXX,nic02=YYY,nic03=ZZZ)。如何将指定的 Mac 地址例如 nic02 保存在变量 (myVar) 中,以便最后 myVar = YYY.
  • 那不是,你有什么要求!您的问题是关于“收集 MAC 地址数组”。我很确定你不需要任何数组,因为它没有任何意义。因此,我在第一条评论中提出了问题。你从来没有回应过!你显然有XY problem。因此,请编辑您的问题以询问您需要什么,而不是询问您认为您需要以实现您真正需要的内容。
  • 如果您在 Windows 命令行上执行此操作会得到什么:powershell -command "Get-WmiObject -Query 'select * from Win32_NetworkAdapterConfiguration'"
  • 对不起,如果我不准确。

标签: inno-setup


【解决方案1】:

这个函数检查系统是否有指定的MAC:

function CheckMAC(MAC: string): Boolean;
var
  Query: string;
  WbemLocator, WbemServices: Variant;
  NetworkAdapters, NetworkAdapter: Variant;
  I: Integer;
begin
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices := WbemLocator.ConnectServer('.', 'root\CIMV2');

  Result := False;
  Query := 'SELECT MACAddress FROM Win32_NetworkAdapterConfiguration';
  NetworkAdapters := WbemServices.ExecQuery(Query);
  if not VarIsNull(NetworkAdapters) then
  begin
    for I := 0 to NetworkAdapters.Count - 1 do
    begin
      NetworkAdapter := NetworkAdapters.ItemIndex(I);
      if not VarIsNull(NetworkAdapter.MACAddress) then
      begin
        Log(Format('Adapter %d MAC=%s', [I, NetworkAdapter.MACAddress]));
        if NetworkAdapter.MACAddress = MAC then
        begin
          Result := True;
          Break;
        end;
      end;
    end;
  end;
end;

你可以像这样使用它:

MAC := GetMACAddress;
if CheckMAC(MAC) then
begin
  Log(Format('Found MAC %s', [MAC]));
end
  else
begin
  Log(Format('MAC %s not found', [MAC]));
end;

(其中GetMACAddress 是您的外部函数)

【讨论】:

  • 我正在尝试根据函数 CheckMac (MAC) 的返回值设置变量 EntValue01,如下所示。它没有做。可以通过这种方式设置这个变量吗? MAC := '00:19:5b:7b:3b:7d';如果 CheckMAC(MAC) 则开始 EntValue01 :='00195b7b3b7d'; 'end else begin EntValue01 :='xxx';结尾;感谢您的帮助。
  • 这对我有用。 “它没有做”非常模糊。
猜你喜欢
  • 2016-08-29
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多