Pergunta

Quais são algumas maneiras que eu posso consultar as especificações da máquina local (uma gama de coisas de especificações de CPU, versão do sistema operacional, especificações da placa gráfica e drivers, etc.) através de uma interface de programação? Estamos escrevendo um aplicativo simples em C # para compatibilidade teste do nosso aplicativo principal e quer tê-lo despejar algumas métricas do sistema, mas eu não consigo encontrar onde começar mesmo, o que interfaces para uso, bibliotecas, qualquer coisa.

Eu tentei todos os tipos de pesquisas, mas só pode encontrar programas e os GUI em que, o que requer um usuário para interagir com, ou tem que instalar.

Como alternativa, um pequeno programa, linha de comando iria funcionar tão bem, enquanto nós estaríamos autorizados a distribuí-lo com o aplicativo de teste.

Eu encontrei um programa que recebe algumas das especificações que eu quero, PsInfo . No entanto, parece exigir que cada usuário concorda em alguma licença quando ele é executado pela primeira vez, mesmo que seja um aplicativo de linha de comando. Além disso, ele só lida com OS / info CPU, e vou precisar mais do que isso.

Além disso: esqueci de mencionar explicitamente, mas este fato só vai ser necessário para máquinas Windows. Você pessoas são rápidos!

Edit: Este WMI se parece com o que eu preciso, muito obrigado! Bastante uma lata de vermes, então eu tenho que mergulhar em Menciona que para algumas coisas que o usuário tem que ter privilégios de administrador.; este provavelmente não será um grande problema, mas pode limitá-lo um pouco.

Foi útil?

Solução

Para este tipo de informação WMI é seu amigo. Felizmente lidar com WMI em .NET é muito mais fácil do que no mundo não gerenciado. Há um monte de artigos lá fora, para começar com, como esta , ou esta para recuperar informações do processador.

Você vai acabar de escrever SQL-como consultas em objetos no namespace WMI para recuperar as informações que deseja.

Outras dicas

Talvez olhar em usar Windows Management Instrumentation (WMI), assumindo que é uma máquina Windows o seu planejamento para consulta. Dê uma olhada na WMI Código Creator da Microsoft. Ele pode facilmente levá-lo indo com amostras de código para em alguns idiomas.

WMI funciona excelente todo o caminho de volta para a era Windows 2000, mas também pode trabalhar em máquinas Win98 também com alguma ajuda.

Enquanto você tem, ou pode fornecer, credenciais de administrador para a máquina que você está tentando consulta, WMI é definitivamente o caminho a percorrer.

Eu poderia muito bem colocar o código básico que usei para obter tudo o que eu precisava, usando WMI como foi sugerido aqui.

Gotta incluir uma referência a System.Management no projeto c #. Então, a própria fonte é provavelmente terrivelmente formado c #, mas eu nunca realmente escrito nele antes e é de uma ferramenta interna, de modo que é uma espécie de além do ponto. Eu simplificado um pouco por isso é realmente lidar com a saída de especificações da máquina (a ferramenta faz outras coisas além disso). Cada chamada para LogClass () despeja todas as suas propriedades. Para mais classes para despejar fora, apenas confira a seção MSDN em 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");
    }
  }
}

Para o caso estranho que você estaria desenvolvendo para Linux, você pode encontrar coisas incríveis dentro da pseudofilesystem /proc.

Se você decidir ir com WMI, você pode querer verificar o WMI Código Criador da Microsoft. Faz lidar com WMI muito fácil.

Há um pacote NuGet chamado MissingLinq.Linq2Management que envolveu praticamente tudo sobre WMI em um belo objeto fortemente tipado. Parece bastante agradável.

https://missinglinq.codeplex.com/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top