我正在使用WMI检索服务器操作系统的信息。我有以下查询 - >
select * from Win32_OperatingSystem
结果很好,但对于OperatingSystemSKU,它返回一个整数。在微软网站上它提供了实际价值。我想知道这个查找表是否存在,还是我必须创建自己的本地表来进行映射?
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx
答案 0 :(得分: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();
}
}
}
答案 1 :(得分:0)
这是我刚才写的一个(非常修剪过的)方法 - 获取名称并使用Environment.OSVersion将Windows版本作为字符串获取 - 我只是假设你想要OS版本名称而不是sku ?
/// <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!
}
}
}
答案 2 :(得分:0)
你可以这样查找
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());