题
通过编程接口,我可以通过哪些方式查询本地机器的规格(CPU规格,操作系统版本,显卡规格和驱动程序等等)?我们在C#中编写一个简单的应用程序来测试我们的主应用程序的兼容性,并希望将它转储出一些系统指标,但我似乎无法找到从哪里开始,使用什么接口,库,什么。
我尝试了各种搜索,但只能找到程序和GUI,这需要用户与之交互或必须安装。
或者,只要我们允许使用测试应用程序分发它,一个小的命令行程序也可以正常工作。
我找到了一个程序可以获得我想要的一些规格,中psinfo 。但是,它似乎要求每个用户在首次运行时同意某些许可证,即使它是命令行应用程序。此外,它只处理操作系统/ CPU信息,我需要更多。
另外:忘了明确提到,但这确实只是Windows机器所必需的。你的人很快!
编辑:这个WMI看起来像我需要的,谢谢!相当多的蠕虫,所以我必须潜入。它提到,对于某些事情,用户必须具有管理员权限;这可能不是一个大问题,但它可能会限制它。
其他提示
也许可以考虑使用 Windows Management Instrumentation (WMI),假设它是您计划查询的Windows机器。请查看 WMI代码创建器来自Microsoft的它可以轻松地为您提供几种语言的代码示例。
WMI一直很好地回到了Windows 2000时代,但也可以在Win98机器上运行,并提供一些帮助。
只要您拥有或可以提供您尝试查询的计算机的管理员凭据,WMI绝对是您的选择。
我不妨发布我用来获取所需内容的基本代码,使用WMI,如此处所示。
要在c#项目中包含对System.Management的引用。然后,源本身可能是非常形成的c#,但我以前从未真正写过它,而且它是一个内部工具,所以除了这一点之外。我已经简化了一点,所以它只是真正处理输出机器规格(该工具除此之外还做其他事情)。每次调用LogClass()都会转储出它的所有属性。要转出更多类,只需查看 WMI课程。
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");
}
}
}
对于你将为linux开发的奇怪案例,你可以在 / proc
伪文件系统中找到很棒的东西。
如果您决定使用WMI,可能需要查看 WMI Code Creator 。这使得处理WMI非常容易。
有一个名为 MissingLinq.Linq2Management
的nuget包,它将WMI的所有内容都包装成一个很好的强类型对象。看起来很不错。