2011-02-14 102 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