Уменьшить время выполнения запроса WMI - PullRequest
4 голосов
/ 01 февраля 2012

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

Время, необходимое для выполнения запроса, составляет около 5-10 секунд. Есть ли способ сократить необходимое время? Или другой способ проверить, активирован ли winows 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;

}

Ответы [ 3 ]

6 голосов
/ 02 февраля 2012

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

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

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

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

2 голосов
/ 01 февраля 2012

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

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

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

0 голосов
/ 04 февраля 2013

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

 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");
...