2011-02-14 5 views
2

Nous utilisons WmiSet pour faire des requêtes WMI sur des machines à distance. Cela fonctionne très bien dans Delphi 2007 mais n'est actuellement pas disponible pour Delphi XE.Delphi Wmi Query sur une machine distante

J'ai trouvé du code à faire Wmi Queries d'un SO précédent Question Use Wmi with Delphi. L'extrait de code fourni en Answer No. 5 fonctionne parfaitement sur ma machine locale, mais j'ai besoin de savoir s'il est possible d'exécuter la requête WMI sur une machine distante.

Même si je me connecte à l'ordinateur distant avec mes informations d'identification d'administrateur, j'obtiens une exception EOleSysError: Access is denied.

Cordialement, Pieter.

Répondre

8

Pieter. Avant de vous connecter à un ordinateur distant à l'aide de WMI, vous devez activer l'accès DCOM à l'utilisateur spécifié sur l'ordinateur distant.

Lisez ces articles pour comprendre et résoudre les problèmes de connexion aux machines distantes à l'aide du WMI.

De plus je laisse ici un code plus clair pour se connecter à l'IMW dans une machine distante. Vérifiez la partie où l'exception EOleException est traitée pour obtenir le code d'erreur et trouvé la cause du problème.

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

Merci pour la réponse + code. Il fonctionne comme un charme. Cordialement, Pieter. –

Questions connexes