Pregunta

¿Cuáles son algunas maneras en que puedo consultar las especificaciones de la máquina local (un rango de cosas desde las especificaciones de la CPU, la versión del sistema operativo, las especificaciones y los controladores de la tarjeta gráfica, etc.) a través de una interfaz programática? Estamos escribiendo una aplicación simple en C # para probar la compatibilidad de nuestra aplicación principal y queremos que elimine algunas métricas del sistema, pero parece que no puedo encontrar dónde comenzar, qué interfaces usar, bibliotecas, nada.

He intentado todo tipo de búsquedas, pero solo puedo encontrar programas, y GUI, que requieren que un usuario interactúe o tenga que instalar.

Alternativamente, un pequeño programa de línea de comandos funcionaría igual de bien, siempre y cuando se nos permita distribuirlo con la aplicación de prueba.

He encontrado un programa que obtiene algunas de las especificaciones que quisiera, PsInfo . Sin embargo, parece requerir que cada usuario acepte alguna licencia cuando se ejecute por primera vez, aunque sea una aplicación de línea de comandos. Además, solo se ocupa de la información del sistema operativo / CPU, y necesitaré más que eso.

Además: olvidé mencionarlo explícitamente, pero esto solo será necesario para las máquinas con Windows. ¡Ustedes, amigos, son rápidos!

Edit: Este WMI se parece a lo que necesito, ¡gracias! Sin embargo, bastante lata de gusanos, así que tengo que sumergirme. Menciona que para algunas cosas el usuario debe tener privilegios de administrador; Esto probablemente no será un gran problema, pero podría limitarlo un poco.

¿Fue útil?

Solución

Para este tipo de información WMI es tu amigo. Afortunadamente, tratar con WMI en .NET es mucho más fácil que en el mundo no administrado. Hay muchos artículos para comenzar, como este , o éste para recuperar la información del procesador.

Terminarás escribiendo consultas similares a SQL contra objetos en el espacio de nombres de WMI para recuperar la información que deseas.

Otros consejos

Tal vez considere usar Instrumental de administración de Windows (WMI), suponiendo que se trata de una máquina con Windows cuya planificación se debe consultar. Eche un vistazo a la WMI Code Creator de Microsoft. Puede fácilmente comenzar con ejemplos de código en algunos idiomas.

WMI funciona de manera excelente desde la era de Windows 2000, pero también puede funcionar en máquinas Win98 con alguna ayuda.

Siempre que tenga, o pueda proporcionar, credenciales de administrador para la máquina que está intentando consultar, WMI es definitivamente el camino a seguir.

También podría publicar el código básico que usé para obtener todo lo que necesitaba, usando WMI como se sugiere aquí.

Debo incluir una referencia a System.Management en el proyecto c #. Entonces, la fuente en sí es probablemente una c # terriblemente formada, pero nunca he escrito realmente en ella antes y es para una herramienta interna, por lo que es un punto aparte. Lo he simplificado un poco, así que solo se trata de dar salida a las especificaciones de la máquina (la herramienta hace otras cosas además de eso). Cada llamada a LogClass () elimina todas sus propiedades. Para obtener más clases para descargar, simplemente consulte la sección de MSDN en Clases de 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");
    }
  }
}

Para el caso extraño que estaría desarrollando para Linux, podría encontrar cosas increíbles dentro del pseudofilesystem / proc .

Si decides ir con WMI, es posible que desees consultar WMI Code Creator de Microsoft. Hace que tratar con WMI sea bastante fácil.

Hay un paquete nuget llamado MissingLinq.Linq2Management que ha envuelto casi todo sobre WMI en un bonito objeto fuertemente tipado. Parece bastante agradable.

https://missinglinq.codeplex.com/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top