4

私のアプリケーションでは、Windows7がアクティブ化されているかどうかを確認したいと思います。明確にするために、私は窓が本物であるかどうかをチェックしたくありません。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;

}

4

3 に答える 3

6

本当に必要なプロパティのみをクエリすることをお勧めします。LicenseStatusしたがって、WMIクラスの値のみが必要な場合はSoftwareLicensingProduct、次のクエリを使用します。

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

これにより、パフォーマンスが向上するはずです。DJ KRAZEが彼の答えで指摘したように、もちろんあなたはあなたの管理クラスを処分するべきです。

クエリでLicenseStatusプロパティのみを使用するWindows7マシンでは、246ミリ秒かかりました。すべてのプロパティのクエリ(「*」を使用)には2440ミリ秒かかりました。

于 2012-02-01T20:25:42.297 に答える
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 かどうかを確認するために if() を実行してから、それらを個別に破棄します。これを数回実行して、オブジェクトを破棄すると、より速く返されるかどうかを確認してください..それ以外..それほど多くはありませんそれをより速くするためにそれがどのように見えるかからすることができます..

于 2012-02-01T19:52:41.540 に答える
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");
于 2013-02-03T23:21:07.310 に答える