Question

Comment puis-je interroger les spécifications de la machine locale (une gamme d'éléments allant des spécifications du processeur, de la version du système d'exploitation, des spécifications de la carte graphique et des pilotes, etc.) via une interface de programmation? Nous sommes en train d'écrire une application simple en C # pour tester la compatibilité de notre application principale et voulons la laisser effacer certaines métriques du système, mais je n'arrive pas à trouver par où commencer, quelles interfaces utiliser, les bibliothèques, quoi que ce soit.

J'ai essayé toutes sortes de recherches, mais je ne peux trouver que des programmes, y compris des interfaces graphiques, qui nécessitent l'intervention d'un utilisateur ou son installation.

Sinon, un petit programme en ligne de commande fonctionnerait aussi bien, à condition que nous soyons autorisés à le distribuer avec l'application de test.

J'ai trouvé un programme qui présente certaines des spécifications souhaitées, PsInfo . Cependant, il semble obliger chaque utilisateur à accepter une licence lors de sa première utilisation, même s'il s'agit d'une application en ligne de commande. De plus, il ne traite que des informations système / processeur, et il me faudra plus que cela.

Aussi: j'ai oublié de mentionner explicitement, mais cela ne sera nécessaire que pour les machines Windows. Vous êtes rapides!

Edit: Ce WMI ressemble à ce dont j'ai besoin, merci! Une boîte de Pandore cependant, donc je dois plonger dedans. Il mentionne que pour certaines choses, l'utilisateur doit avoir des privilèges d'administrateur; ce ne sera probablement pas un gros problème, mais cela pourrait le limiter un peu.

Était-ce utile?

La solution

Pour ce type d'informations, WMI est votre ami. Heureusement, traiter avec WMI dans .NET est beaucoup plus facile que dans le monde non géré. Il existe de nombreux articles pour commencer, tels que celui-ci , ou celui-ci pour récupérer les informations sur le processeur.

Vous finirez par écrire des requêtes de type SQL sur des objets de l'espace de noms WMI afin de récupérer les informations souhaitées.

Autres conseils

Peut-être envisagez-vous d'utiliser Instrumentation de la gestion Windows (WMI), en supposant qu'il s'agisse d'une machine Windows sur laquelle vous prévoyez d'interroger. Jetez un coup d’œil sur le créateur WMI. de Microsoft. Il peut facilement vous aider à utiliser des exemples de code dans quelques langues.

WMI fonctionne parfaitement depuis l’ère Windows 2000, mais peut également fonctionner avec les ordinateurs Win98 avec une certaine aide.

Tant que vous avez, ou pouvez fournir, des informations d'identification d'administrateur pour la machine que vous essayez d'interroger, WMI est sans aucun doute le chemin à parcourir.

Je pourrais aussi bien poster le code de base que j'avais utilisé pour obtenir tout ce dont j'avais besoin, en utilisant WMI comme suggéré ici.

Il faut inclure une référence à System.Management dans le projet c #. Ensuite, la source elle-même est probablement c # terriblement formée, mais je n’y ai jamais vraiment écrit avant et c’est pour un outil interne, c’est donc un peu le but. Je l'ai un peu simplifié, de sorte qu'il ne traite vraiment que de la sortie des spécifications de la machine (l'outil fait autre chose que cela). Chaque appel à LogClass () vide toutes ses propriétés. Pour plus de classes à vider, consultez la section MSDN sur Classes 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");
    }
  }
}

Pour le cas étrange que vous développeriez pour Linux, vous pourriez trouver des informations intéressantes dans le pseudofilesystem / proc .

Si vous décidez d'utiliser WMI, vous voudrez peut-être consulter la Créateur de code WMI de Microsoft. Il est très facile de traiter avec WMI.

Il existe un package de nuget appelé MissingLinq.Linq2Management qui a pratiquement tout intégré dans WMI dans un bel objet fortement typé. Semble assez sympa.

https://missinglinq.codeplex.com/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top