Странная проблема WMI
От: WizardEye  
Дата: 02.11.10 10:15
Оценка:
Добрый день.
На днях столкнулся со странной проблемой доступа к WMI в Delphi:
при запуске из среды Delphi — информация собирается полностью, при запуске скомпиленного exe-шника — многие данные отсутствуют.
В приведенном ниже примере (извиняюсь за большой размер), при получении информации Win32_VideoController при запуске из Delphi информация DriverVersion есть, а при запуске exe-шника нет. Подскажите в чем может быть дело, или хотя бы в каком направлении копать?

procedure DumpWMI_Process(Process: SWBemObject;Memo:TMemo);
var
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
  SProp: ISWbemProperty;
  Prop: OleVariant;
  PropName: string;
  //PropType: string;
  PropValue: string;
begin
  Memo.Lines.Add('+ WMI Path: ' + Process.Path_.Path);
  Enum := Process.Properties_._NewEnum as IEnumVariant;
  while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and
    (lNumElements > 0) do
  begin
    if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and
      Assigned(SProp) then
    begin
      try
        PropName  := SProp.Name;
        Prop := SProp.Get_Value;
        //PropType := VarTypeAsText(VarType(Prop));
        PropValue := VarToStr(Prop);
        Memo.Lines.Add('  + ' + PropName + (*'[' + PropType +*) '] = ' + PropValue);
      except
        on E: Exception do
        begin
          // WriteLn(ErrOutput, PropName, ': ', E.Message);
        end;
      end;
    end;
  end;
end;

procedure TForm1.GetInfo(WMIname: string);
var
  Server: string;
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
  AName: array[0..255] of Char;
  ASize: DWORD;
begin
  Memo1.Lines.Clear;
  if (ParamCount = 0) then
  begin
    Server := '';
    ASize  := SizeOf(AName) - 1;
    if GetComputerName(@AName, ASize) then Server := AName;
  end
  else
  begin
    Server := ParamStr(1);
  end;
  try
    Memo1.Lines.BeginUpdate;
    Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
      '', '', '', 0, nil).ExecQuery('Select * from '+WMIName+'', 'WQL',
      wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;

    while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and
      (lNumElements > 0) do
    begin
      DumpWMI_Process(IUnknown(varArr) as SWBemObject,Memo1);
    end;
    
  finally
    Memo1.Lines.EndUpdate;
  end;

end;
wmi
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.