2012-02-01 2 views
3

В моем приложении я хочу посмотреть, активирована ли Windows 7. Чтобы быть ясным, я не хочу проверять подлинность окон. Я использую приведенный ниже код http://www.dreamincode.net/forums/topic/166690-wmi-softwarelicensingproduct/Уменьшить время выполнения запроса WMI

Время, необходимое для выполнения запроса, составляет около 5-10 секунд. Есть ли способ сократить время? Или еще один способ проверить, активирована ли лебедка 7?

public string VistaOrNewerStatus(){ 
string status = string.Empty; 
string computer = "."; 
try 
{ 
    //set the scope of this search 
    ManagementScope scope = new ManagementScope(@"\\" + computer + @"\root\cimv2"); 
    //connect to the machine 
    scope.Connect(); 

    //use a SelectQuery to tell what we're searching in 
    SelectQuery searchQuery = new SelectQuery("SELECT * FROM SoftwareLicensingProduct"); 

    //set the search up 
    ManagementObjectSearcher searcherObj = new ManagementObjectSearcher(scope, searchQuery); 

    //get the results into a collection 
    using (ManagementObjectCollection obj = searcherObj.Get()) 
    { 
     MessageBox.Show(obj.Count.ToString()); 
     //now loop through the collection looking for 
     //an activation status 
     foreach (ManagementObject o in obj) 
     { 

      //MessageBox.Show(o["ActivationRequired"].ToString()); 
      switch ((UInt32)o["LicenseStatus"]) 
      { 
       case 0: 
        status = "Unlicensed"; 
        break; 
       case 1: 
        status = "Licensed"; 
        break; 
       case 2: 
        status = "Out-Of-Box Grace Period"; 
        break; 
       case 3: 
        status = "Out-Of-Tolerance Grace Period"; 
        break; 
       case 4: 
        status = "Non-Genuine Grace Period"; 
        break; 
      } 
     } 
    } 


    // return activated; 
} 
catch (Exception ex) 
{ 
    // MessageBox.Show(ex.ToString()); 
    status = ex.Message; 
    //return false; 
} 
return status; 

}

+0

Нету. это способ сделать это с помощью wmi. не так много, чтобы сделать это быстрее. –

ответ

6

Я бы порекомендовал запрашивать только те свойства, которые вам действительно нужны. Так что, если вам нужно только значение класса SoftwareLicensingProduct WMI LicenseStatus затем использовать следующий запрос:

SelectQuery searchQuery = new 
      SelectQuery("SELECT LicenseStatus FROM SoftwareLicensingProduct"); 

Это должно улучшить производительность. Как отметил DJ KRAZE в своем ответе, вы должны, конечно, распоряжаться своими классами управления.

На моем компьютере с Windows 7, используя только свойство LicenseStatus в запросе, принималось 246ms. Запрос всех свойств (с использованием «*») принял 2440ms.

+0

Спасибо за признание Hans +2 вам сейчас .. – MethodMan

+0

Этот ответ в сочетании с ответом ниже сократилось время! Thx много парней! – vandervagos

+0

не проблема vandervagos .. здесь речь идет об обучении и передаче этих знаний и опыта. – MethodMan

2

Это, как правило, путь WMI работает это запрос по крайней мере .. где у вас есть следующий ниже .. после Еогеасп я бы распоряжаться этими объектами ..

ManagementScope scope = new ManagementScope(@"\\" + computer + @"\root\cimv2"); 
//connect to the machine  
scope.Connect();  
//use a SelectQuery to tell what we're searching in 
SelectQuery searchQuery = new SelectQuery("SELECT * FROM SoftwareLicensingProduct"); 
//set the search up  
ManagementObjectSearcher searcherObj 

, если они реализуют IDisposeable, то вы могли бы сделать

((IDisposable)scope).Dispose(); 
((IDisposable)searchQuery).Dispose(); 
((IDisposable)searcherObj).Dispose(); 

если нет, то выполнить команду, если(), чтобы проверить если объект! = null, то удалите их отдельно. Попробуйте выполнить это несколько раз и посмотрите, вернется ли он быстрее или нет, если вы уничтожаете объекты .. кроме этого .. не так много вы можете сделать из того, на что похоже это быстрее ..

+0

Моя проблема - производительность. Я могу попытаться уничтожить объекты, которые вы предлагаете, но поскольку мой для каждого выполняется, запрос будет не быстрее. В моем понимании Функция управленияObjectCollection obj = searcherObj.Get() отвечает за время, затрачиваемое на время – vandervagos

+0

Я понимаю это, но мне интересно, запускаете ли вы это один раз, а затем начинаете снова несколько раз .. вы действительно распоряжаетесь созданными объектами или они сидят в лотке, ожидая освобождения от GC, взгляните на эту ссылку, а также на некоторые возможные счетчики производительности, которые вы можете настроить. Посмотрите внизу страницы http://technet.microsoft.com/ru -us/library/ee692772.aspx # EBPAC – MethodMan

+0

+1 для вашего ответа. Утилизация объектов - это всегда хорошая идея - не только по соображениям производительности. – Hans

0

Это я сделал быстро :)

public bool IsLicensed(bool Licensed = false) 
    { 
     try 
     {     
      foreach (ManagementObject Obj in new ManagementObjectSearcher("root\\CIMV2", "SELECT LicenseStatus FROM SoftwareLicensingProduct WHERE LicenseStatus = 1").Get()) 
      { 
       Licensed = true; 
      } 
     } 
     catch (ManagementException) { Licensed = false; } 
     return Licensed; 
    } 

Его использование:

if(IsLicenced()) 
      MessageBox.Show("Windows is Licensed"); 
Смежные вопросы