質問
プログラムインターフェースを介してローカルマシンの仕様(CPU仕様、OSバージョン、グラフィックスカード仕様、ドライバーなど)を照会できる方法は何ですか?メインアプリの互換性をテストするためにC#で簡単なアプリを作成しており、いくつかのシステムメトリックをダンプしたいのですが、どこから始めるべきか、どのインターフェイスを使用するか、ライブラリなどは見つけられないようです。
あらゆる種類の検索を試しましたが、ユーザーは対話するか、インストールする必要があるプログラムとそのGUIのみを見つけることができます。
代わりに、テストアプリで配布することが許可されている限り、小さなコマンドラインプログラムでも同様に機能します。
必要な仕様の一部を取得するプログラム PsInfo 。ただし、コマンドラインアプリであっても、最初の実行時に各ユーザーが何らかのライセンスに同意する必要があるようです。さらに、OS / CPU情報のみを扱うため、それ以上必要になります。
また、明示的に言及するのを忘れていましたが、これは実際にWindowsマシンにのみ必要です。皆さんは迅速です!
編集:このWMIは、私が必要とするもののように見えます、ありがとう!かなりの量のワームがありますので、私は飛び込みましょう。ユーザーが管理者権限を持っている必要があることについて言及しています。これはおそらく大きな問題にはなりませんが、少し制限される可能性があります。
他のヒント
Windows Management Instrumentation (WMI)、それがクエリを計画しているWindowsマシンであると仮定します。 WMI Code Creatorをご覧ください。 から。いくつかの言語のコードサンプルを簡単に使用できます。
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を使用する場合は、 MicrosoftのWMI Code Creator 。これにより、WMIの処理が非常に簡単になります。
MissingLinq.Linq2Management
というnugetパッケージがあります。これは、WMIに関するほとんどすべてを強力な型指定されたオブジェクトにラップしています。かなりいいようです。