Вопрос WMI - как сделать вызов необходимой информации?

Xenium

Новичок
Всем привет, наткнулся на очень интересный скрипт.
Не могу понять как выводить из него информацию, например на странице инсталлятора в поле IP address \ TotalPhysicalMemory.
Прошу помощи в выводе данной информации)
Код:
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: Variant;
  NetworkAdapters, NetworkAdapter: Variant;
  IPAddresses: array of string;
  I, I2: Integer;
begin
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices := WbemLocator.ConnectServer('.', 'root\CIMV2');

  Query := 'SELECT TotalPhysicalMemory, UserName FROM Win32_ComputerSystem';
  ComputerSystem := WbemQuery(WbemServices, Query);
  if not VarIsNull(ComputerSystem) then
  begin
    Log(Format('TotalPhysicalMemory=%s', [ComputerSystem.TotalPhysicalMemory]));
    Log(Format('UserName=%s', [ComputerSystem.UserName]));
  end;

  Query := 'SELECT Caption FROM Win32_OperatingSystem';
  OperatingSystem := WbemQuery(WbemServices, Query);
  if not VarIsNull(OperatingSystem) then
  begin
    Log(Format('OperatingSystem=%s', [OperatingSystem.Caption]));
  end;

  Query := 'SELECT Name FROM Win32_Processor';
  Processor := WbemQuery(WbemServices, Query);
  if not VarIsNull(Processor) then
  begin
    Log(Format('Processor=%s', [Processor.Name]));
  end;

  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;
 
Последнее редактирование модератором:

Nemko

Дилетант
Модератор
Xenium, ни на что не претендую, нужно доработать:
Код:
[Setup]
AppName=Test
AppVersion=1.0
CreateAppDir=no
DisableWelcomePage=no

[Code]
const
  _Caption             = $10;
  _UserName            = $20;
  _Processor           = $30;
  _TotalPhysicalMemory = $40;
  _All_IpAddress       = $50;
  _IPAddress           = $60;
  _MACAddress          = $70;

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;

function CollectInformation(Param: DWORD): String;
var
  I, I2: Integer;
  Query, GetParam: String;
  IPAddresses: array of String;
  WbemLocator, WbemServices,
  ComputerSystem, OperatingSystem,
  Processor, NetworkAdapters, NetworkAdapter: Variant;
begin
  Result:= '';
  GetParam:= '';

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

  case Param of
    $10: begin
      Query:= 'SELECT Caption FROM Win32_OperatingSystem';
      OperatingSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(OperatingSystem) then
        GetParam:= OperatingSystem.Caption;
    end;
    $20: begin
      Query:= 'SELECT UserName FROM Win32_ComputerSystem';
      ComputerSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(ComputerSystem) then
        GetParam:= ComputerSystem.UserName;
    end;
    $30: begin
      Query:= 'SELECT Name FROM Win32_Processor';
      Processor:= WbemQuery(WbemServices, Query);
     if not VarIsNull(Processor) then
        GetParam:= Processor.Name;
    end;
    $40: begin
      Query:= 'SELECT TotalPhysicalMemory FROM Win32_ComputerSystem';
      ComputerSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(ComputerSystem) then
        GetParam:= ComputerSystem.TotalPhysicalMemory;
    end;
    $50: begin
      Query:= 'SELECT IPEnabled, IPAddress, MACAddress FROM Win32_NetworkAdapterConfiguration';
      NetworkAdapters:= WbemServices.ExecQuery(Query);

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

      if not VarIsNull(NetworkAdapters) then
      for i:= 0 to NetworkAdapters.Count - 1 do begin
        NetworkAdapter:= NetworkAdapters.ItemIndex(i);
          if (not VarIsNull(NetworkAdapter.MACAddress)) and NetworkAdapter.IPEnabled then begin
            if Param = $70 then GetParam:= GetParam + Format('Adapter %d MAC = %s', [i, NetworkAdapter.MACAddress]) + #13;
            if not VarIsNull(NetworkAdapter.IPAddress) then begin
              IPAddresses := NetworkAdapter.IPAddress;
              for I2:= 0 to GetArrayLength(IPAddresses) - 1 do begin
                if (I2 <> 1) and (Param <> $70) then GetParam:= GetParam + Format('Adapter %d = %s', [I, IPAddresses[I2]]) + #13;
            end;
          end;
        end;
      end;
    end;
    else Exit;
  end;
  Result:= GetParam;
end;

procedure InitializeWizard;
begin
  with WizardForm.WelcomeLabel2 do begin
    Font.Size:= Font.Size-2;
    Caption:= 'OS: ' + CollectInformation(_Caption) +#13+
              'User Name: ' + CollectInformation(_UserName) +#13+
              'Processor: ' + CollectInformation(_Processor) +#13+
              'Memory: ' + CollectInformation(_TotalPhysicalMemory) +#13#13+
              'All IP: ' + #13 + CollectInformation(_All_IpAddress) +#13#13+
              'Only IP: ' + #13 + CollectInformation(_IPAddress) +#13+
              'Only MAC: ' + #13 + CollectInformation(_MACAddress) +#13;
  end;
end;
 

Xenium

Новичок
Xenium, ни на что не претендую, нужно доработать:
Код:
[Setup]
AppName=Test
AppVersion=1.0
CreateAppDir=no
DisableWelcomePage=no

[Code]
const
  _Caption             = $10;
  _UserName            = $20;
  _Processor           = $30;
  _TotalPhysicalMemory = $40;
  _All_IpAddress       = $50;
  _IPAddress           = $60;
  _MACAddress          = $70;

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;

function CollectInformation(Param: DWORD): String;
var
  I, I2: Integer;
  Query, GetParam: String;
  IPAddresses: array of String;
  WbemLocator, WbemServices,
  ComputerSystem, OperatingSystem,
  Processor, NetworkAdapters, NetworkAdapter: Variant;
begin
  Result:= '';
  GetParam:= '';

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

  case Param of
    $10: begin
      Query:= 'SELECT Caption FROM Win32_OperatingSystem';
      OperatingSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(OperatingSystem) then
        GetParam:= OperatingSystem.Caption;
    end;
    $20: begin
      Query:= 'SELECT UserName FROM Win32_ComputerSystem';
      ComputerSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(ComputerSystem) then
        GetParam:= ComputerSystem.UserName;
    end;
    $30: begin
      Query:= 'SELECT Name FROM Win32_Processor';
      Processor:= WbemQuery(WbemServices, Query);
     if not VarIsNull(Processor) then
        GetParam:= Processor.Name;
    end;
    $40: begin
      Query:= 'SELECT TotalPhysicalMemory FROM Win32_ComputerSystem';
      ComputerSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(ComputerSystem) then
        GetParam:= ComputerSystem.TotalPhysicalMemory;
    end;
    $50: begin
      Query:= 'SELECT IPEnabled, IPAddress, MACAddress FROM Win32_NetworkAdapterConfiguration';
      NetworkAdapters:= WbemServices.ExecQuery(Query);

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

      if not VarIsNull(NetworkAdapters) then
      for i:= 0 to NetworkAdapters.Count - 1 do begin
        NetworkAdapter:= NetworkAdapters.ItemIndex(i);
          if (not VarIsNull(NetworkAdapter.MACAddress)) and NetworkAdapter.IPEnabled then begin
            if Param = $70 then GetParam:= GetParam + Format('Adapter %d MAC = %s', [i, NetworkAdapter.MACAddress]) + #13;
            if not VarIsNull(NetworkAdapter.IPAddress) then begin
              IPAddresses := NetworkAdapter.IPAddress;
              for I2:= 0 to GetArrayLength(IPAddresses) - 1 do begin
                if (I2 <> 1) and (Param <> $70) then GetParam:= GetParam + Format('Adapter %d = %s', [I, IPAddresses[I2]]) + #13;
            end;
          end;
        end;
      end;
    end;
    else Exit;
  end;
  Result:= GetParam;
end;

procedure InitializeWizard;
begin
  with WizardForm.WelcomeLabel2 do begin
    Font.Size:= Font.Size-2;
    Caption:= 'OS: ' + CollectInformation(_Caption) +#13+
              'User Name: ' + CollectInformation(_UserName) +#13+
              'Processor: ' + CollectInformation(_Processor) +#13+
              'Memory: ' + CollectInformation(_TotalPhysicalMemory) +#13#13+
              'All IP: ' + #13 + CollectInformation(_All_IpAddress) +#13#13+
              'Only IP: ' + #13 + CollectInformation(_IPAddress) +#13+
              'Only MAC: ' + #13 + CollectInformation(_MACAddress) +#13;
  end;
end;
Большое спасибо, прямо что надо!
 

Xenium

Новичок
Xenium, ни на что не претендую, нужно доработать:
Код:
[Setup]
AppName=Test
AppVersion=1.0
CreateAppDir=no
DisableWelcomePage=no

[Code]
const
  _Caption             = $10;
  _UserName            = $20;
  _Processor           = $30;
  _TotalPhysicalMemory = $40;
  _All_IpAddress       = $50;
  _IPAddress           = $60;
  _MACAddress          = $70;

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;

function CollectInformation(Param: DWORD): String;
var
  I, I2: Integer;
  Query, GetParam: String;
  IPAddresses: array of String;
  WbemLocator, WbemServices,
  ComputerSystem, OperatingSystem,
  Processor, NetworkAdapters, NetworkAdapter: Variant;
begin
  Result:= '';
  GetParam:= '';

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

  case Param of
    $10: begin
      Query:= 'SELECT Caption FROM Win32_OperatingSystem';
      OperatingSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(OperatingSystem) then
        GetParam:= OperatingSystem.Caption;
    end;
    $20: begin
      Query:= 'SELECT UserName FROM Win32_ComputerSystem';
      ComputerSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(ComputerSystem) then
        GetParam:= ComputerSystem.UserName;
    end;
    $30: begin
      Query:= 'SELECT Name FROM Win32_Processor';
      Processor:= WbemQuery(WbemServices, Query);
     if not VarIsNull(Processor) then
        GetParam:= Processor.Name;
    end;
    $40: begin
      Query:= 'SELECT TotalPhysicalMemory FROM Win32_ComputerSystem';
      ComputerSystem:= WbemQuery(WbemServices, Query);
      if not VarIsNull(ComputerSystem) then
        GetParam:= ComputerSystem.TotalPhysicalMemory;
    end;
    $50: begin
      Query:= 'SELECT IPEnabled, IPAddress, MACAddress FROM Win32_NetworkAdapterConfiguration';
      NetworkAdapters:= WbemServices.ExecQuery(Query);

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

      if not VarIsNull(NetworkAdapters) then
      for i:= 0 to NetworkAdapters.Count - 1 do begin
        NetworkAdapter:= NetworkAdapters.ItemIndex(i);
          if (not VarIsNull(NetworkAdapter.MACAddress)) and NetworkAdapter.IPEnabled then begin
            if Param = $70 then GetParam:= GetParam + Format('Adapter %d MAC = %s', [i, NetworkAdapter.MACAddress]) + #13;
            if not VarIsNull(NetworkAdapter.IPAddress) then begin
              IPAddresses := NetworkAdapter.IPAddress;
              for I2:= 0 to GetArrayLength(IPAddresses) - 1 do begin
                if (I2 <> 1) and (Param <> $70) then GetParam:= GetParam + Format('Adapter %d = %s', [I, IPAddresses[I2]]) + #13;
            end;
          end;
        end;
      end;
    end;
    else Exit;
  end;
  Result:= GetParam;
end;

procedure InitializeWizard;
begin
  with WizardForm.WelcomeLabel2 do begin
    Font.Size:= Font.Size-2;
    Caption:= 'OS: ' + CollectInformation(_Caption) +#13+
              'User Name: ' + CollectInformation(_UserName) +#13+
              'Processor: ' + CollectInformation(_Processor) +#13+
              'Memory: ' + CollectInformation(_TotalPhysicalMemory) +#13#13+
              'All IP: ' + #13 + CollectInformation(_All_IpAddress) +#13#13+
              'Only IP: ' + #13 + CollectInformation(_IPAddress) +#13+
              'Only MAC: ' + #13 + CollectInformation(_MACAddress) +#13;
  end;
end;
Очень интересный момент, думаю как побороть... На Windows 11 не работает (т.к из него выпилен wmic).
Как вариант использовать Powershell, но пока без понятия каким образом.
 

Xenium

Новичок
@Xenium,
проверьте в доп. компоненты WMIC
вроде работаетПосмотреть вложение 6577
Да, действительно, надо было включить WMIC.
Но, как тут быть обычным юзерам тогда?)

P.S - Как вариант, писать скрипт PS и кидать его в TEMP при запуске установки от туда же скрытно выполнять и выводить инфу.
 

audiofeel

Старожил
@Xenium, Если установлена система 11 с ноля то этот компонент есть 100% проверено. Я его сейчас выключил и после перезагрузки включил обратно. Включение заняло 7 минут... как то не очень по скорости. Может единичный случай.
 
Сверху