간단한 Windows Management Instrumentation 도구 wmi2struct

6477 단어 GoWindowsWMI

WMI란 무엇입니까?


마이크로소프트는 Windows PC와 서버에서 다양한 정보를 얻을 수 있는 방법으로 WMI(Windows Management Instrumentation)를 제공했다.
이러한 정보는 WMI 클래스의 구조 저장 형식으로 제공되며 여러 종류가 준비되어 있다.

wmic 명령


명령줄에서 wmic 도구를 사용하여 이 정보에 간단하게 접근할 수 있습니다.

wmic 명령을 조금만 확인하면 편합니다.wmic 명령은 CSV나 XML로 출력하는 옵션이 있지만 프로그램으로 보면 처리하기 매우 어렵다.또한 유형도 없으므로 출력 내용은 WMI 클래스의 정의에 따라 변환되어야 합니다.거기서 편리한 것은 StackExchange/wmi입니다.

StackExchange/wmi 패키지


StackExchangeStackOverflow과 같은 회사가 운영하는 흔한 문제 해결 사이트입니다.Stack Overflow는 Windows 서버에서 웹 서비스를 많이 실행하는 보기 드문 회사로 유명하지만 내부 자원 관리에서 Go 언어로 쓰는 시스템을 사용한다.그 시스템은 StackExchange/wmi를 사용합니다.StackExchange/wmi는 내부적으로 COM을 사용합니다.참고로 Go에서 COM을 처리하는 방법go-ole인 필자가 개발한 포장으로 wmi는 이 go-ole의 포장을 사용했다.
사용 방법은 매우 간단하다. SQL과 같은 WMI 조회를 보내고 WMI 클래스의 기록을 꺼낸다.
package main

import (
    "fmt"
    "log"

    "github.com/StackExchange/wmi"
)

type Win32ComputerSystemProduct struct {
    Caption           string
    Description       string
    IdentifyingNumber string
    Name              string
    SKUNumber         *string
    UUID              string
    Vendor            string
    Version           string
}

func main() {
    var records []Win32ComputerSystemProduct
    err := wmi.Query("SELECT * FROM Win32_ComputerSystemProduct", &records)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(records[0].Vendor)
}
Win32_컴퓨터 시스템 제품은 컴퓨터 제품 정보를 얻을 수 있는 종류다.이 예라면 내 노트북은 HP가 제조한 것이다Hewlett-Packard.
그럼, 이 Win32_컴퓨터 시스템 제품 클래스는 브라우저를 시작하고 Microsoft 페이지로 이동하여 모든 사람의 구조를 얻을 수 있습니다.
[Dynamic, Provider("CIMWin32"), UUID("{FAF76B96-798C-11D2-AAD1-006008C78BC7}"), AMENDMENT]
class Win32_ComputerSystemProduct : CIM_Product
{
  string Caption;
  string Description;
  string IdentifyingNumber;
  string Name;
  string SKUNumber;
  string Vendor;
  string Version;
  string UUID;
};
그렇군요. C#로 썼습니다.위에서 설명한 Go로 교체해야 합니다.귀찮아 보여요.

wmi2struct


그곳에 등장한 것은 이 보도의 주역 wmi2struct이다.
wmi2struct는 명령행 응용 프로그램입니다.사용 방법은 다음과 같다.
Usage of wmi2struct:
  -l    list all classes
  -n    output number fields
  -o string
        output filename
  -p string
        package (default "main")
-l 옵션이 시작되면 PC에서 사용할 수 있는 WMI 클래스에 대한 목록이 표시됩니다.
略
Win32_SystemTrace
Win32_ProcessTrace
Win32_ProcessStartTrace
Win32_ProcessStopTrace
Win32_ThreadTrace
Win32_ThreadStartTrace
Win32_ThreadStopTrace
Win32_ModuleTrace
Win32_ModuleLoadTrace
Win32_PowerManagementEvent
Win32_ComputerSystemEvent
Win32_ComputerShutdownEvent
略
그러면 예를 들어 상술한 사용Win32_ComputerSystemProduct을 매개 변수에 건네준다.
C:\>wmi2struct Win32_ComputerSystemProduct
package main

// Win32_ComputerSystemProduct is struct for WMI
type Win32_ComputerSystemProduct struct {
    Caption           string
    Description       string
    IdentifyingNumber string
    Name              string
    SKUNumber         string
    UUID              string
    Vendor            string
    Version           string
}
C#의 소스라니 Win32_컴퓨터 시스템 제품이 Go 형식으로 출력되는지 여부!편리하다
그런 다음 위에서 설명한 대로 Go의 소스로 저장합니다wmi.Query.아주 편리해요!
우선, Go의string은 C#의string처럼 nil(null)을 저장할 수 없습니다.만약 nil이 WMI 클래스의 값으로 저장될 수 있다면, 이 필드를 *string 로 선언하십시오.wmi 패키지는 잘 변환되고 실행됩니다.이번 사례라면 SKUNumber가 nil을 가질 수 있는 필드입니다.
type Win32_ComputerSystemProduct struct {
    Caption           string
    Description       string
    IdentifyingNumber string
    Name              string
    SKUNumber         *string
    UUID              string
    Vendor            string
    Version           string
}

총결산


이번에는 WMI 클래스를 처리할 수 있는 패키지 StackExchange/wmi와 그에게 맡겨야 할 struct를 간단하게 생성할 수 있는 도구 wmi2struct를 소개했다.PC에 저장된 다양한 정보를 간단히 얻을 수 있기 때문에 어쨌든 사용하세요.

좋은 웹페이지 즐겨찾기