Выполните итерацию SWbemObjectSet в Windows XP и настройке Inno

У меня проблема с получением списка MAC-адресов в Windows XP из программы установки Inno Setup.

Я пытаюсь написать некоторый код (взял его с Get MAC-адрес в 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 и я не могу перебрать SWbemObjectSet с for each obj in objset синтаксис...

Я тоже пытался получить SWbemObject с Item метод:

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

но возвращает ошибку

SWbemObjectSet: не найден

Кто-нибудь может мне помочь? Есть ли у этой проблемы какое-то решение?

1 ответ

Решение

Да, вы должны были бы реализовать IEnumVariant, Не уверен, что это возможно с Pascal Script.


Использование SWbemObjectSet.Item метод такой:

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 

перенаправить в файл и прочитать его.

См. Как получить вывод программы Exec в Inno Setup?

Другие вопросы по тегам