2016-04-21 2 views
0

Я делаю некоторые тесты с C# и WMIWMI подключиться к ManagementScope

Интересно, что является целью подключения к ManagementScope? В моих тестах нет разницы, пользуюсь ли я «scope.Connect()», результат тот же.

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) 
    } 

ответ

0

Из исходного кода .Net:

Метод ManagementObjectSearcher.Get() называет Initialize метод:

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

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

Initialize() и метод фактически подтверждает, если объем был правильно инициализирован и подключается к если он не имеет:

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(); 
    } 
} 

Таким образом, вам не нужно вызывать метод Connect() самостоятельно, если вы используете ManagementSearcherObject. Однако вы все равно можете получить доступ к поисковику с другого объекта, а затем вам нужно убедиться, что вы подключились к области управления.

Способ по ManagementScope класса Connect() однако ничего не делает, но вызывать тот же метод: Initialize()

public void Connect() 
    { 
     Initialize(); 
    } 

Вы можете увидеть его here и here

Смежные вопросы