2012-02-01 1 views
3

내 응용 프로그램에서 Windows 7이 활성화되어 있는지 확인하고 싶습니다. 분명히하기 위해 나는 창문이 진짜인지 확인하고 싶지 않다. 여기에있는 코드를 사용합니다. http://www.dreamincode.net/forums/topic/166690-wmi-softwarelicensingproduct/WMI 쿼리 실행 시간 줄이기

쿼리를 실행하는 데 필요한 시간은 약 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; 

}

+0

싫다. 그게 wmi와 함께 할 수있는 방법. 그걸 빨리 만들지는 않을거야. –

답변

6

정말 필요한 속성 만 쿼리하는 것이 좋습니다.

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

이것은 당신의 성능을 개선한다 : 당신은 단지 SoftwareLicensingProduct WMI 클래스의 LicenseStatus 값을 필요로한다면, 그 다음 쿼리를 사용합니다. DJ KRAZE가 자신의 대답에서 지적한대로 물론 관리 수업을 처리해야합니다.

쿼리에서 LicenseStatus 속성 만 사용하는 Windows 7 컴퓨터에서 246ms이 걸렸습니다. "*"를 사용하여 모든 속성을 쿼리하면 2440ms이 걸렸습니다.

+0

덕분에 .. 대답과 함께 – MethodMan

+0

이 답변은 아래 significally 시간을 감소! 많은 사람들 Thx! – vandervagos

+0

vandervagos .. 여기 지식과 경험을 배우고 전달하는 것이 전부입니다. – MethodMan

2

이 일반적으로 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(); 

을 할 수 객체! = null 인 경우 객체를 개별적으로 삭제합니다. 이 객체를 여러 번 실행하고 객체를 처분하면 객체가 더 빨리 반환되는지 또는 반환되지 않는지 확인합니다. 더 빨리 ..

+0

제 문제는 성능입니다. 내가 제안한 객체를 처리하려고 할 수는 있지만 각각의 객체가 실행될 때마다 쿼리가 더 빠를 수는 없습니다. 나의 이해 ManagementObjectCollection OBJ = searcherObj.Get() 함수에서 시간은 당신이에 한 번 여러 번 .. 당신이 진정으로 생성 된 객체를 처분하는 다시 시작 실행하거나하지만 만약 내가 궁금 것을 이해 – vandervagos

+0

소비에 대한 책임 그들은 페이지 하단 http://technet.microsoft.com/en 보면 .. 트레이는 설치 할 수있는 몇 가지 가능한 성능 카운터에 대한뿐만 아니라이 링크를 살펴 GC의에 의해 해제를 기다리고 주위에 앉아있다 -us/library/ee692772.aspx # EBPAC – MethodMan

+0

답을 +1하십시오. 객체를 폐기하는 것은 항상 좋은 생각이다 - 성능상의 이유로뿐만 아닙니다. 지금 당신에 대한 인식 한스 +2 대한 – 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");