在Windows XP和Inno Setup中迭代SWbemObjectSet

在Windows XP和Inno Setup中迭代SWbemObjectSet

问题描述:

从Inno Setup安装程序中获取Windows XP中的MAC地址列表时出现问题。在Windows XP和Inno Setup中迭代SWbemObjectSet

我尝试写一些代码(把它从Get MAC address in Inno Setup):

function GetMacAddressesList(out List: Array of String): Integer; 
var 
    I: Integer; 
    WQLQuery: string; 
    WbemLocator: Variant; 
    WbemServices: Variant; 
    WbemObject: Variant; 
    WbemObjectSet: Variant; 
begin 
    Result := 0; 

    WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    WbemServices := WbemLocator.ConnectServer('localhost', 'root\cimv2'); 

    WQLQuery := 'Select * from Win32_NetworkAdapterConfiguration where IPEnabled=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 
       List[I] := WbemObject.MACAddress; 
       StringChange(List[i], ':', ''); 
       StringChange(List[I], '-', ''); 
      end; 
     end; 
    end; 
end; 

而且我有ItemIndex方法的问题。它只出现在Windows Vista中。我怎么能在XP上做到这一点?我真的不知道,因为我在互联网上找到的每个解决方案都行不通。可能是因为Inno Setup的库有没有这样的类型IEnumVariant,我不能SWbemObjectSetfor each obj in objset语法遍历...

我也试图让SWbemObjectItem方法:

WbemObject := WbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(I)); 

但它返回错误

SWbemObjectSet:找不到

任何人都可以帮助我吗?这个问题有一些解决办法吗

是的,你将不得不实施IEnumVariant。不知道这是可能的Pascal脚本。


使用SWbemObjectSet.Item method的是这样的:

WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
WbemServices := WbemLocator.ConnectServer('localhost', 'root\cimv2'); 

WQLQuery := 'Select * from Win32_NetworkAdapterConfiguration'; 
WbemObjectSet := WbemServices.ExecQuery(WQLQuery); 
if not VarIsNull(WbemObjectSet) then 
begin 
    for I := 0 to WbemObjectSet.Count - 1 do 
    begin 
    WbemObject := WbemObjectSet.Item(Format('Win32_NetworkAdapterConfiguration=%d', [I])); 
    if WbemObject.IPEnabled then 
    begin 
     Log(WbemObject.MACAddress); 
    end; 
    end; 
end; 

但似乎没有这种方法适用于Windows XP。


可能的解决方法是执行

wmic nicconfig get MACAddress 

重定向到文件和读取。

How to get an output of an Exec'ed program in Inno Setup?

+0

虽然,现在我看你尝试'.Item()' - 它是可以在XP?如果是这样,比这是正确的语法:'WbemObjectSet.Item('Win32_NetworkAdapterConfiguration ='+ IntToStr(I));' –

+0

'WbemObjectSet.Item('Win32_NetworkAdapterConfiguration ='+ IntToStr(I));'不起作用...它使文本上升到MsgBox:SWbemObjectSet:未找到 –

+0

确保删除了'IPEnabled = true'过滤器,只有'I'与'Index'匹配的方式 - 请参阅我编辑的答案。 –