문제

프로그래밍 방식 인터페이스를 통해 로컬 컴퓨터의 사양 (CPU 사양, OS 버전, 그래픽 카드 사양 및 드라이버 등의 범위)을 쿼리 할 수있는 방법은 무엇입니까? 우리는 C#에 간단한 앱을 작성하여 기본 앱의 호환성을 테스트하고 일부 시스템 메트릭을 덤프하고 싶지만, 시작해야 할 곳, 사용하는 인터페이스, 라이브러리 등을 찾을 수는 없습니다.

모든 종류의 검색을 시도했지만 사용자가 상호 작용하거나 설치 해야하는 프로그램 만 찾을 수 있습니다.

또는 소규모 명령 줄 프로그램은 테스트 앱과 함께 배포 할 수있는 한 마찬가지로 작동합니다.

원하는 사양을 얻는 하나의 프로그램을 찾았습니다. psinfo. 그러나 명령 줄 앱이더라도 각 사용자가 처음 실행될 때 일부 라이센스에 동의 해야하는 것 같습니다. 또한 OS/CPU 정보 만 다루며 그 이상이 필요합니다.

또한 : 명시 적으로 언급하는 것을 잊어 버렸지 만 실제로 이것은 Windows 시스템에만 필요할 것입니다. 당신은 빠릅니다!

편집 :이 WMI는 내가 필요한 것과 같습니다. 감사합니다! 그래도 벌레의 캔이 캔에 들어가야합니다. 일부는 사용자에게 관리자 권한이 있어야한다고 언급합니다. 이것은 아마도 큰 문제는 아니지만 조금 제한 할 수 있습니다.

도움이 되었습니까?

해결책

이 유형의 정보에 대해 WMI 당신의 친구입니다. 다행스럽게도 .NET에서 WMI를 다루는 것은 관리되지 않은 세계보다 훨씬 쉽습니다. 시작할 기사가 많이 있습니다. 이 하나, 또는 이 하나 프로세서 정보를 검색합니다.

원하는 정보를 검색하기 위해 WMI 네임 스페이스의 객체에 대해 SQL과 같은 쿼리를 작성하게됩니다.

다른 팁

아마도 사용을 살펴보십시오 Windows Management Instrumentation (WMI), 쿼리 계획을 세우는 Windows 시스템이라고 가정합니다. 살펴보십시오 WMI 코드 제작자 Microsoft에서. 몇 가지 언어로 코드 샘플을 쉽게 사용할 수 있습니다.

WMI는 Windows 2000 ERA로 돌아가는 전반적으로 우수하게 작동하지만 Win98 머신에서도 도움이 될 수도 있습니다.

쿼리하려는 컴퓨터에 대한 관리자 자격 증명을 가지고 있거나 제공 할 수있는 한 WMI는 확실히 갈 길입니다.

여기에서 제안 된대로 WMI를 사용하여 필요한 모든 것을 얻는 데 사용한 기본 코드를 게시 할 수도 있습니다.

C# 프로젝트에 System.management에 대한 참조를 포함해야합니다. 그런 다음 소스 자체는 아마도 C#이 끔찍하게 형성되었을 것입니다. 그러나 나는 이전에 실제로 작성한 적이 없으며 내부 도구를위한 적이 없으므로 요점 외에도 마찬가지입니다. 나는 그것을 조금 단순화하여 실제로 출력 기계 사양을 다루는 것입니다 (도구는 그 외에 다른 일을합니다). logclass ()에 대한 각 호출은 모든 속성을 덤프합니다. 더 많은 수업을 덤프하려면 MSDN 섹션을 확인하십시오. 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");
    }
  }
}

당신이 Linux를 위해 개발할 이상한 경우에, 당신은 내부에서 멋진 것들을 찾을 수 있습니다. /proc 의사 시스템.

WMI와 함께 가기로 결정한 경우 WMI 코드 제작자 Microsoft에서. WMI를 다루는 것이 매우 쉽습니다.

Nuget 패키지가 있습니다 MissingLinq.Linq2Management 그것은 WMI에 관한 거의 모든 것을 강력하게 입력 한 객체로 포장했습니다. 꽤 멋져 보입니다.

https://missinglinq.codeplex.com/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top