查询机器规格

问题描述 投票:0回答:6

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

我尝试了各种搜索,但只能找到程序,而且是 GUI 程序,这些程序需要用户交互,或者必须安装。

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

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

另外:忘了明确提及,但这确实只适用于 Windows 机器。你们真快啊!

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

c# wmi
6个回答
5
投票

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

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

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


4
投票

对于此类信息,WMI 是您的朋友。幸运的是,在 .NET 中处理 WMI 比在非托管世界中容易得多。有很多文章可供入门,例如 thisonethisone 用于检索处理器信息。

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


1
投票

我不妨发布我用来获取所需一切的基本代码,按照此处的建议使用 WMI。

必须在 c# 项目中包含对 System.Management 的引用。然后,源代码本身可能是非常糟糕的 C# 形式,但我以前从未真正用它编写过,而且它是用于内部工具的,所以这有点不重要。我对其进行了一些简化,因此它仅真正处理输出机器规格(除此之外,该工具还执行其他操作)。每次调用 LogClass() 都会转储其所有属性。要转储更多类,只需查看 MSDN 上的 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");
    }
  }
}

0
投票

对于您要为 Linux 进行开发的奇怪情况,您可以在

/proc
伪文件系统中找到很棒的东西。


0
投票

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


0
投票

有一个名为

MissingLinq.Linq2Management
的 nuget 包,它已将有关 WMI 的几乎所有内容包装到一个漂亮的强类型对象中。看起来还不错。

https://www.nuget.org/packages/MissingLinq.Linq2Management

© www.soinside.com 2019 - 2024. All rights reserved.