Запрос Delphi Wmi на удаленной машине

Мы используем WmiSet для выполнения запросов Wmi на удаленных компьютерах. Он очень хорошо работает в Delphi 2007, но в настоящее время недоступен для Delphi XE.

Я нашел некоторый код для выполнения Wmi Queries из предыдущего вопроса SO Использовать Wmi с Delphi. Фрагмент кода, предоставленный в Answer No. 5, прекрасно работает на моем локальном компьютере, но мне нужно знать, можно ли выполнить запрос Wmi на удаленном компьютере.

Даже если я подключаюсь к удаленному компьютеру с учетными данными администратора, я получаю исключение EOleSysError: Access is denied.

С уважением, Питер.


person Pieter van Wyk    schedule 14.02.2011    source источник


Ответы (1)


Питер. Прежде чем подключаться к удаленному компьютеру с помощью WMI, необходимо разрешить доступ DCOM для указанного пользователя на удаленном компьютере.

Прочтите эти статьи, чтобы понять и устранить проблемы с подключением к удаленным компьютерам с помощью WMI.

Кроме того, здесь я оставляю более понятный код для подключения к wmi на удаленной машине. проверьте часть, где обрабатывается исключение EOleException, чтобы получить код ошибки и найти причину проблемы.

program WMIRemote;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;

procedure  GetWMIOSInfo(const RemoteMachine,User,Password : string);
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(RemoteMachine, 'root\CIMV2', User, Password);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem','WQL',0);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
        Writeln(FWbemObject.Name);
        //code
        FWbemObject:=Unassigned;
    end;
    FWbemObjectSet:=Unassigned;
end;

begin
 try
    CoInitialize(nil);
    try
      //GetWMIOSInfo('localhost','','');
      GetWMIOSInfo('192.168.52.2','Administrator','password');
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('Error Code %d ($%x) Msg : %s',[E.ErrorCode,E.ErrorCode, E.Message]));

    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Readln;
end.
person RRUZ    schedule 14.02.2011
comment
Спасибо за ответ + код. Работает как часы. С уважением, Питер. - person Pieter van Wyk; 15.02.2011