Delphi Wmi查询远程机器

时间:2011-02-14 10:08:42

标签: delphi wmi wmi-query

我们使用WmiSet在远程计算机上执行Wmi查询。它在Delphi 2007中运行良好,但目前不适用于Delphi XE。

我发现了一些代码可以从之前的SO问题Use Wmi with Delphi中执行Wmi QueriesAnswer No. 5中提供的代码段在我的本地计算机上运行良好,但我需要知道是否可以在远程计算机上执行Wmi查询。

即使我使用管理员凭据连接到远程计算机,我也会收到EOleSysError: Access is denied例外。

问候,彼得。

1 个答案:

答案 0 :(得分:8)

彼得。在使用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.