2016-04-21 7 views
0

Ich mache einige Tests mit C# und WMIWMI Verbindung zu ManagementScope

Ich frage mich, was ist der Zweck der Verbindung zu einem ManagementScope? In meinen Tests gibt es keinen Unterschied, ob ich "scope.Connect()" verwende oder nicht, das Ergebnis ist das gleiche.

ManagementScope scope = new ManagementScope("\\\\" + sServer +"\\root\\CIMV2", oConn); 


// scope.Connect() ;     When should I use this? Code works without it.... 
// if (scope.IsConnected) 
//  Console.WriteLine("Scope connected"); 

ObjectQuery query = new ObjectQuery("SELECT FreeSpace FROM Win32_LogicalDisk where DeviceID = 'C:'"); 

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 

ManagementObjectCollection queryCollection = searcher.Get(); 

foreach (ManagementObject m in queryCollection) 
    { 
    freeSpace = (ulong)m.GetPropertyValue("FreeSpace"); 

    Console.WriteLine (freeSpace) 
    } 

Antwort

0

aus dem Quellcode .Net:

Die ManagementObjectSearcher.Get() Methode ruft die Initialize Methode:

public void Get(ManagementOperationObserver watcher) 
{ 
    if (null == watcher) 
     throw new ArgumentNullException ("watcher"); 

    Initialize(); 
    // ... more code 
} 

und die Initialize() Methode bestätigt eigentlich, wenn der Umfang richtig und die Verbindung initialisiert wurde Umfang, wenn nicht:

private void Initialize() 
{ 
    //If the query is not set yet we can't do it 
    if (null == query) 
     throw new InvalidOperationException(); 
     //If we're not connected yet, this is the time to do it... 
    lock (this) 
    { 
     if (null == scope) 
      scope = ManagementScope._Clone(null); 
    } 
     lock (scope) 
    { 
     if (!scope.IsConnected) 
      scope.Initialize(); 
    } 
} 

Sie müssen also die Connect() Methode nicht selbst aufrufen, wenn Sie eine ManagementSearcherObject verwenden. Sie können jedoch weiterhin von einem anderen Objekt aus auf den Sucher zugreifen, und Sie müssen dann selbst überprüfen, ob Sie eine Verbindung zu Ihrem Verwaltungsbereich hergestellt haben.

Die Connect() Methode der ManagementScope Klasse aber tut nichts anderes, als rufen Sie die gleichen Initialize() Methode:

public void Connect() 
    { 
     Initialize(); 
    } 

können Sie sehen, es here und here