3

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

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

或者,只要允许我们将其与测试应用程序一起分发,一个小型命令行程序也可以正常工作。

我找到了一个程序,它可以获得我想要的一些规范,PsInfo。然而,它似乎要求每个用户在第一次运行时同意一些许可,即使它是一个命令行应用程序。另外,它只处理操作系统/CPU 信息,我需要的还不止这些。

另外:忘了明确提及,但这确实只对 Windows 机器是必需的。你们好快啊!

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

4

6 回答 6

5

也许考虑使用Windows Management Instrumentation (WMI),假设它是您计划查询的 Windows 机器。看看 Microsoft 的WMI Code Creator。它可以让您轻松使用几种语言的代码示例。

WMI 在 Windows 2000 时代一直运行良好,但在一些帮助下也可以在 Win98 机器上运行。

只要您拥有或可以为您尝试查询的机器提供管理员凭据,WMI 绝对是您的最佳选择。

于 2008-10-14T18:51:40.443 回答
4

对于此类信息,WMI是您的朋友。幸运的是,在 .NET 中处理 WMI 比在非托管环境中容易得多。有很多文章可以开始,比如这篇文章,或者这篇文章来检索处理器信息。

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

于 2008-10-14T18:49:45.830 回答
1

我不妨按照这里的建议使用 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");
    }
  }
}
于 2008-10-15T17:22:34.273 回答
0

对于您将为 linux 开发的奇怪情况,您可以在伪文件系统中找到很棒的东西/proc

于 2008-10-14T18:54:16.273 回答
0

如果您决定使用 WMI,您可能需要查看 Microsoft 的WMI Code Creator。它使处理 WMI 变得非常容易。

于 2009-01-27T17:10:55.047 回答
0

有一个名为 nuget 的包MissingLinq.Linq2Management,它几乎将有关 WMI 的所有内容都包装到了一个很好的强类型对象中。看起来还不错。

https://missinglinq.codeplex.com/

于 2014-03-31T18:26:48.437 回答