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