3

プログラム インターフェイスを介してローカル マシンの仕様 (CPU の仕様、OS のバージョン、グラフィック カードの仕様、ドライバなどの範囲) を照会するには、どのような方法がありますか? メイン アプリの互換性をテストするために C# で簡単なアプリを作成していて、いくつかのシステム メトリックをダンプしたいと考えていますが、どこから始めればよいか、使用するインターフェイス、ライブラリなどを見つけることができないようです。

私はあらゆる種類の検索を試みましたが、ユーザーが対話する必要がある、またはインストールする必要があるプログラムと GUI のプログラムしか見つけることができません。

または、小さなコマンド ライン プログラムでも、テスト アプリと一緒に配布することが許可されている限り、同様に機能します。

必要な仕様の一部を取得するプログラムを 1 つ見つけました。 PsInfoです。ただし、コマンド ライン アプリとはいえ、最初の実行時に各ユーザーが何らかのライセンスに同意する必要があるようです。さらに、これは OS/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 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");
    }
  }
}
于 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

WMI に関するほぼすべてを適切に型指定されたオブジェクトにラップした nuget パッケージという名前のパッケージがありMissingLinq.Linq2Managementます。かなり良さそうです。

https://missinglinq.codeplex.com/

于 2014-03-31T18:26:48.437 に答える