我不妨按照这里的建议使用 WMI 发布我用来获取所需一切的基本代码。
必须在 c# 项目中包含对 System.Management 的引用。然后,源代码本身可能是非常糟糕的 c#,但我以前从未真正用它编写过它,它是用于内部工具的,所以这有点无关紧要。我已经简化了一点,所以它只是真正处理输出机器规格(除此之外,该工具还做其他事情)。对 LogClass() 的每次调用都会转储其所有属性。要转储更多类,只需查看WMI 类的 MSDN 部分。
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
using System.IO;
namespace SyTest
{
class Program
{
static StreamWriter specStream;
static void Main(string[] args)
{
FileStream specFile =
new FileStream("machine-specs.txt",FileMode.Create,FileAccess.Write);
specStream = new StreamWriter(specFile);
LogClass("Win32_DesktopMonitor");
LogClass("Win32_VideoController");
LogClass("Win32_Processor");
// etc
specStream.Close();
specFile.Close();
}
static void LogClass(string strTable)
{
if (strTable.Length <= 0) return;
specStream.Write("--- " + strTable + " ---\r\n\r\n");
WqlObjectQuery wqlQuery =
new WqlObjectQuery("SELECT * FROM " + strTable);
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(wqlQuery);
try
{
if (searcher.Get().Count <= 0)
{
specStream.Write("Class has no instances\r\n\r\n");
}
foreach (ManagementObject obj in searcher.Get())
{
specStream.Write("* " + obj.ToString() + "\r\n");
if (obj.Properties.Count <= 0)
{
specStream.Write("Class instance has no properties\r\n");
continue;
}
foreach (System.Management.PropertyData prop in obj.Properties)
{
LogAttr(obj, prop.Name);
}
specStream.Write("\r\n");
}
}
catch { specStream.Write("Class does not exist\r\n\r\n"); }
}
static void LogAttr(ManagementObject obj, string str)
{
if (str.Length <= 0) return;
string strValue = "";
try
{
strValue = obj[str].ToString();
try
{
string[] pstrTmp = ((string[])obj[str]);
if (pstrTmp.Length > 0) strValue = String.Join(", ", pstrTmp);
}
catch { } // Problem casting, fall back on original assignment
}
catch { strValue = "[UNDEFINED]"; }
specStream.Write(str + ": " + strValue + "\r\n");
}
}
}