문제
프로그래밍 방식 인터페이스를 통해 로컬 컴퓨터의 사양 (CPU 사양, OS 버전, 그래픽 카드 사양 및 드라이버 등의 범위)을 쿼리 할 수있는 방법은 무엇입니까? 우리는 C#에 간단한 앱을 작성하여 기본 앱의 호환성을 테스트하고 일부 시스템 메트릭을 덤프하고 싶지만, 시작해야 할 곳, 사용하는 인터페이스, 라이브러리 등을 찾을 수는 없습니다.
모든 종류의 검색을 시도했지만 사용자가 상호 작용하거나 설치 해야하는 프로그램 만 찾을 수 있습니다.
또는 소규모 명령 줄 프로그램은 테스트 앱과 함께 배포 할 수있는 한 마찬가지로 작동합니다.
원하는 사양을 얻는 하나의 프로그램을 찾았습니다. psinfo. 그러나 명령 줄 앱이더라도 각 사용자가 처음 실행될 때 일부 라이센스에 동의 해야하는 것 같습니다. 또한 OS/CPU 정보 만 다루며 그 이상이 필요합니다.
또한 : 명시 적으로 언급하는 것을 잊어 버렸지 만 실제로 이것은 Windows 시스템에만 필요할 것입니다. 당신은 빠릅니다!
편집 :이 WMI는 내가 필요한 것과 같습니다. 감사합니다! 그래도 벌레의 캔이 캔에 들어가야합니다. 일부는 사용자에게 관리자 권한이 있어야한다고 언급합니다. 이것은 아마도 큰 문제는 아니지만 조금 제한 할 수 있습니다.
다른 팁
아마도 사용을 살펴보십시오 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에 관한 거의 모든 것을 강력하게 입력 한 객체로 포장했습니다. 꽤 멋져 보입니다.