Запрос технических характеристик машины - PullRequest
3 голосов
/ 14 октября 2008

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

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

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 14 октября 2008

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

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

Если у вас есть или вы можете предоставить учетные данные администратора для машины, к которой вы пытаетесь запросить, WMI определенно является подходящим вариантом.

4 голосов
/ 14 октября 2008

Для этого типа информации WMI ваш друг. К счастью, работать с WMI в .NET намного проще, чем в неуправляемом мире. Существует довольно много статей для начала, например этот или этот для получения информации о процессоре.

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

1 голос
/ 15 октября 2008

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

Должен включить ссылку на 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 голосов
/ 31 марта 2014

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

https://missinglinq.codeplex.com/

0 голосов
/ 27 января 2009

Если вы решите воспользоваться WMI, вы можете проверить WMI Code Creator от Microsoft. Это облегчает работу с WMI.

0 голосов
/ 14 октября 2008

В нечетном случае, который вы разрабатываете для linux, вы можете найти удивительные вещи внутри /proc псевдофильной системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...