2011-02-14 101 views
2

我们使用WmiSet在远程机器上执行Wmi查询。它在Delphi 2007中运行得非常好,但目前不适用于Delphi XE。远程机器上的Delphi Wmi查询

我发现一些代码可以从以前的SO做Wmi Queries问题Use Wmi with DelphiAnswer No. 5中提供的代码片段在我的本地机器上工作得非常好,但我需要知道是否可以在远程机器上执行Wmi查询。

即使我用我的管理员凭据连接到远程计算机,我也会遇到EOleSysError: Access is denied异常。

问候,彼得。

回答

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. 
+0

谢谢你的回复+代码。它像一个魅力。问候,彼得。 – 2011-02-15 12:12:17