2

以下のコードを使用して、Widnows7のアクティブ化を確認しています。7つのインスタンス/製品を取得しています。どの製品が元のWindows7を参照しているかわかりません。

Windowsがアクティブ化されているかどうかを判断するために、どのインスタンスをチェックするためのドキュメントが見つかりません

        //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())
        {
            foreach (ManagementObject m in obj)
        {
            if (Convert.ToInt32(m["GracePeriodRemaining"].ToString()) == 0)
            {
                MessageBox.Show("Windows is active");
                break;
            }
            else
            {
                MessageBox.Show(" Windows is not active");
                break;
            }
        }
            //now loop through the collection looking for
            //an activation status

        }
4

2 に答える 2

2

WMIクラスを使用するとSoftwareLicensingProduct、Windows Vistaで導入されたボリュームライセンス機能により複数のインスタンスが返されるため、Windowsバージョンのインスタンスのみを返すにはPartialProductKeyApplicationIdおよびLicenseIsAddonプロパティを使用してWQLセンテンスをフィルター処理する必要があります。

このサンプルを試してください

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {

        static void Main(string[] args)
        {
            try
            {
                string ComputerName = "localhost";
                ManagementScope Scope;                
                Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);

                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT * FROM SoftwareLicensingProduct Where PartialProductKey <> null AND ApplicationId='55c92734-d682-4d71-983e-d6ec3f16059f' AND LicenseIsAddon=False");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    Console.WriteLine("{0,-35} {1,-40}", "Name", (String)WmiObject["Name"]);
                    Console.WriteLine("{0,-35} {1,-40}", "GracePeriodRemaining", (UInt32) WmiObject["GracePeriodRemaining"]);// Uint32
                    switch ((UInt32)WmiObject["LicenseStatus"])
                    {
                        case 0: Console.WriteLine("{0,-35} {1,-40}", "LicenseStatus", "Unlicensed");
                                break;
                        case 1: Console.WriteLine("{0,-35} {1,-40}", "LicenseStatus", "Licensed");
                                break;
                        case 2: Console.WriteLine("{0,-35} {1,-40}", "LicenseStatus", "Out-Of-Box Grace Period");
                                break;
                        case 3: Console.WriteLine("{0,-35} {1,-40}", "LicenseStatus", "Out-Of-Tolerance Grace Period");
                                break;
                        case 4: Console.WriteLine("{0,-35} {1,-40}", "LicenseStatus", "on-Genuine Grace Period");
                                break;
                        case 5: Console.WriteLine("{0,-35} {1,-40}", "LicenseStatus", "Notification");
                                break;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}

別のオプションは、SLIsGenuineLocal関数を使用することです。

Determine Genuine Windows Installation in C#C#サンプルについては、この質問への回答を試してください。

于 2012-10-18T00:58:18.060 に答える
0

Windows®7、VOLUME_KMSCLIENTチャネルは、実際の製品を参照します。これはdescriptionプロパティにあります

    string ComputerName = "localhost";
    ManagementScope Scope;                
    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);

     Scope.Connect();
     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())
        {

            foreach (ManagementObject m in obj)
            {
                String s = m["Description"].ToString();
                if ((m["Description"].ToString()) .Contains("VOLUME_KMSCLIENT channel"))
                {
                    if (m["LicenseStatus"].ToString() == "1")
                    {
                        var gracePeriod = Convert.ToInt32(m["GracePeriodRemaining"]) / (60 * 24);
                        MessageBox.Show("Not Licensed " + " Grace Period Remaining--" + gracePeriod.ToString() + "days");

                    }
                    else
                    {
                        var gracePeriod = Convert.ToInt32(m["GracePeriodRemaining"]) / (60 * 24);
                        MessageBox.Show("Not Licensed " + " Grace Period Remaining--" + gracePeriod.ToString() + "days");
                    }
                }

            }
        }
于 2012-10-25T01:05:30.637 に答える