2008-10-14 50 views
3

通過編程接口可以查詢本地機器的規格(CPU規格,操作系統版本,圖形卡規格和驅動程序等一系列內容)的一些方法是什麼?我們正在用C#編寫一個簡單的應用程序來測試我們的主應用程序的兼容性,並希望將其轉儲出一些系統度量標準,但我似乎無法找到哪裏可以啓動,要使用哪些接口,庫,任何東西。查詢機器規格

我已經嘗試了各種搜索,但只能找到程序和GUI,需要用戶進行交互,或者必須安裝。

或者,一個小的命令行程序也可以工作,只要我們可以將它與測試應用程序一起分發即可。

我發現一個程序可以獲得我想要的一些規格,PsInfo。但是,似乎要求每個用戶在第一次運行時都同意一些許可證,即使它是命令行應用程序。另外,它只處理OS/CPU信息,我將需要更多。

另外:忘了明確提到,但這的確只是Windows機器必需的。你們很快!

編輯:此WMI看起來像我需要的,謝謝!儘管有很多蠕蟲,但我必須深入研究。它提到,對於某些用戶必須具有管理員權限;這可能不會是一個大問題,但它可能會限制一點。

回答

3

對於此類信息WMI是你的朋友。幸運的是,在.NET中處理WMI比在非託管的世界更容易。有很多文章可以開始使用,例如this onethis one來檢索處理器信息。

您將最終在WMI名稱空間中針對對象編寫類似SQL的查詢以檢索所需的信息。

5

也許看看使用Windows Management Instrumentation(WMI),假設它是您計劃查詢的Windows計算機。看看微軟的WMI Code Creator。它可以很容易地讓你用幾種語言的代碼示例。

WMI可以很好地回到Windows 2000時代,但也可以在Win98機器上工作,並提供一些幫助。

只要您擁有或可以提供您試圖查詢的計算機的管理員憑據,WMI絕對是您的選擇。

0

對於奇怪的情況,你會爲linux開發,你可以在/proc pseudofilesystem中找到很棒的東西。

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"); 
    } 
    } 
} 
0

如果您決定使用WMI,您可能需要查看Microsoft提供的WMI Code Creator。它使處理WMI非常容易。