0

サーバーのオペレーティング システムの情報を取得するために WMI を使用しています。クエリは次のとおりです ->

select *  from Win32_OperatingSystem

結果は良好ですが、OperatingSystemSKU の場合は整数が返されます。マイクロソフトの Web サイトでは、実際の値が提供されています。このルックアップ テーブルが存在するかどうか、またはマッピングを行うために独自のローカル テーブルを作成する必要があるかどうか疑問に思っていました。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx

4

3 に答える 3

1

こんな感じで調べられます

string OSname = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>() select x.GetPropertyValue("Caption")).First().ToString();

または、メッセージボックスを使用してください。

MessageBox.Show((from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>() select x.GetPropertyValue("Caption")).First().ToString());
于 2013-02-05T08:55:52.730 に答える
1

修飾子OperatingSystemSKUにアクセスして、プロパティの有効な値を抽出できます。Values

プロパティのすべての修飾子と値を示す 次の画像 ( WDCCを使用して取得) を確認してください。OperatingSystemSKU

ここに画像の説明を入力

.Net から、QualifierDataクラスを使用してそのような情報を抽出する必要があります。

修飾子の値を使用してルックアップ リストを作成する次の C# サンプルを確認してください。

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

namespace GetWMI_Info
{
    class Program
    {

        static void Main(string[] args)
        {
            try
            {
                List<string> sLookUp = new List<string>();
                ManagementClass manClass = new ManagementClass("Win32_OperatingSystem");
                manClass.Options.UseAmendedQualifiers = true;
                foreach (PropertyData Property in manClass.Properties)
                    if (Property.Name.Equals("OperatingSystemSKU"))                    
                        foreach (QualifierData Qualifier in Property.Qualifiers)
                            if (Qualifier.Name.Equals("Values")) 
                                foreach (String s in (System.String[])Qualifier.Value)
                            sLookUp.Add(s);                   


                ManagementScope Scope;                
                Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", "."), null);
                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT OperatingSystemSKU FROM Win32_OperatingSystem");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    Console.WriteLine("{0} {1}", "OperatingSystemSKU", sLookUp[Convert.ToInt32((UInt32)WmiObject["OperatingSystemSKU"])]);// Uint32
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}
于 2013-02-05T19:47:59.550 に答える
0

これは私がしばらく前に書いた(非常にトリミングされた)メソッドです-名前を取得し、Environment.OSVersionを使用してWindowsバージョンも文字列として取得します-SKUではなくOSバージョン名が必要だと仮定していますか?

/// <summary>
/// Class for getting environment information
/// </summary>
public static class EnvironmentInfo
{
    /// <summary>
    /// Gets environment information by querying the system
    /// </summary>
    public static IEnumerable<string> GetEnvironmentInfo()
    {
        List<string> results = new List<string>();

        SafeUpdateListOfResultsFromInstrumentation("OS Product: {0}", results, "select * from win32_OperatingSystem", "name");
        SafeUpdateListofResults("OS Version: {0}", results, (() => Environment.OSVersion.ToString()));

        return results;
    }

    private static void SafeUpdateListofResults(string format, List<string> results, Func<string> del)
    {
        try
        {
            string str = del.Invoke();
            results.Add(string.Format(format, str));
        }
        catch (Exception)
        {
            //Swallow exception - can't get diagnostic info!
        }
    }

    private static void SafeUpdateListOfResultsFromInstrumentation(string format, List<string> results, string query, string index)
    {
        try
        {
            WqlObjectQuery objectQuery = new WqlObjectQuery(query);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(objectQuery);

            string name, value;

            foreach (ManagementObject managementObject in searcher.Get())
            {
                name = managementObject[index].ToString();
                string[] split1 = name.Split('|');
                value = split1[0];
                results.Add(string.Format(format, value));
            }
        }
        catch (Exception)
        {
            //Swallow exception - can't get diagnostic info!
        }

    }
}
于 2013-02-05T08:50:51.507 に答える