通过编程接口,我可以通过哪些方式查询本地机器的规格(CPU规格,操作系统版本,显卡规格和驱动程序等等)?我们在C#中编写一个简单的应用程序来测试我们的主应用程序的兼容性,并希望将它转储出一些系统指标,但我似乎无法找到从哪里开始,使用什么接口,库,什么。

我尝试了各种搜索,但只能找到程序和GUI,这需要用户与之交互或必须安装。

或者,只要我们允许使用测试应用程序分发它,一个小的命令行程序也可以正常工作。

我找到了一个程序可以获得我想要的一些规格,中psinfo 。但是,它似乎要求每个用户在首次运行时同意某些许可证,即使它是命令行应用程序。此外,它只处理操作系统/ CPU信息,我需要更多。

另外:忘了明确提到,但这确实只是Windows机器所必需的。你的人很快!

编辑:这个WMI看起来像我需要的,谢谢!相当多的蠕虫,所以我必须潜入。它提到,对于某些事情,用户必须具有管理员权限;这可能不是一个大问题,但它可能会限制它。

有帮助吗?

解决方案

对于此类信息 WMI 是你的朋友。幸运的是,在.NET中处理WMI比在非托管世界中处理要容易得多。有很多文章可以开始使用,比如这个,或者这一个来检索处理器信息。

您将最终针对WMI命名空间中的对象编写类似SQL的查询,以检索所需的信息。

其他提示

也许可以考虑使用 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的所有内容都包装成一个很好的强类型对象。看起来很不错。

https://missinglinq.codeplex.com/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top