Как получить имена столбцов, возвращаемых запросом WbemScripting? - PullRequest
1 голос
/ 02 марта 2011

У меня есть следующая процедура для выполнения запроса WMI, и она отлично работает.

procedure TFormMain.GetWMIOSInfo(const RemoteMachine, Username, Password: string);
var
  FSWbemLocator: OLEVariant;
  FWMIService: OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject: OLEVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;
begin;
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer(RemoteMachine, 'root\CIMV2', Username, Password);
    FWbemObjectSet := FWMIService.ExecQuery(
        'select screenwidth, screenheight, status from Win32_DesktopMonitor','WQL', 0);
    try
      oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
        begin
          Listbox1.Items.Add(
            VarToStr(FWbemObject.availability) + ', ' + 
            VarToStr(FWbemObject.screenwidth)  + ', ' +
            VarToStr(FWbemObject.screenheight));

          FWbemObject := Unassigned;
        end;

    finally
      FWbemObjectSet := Unassigned;
    end;

  Except on E: Exception do
    Raise;
  end;
end;

Я бы хотел изменить запрос, чтобы он возвращал все поля, например select * from Win32_DesktopMonitor. Моя проблема в том, что я не знаю, как определить имена столбцов, которые возвращаются запросом в FWbemObject. то есть. Я хотел бы перечислить столбцы в FWbemObject.

Listbox1.Items.Add(
  VarToStr(FWbemObject.<?>) + ', ' + 
  VarToStr(FWbemObject.<?>)  + ', ' +
  ....
  VarToStr(FWbemObject.<?>));

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Питер, вы должны использовать SWbemObject.Properties_ Свойство SWbemObject объекта.

проверить этот образец.

program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;


procedure  GetWin32_DesktopMonitorInfo;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  FProperties   : OLEVariant;
  oEnumProp     : IEnumvariant;
  iValueProp    : LongWord;
  FPropObj      : OLEVariant;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DesktopMonitor','WQL',0);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  if oEnum.Next(1, FWbemObject, iValue) = 0 then
  begin

    FProperties   := FWbemObject.Properties_;
    oEnumProp     := IUnknown(FProperties._NewEnum) as IEnumVariant;
    while oEnumProp.Next(1, FPropObj, iValueProp) = 0 do
    begin
       Writeln(FPropObj.Name);
       FPropObj:=Unassigned; //prevent memory leak
    end;

    FWbemObject:=Unassigned;//prevent memory leak
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetWin32_DesktopMonitorInfo;
      Readln;
    finally
    CoUninitialize;
    end;
 except
    on E:Exception do
    begin
        Writeln(E.Classname, ':', E.Message);
        Readln;
    end;
  end;
end.
2 голосов
/ 02 марта 2011

Интерфейс SWbemObject предоставляет свойство Properties_, которое является коллекцией (так что вы можете перечислить его, вероятно, так же, как перечислите возвращенный интерфейс SWebmObjectSet). на ExecQuery). Элементами этой коллекции являются SWbemProperty интерфейсы, которые предоставляют свойства Name и Value.

...