Выполните итерацию 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
перенаправить в файл и прочитать его.