2008-10-14 5 views
3

Каковы некоторые способы, с помощью которых я могу запросить спецификации локального компьютера (диапазон вещей от спецификации процессора, версии ОС, спецификации графических карт и драйверов и т. Д.) Через программный интерфейс? Мы пишем простое приложение на C# для проверки совместимости нашего основного приложения и хотим, чтобы он выдавал некоторые системные показатели, но я не могу найти, где даже начать, какие интерфейсы использовать, библиотеки, что угодно.Технические требования к запросам

Я пробовал все виды поиска, но могу найти программы, а также графические интерфейсы, требующие от пользователя взаимодействия или установки.

Альтернативно, небольшая программа с командной строкой будет работать так же хорошо, если нам будет разрешено распространять ее с помощью тестового приложения.

Я нашел одну программу, которая получает некоторые спецификации, которые я хочу, PsInfo. Однако, по-видимому, каждый пользователь должен согласиться с какой-либо лицензией при первом запуске, хотя это приложение командной строки. Кроме того, он имеет дело только с информацией о OS/CPU, и мне нужно больше.

Также: забыли упомянуть о нем явно, но это действительно будет необходимо только для машин Windows. Вы, ребята, быстры!

Редактировать: Этот WMI действительно похож на то, что мне нужно, спасибо! Вполне возможно, червь, поэтому, я должен погрузиться. Он упоминает, что для некоторых вещей пользователь должен иметь права администратора; это, вероятно, не будет большой проблемой, но это может немного ограничить ее.

ответ

3

Для данного типа информации WMI - твой друг. К счастью, работа с WMI в .NET намного проще, чем в неуправляемом мире. Есть довольно много статей, чтобы начать работу, например this one, или this one для получения информации о процессоре.

В результате вы создадите SQL-подобные запросы против объектов в пространстве имен WMI, чтобы получить нужную информацию.

5

Возможно, посмотрите на использование Windows Management Instrumentation (WMI), предполагая, что это компьютер Windows, на который вы планируете запрашивать. Взгляните на WMI Code Creator от Microsoft. Он может легко заставить вас идти с образцами кода на нескольких языках.

WMI работает отлично вплоть до эпохи Windows 2000, но также может работать с машинами Win98 с некоторой помощью.

До тех пор, пока у вас есть или могут предоставить учетные данные администратора для машины, которую вы пытаетесь запросить, WMI - это, безусловно, путь.

0

Для нечетного случая, который вы разрабатывали для linux, вы могли бы найти потрясающий материал внутри псевдосистемы /proc.

1

Я мог бы также опубликовать базовый код, который я использовал, чтобы получить все, что мне нужно, с использованием WMI, как было предложено здесь.

Gotta содержит ссылку на System.Management в проекте C#. Тогда сам источник, вероятно, ужасно сформирован C#, но я никогда не писал его раньше, и это для внутреннего инструмента, так что это не что иное, как точка. Я немного упростил его, поэтому он действительно имеет дело с выдачей машинных спецификаций (помимо этого, инструмент делает другие вещи). Каждый вызов LogClass() выгружает все его свойства. Чтобы больше выгружать классы, просто зайдите в раздел MSDN по адресу WMI Classes.

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, вы можете проверить WMI Code Creator от Microsoft. Это упрощает работу с WMI.

0

Существует пакет nuget под названием MissingLinq.Linq2Management, который полностью переделал все, что связано с WMI, в хороший сильно типизированный объект. Кажется довольно приятным.

https://missinglinq.codeplex.com/