golang으로 Windows Registry에 등록된 NetCfgInstanceId를 얻는 방법

in #go6 years ago (edited)

Windows Registry에 등록된 NetCfgInstanceId를 획득하는 방법을 구현해 본다.
Windows는 Registry에 디바이스 정보를 등록할 때, 미리 정해진 GUID 값에 맞게 등록이 된다.

  • CDROM: 4D36E965-E325–11CE-BFC1–08002BE10318
  • Keyboard: 4D36E96B-E325–11CE-BFC1–08002BE10318
  • Modem: 4D36E96D-E325–11CE-BFC1–08002BE10318
  • Mouse: 4D36E96F-E325–11CE-BFC1–08002BE10318
  • Net: 4D36E972-E325–11CE-BFC1–08002BE10318

이 중에서 Net 클래스의 GUID 값을 Key로 사용한다.

SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325–11CE-BFC1–08002BE10318}

GUID 값을 기준으로 Windows Registry를 확인해보면 아래와 같이 등록된 모든 Net에 대한 정보를 확인할 수 있다.
여기에는 물리하드웨어 뿐만 아니라 virtualbox와 같은 가상머신에서 설치된 드라이버까지 모두 보인다.

이제 golang 코드를 이용해서 해당 값을 얻어본다.

package main

import (
    "fmt"
    "log"
    "golang.org/x/sys/windows/registry"
)

const ADAPTER_KEY = `SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325–11CE-BFC1–08002BE10318}`

func main() {
    k, err := registry.OpenKey(registry.LOCAL_MACHINE, 
                   ADAPTER_KEY,                         
                   registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE)
    if err != nil {
        log.Fatal(err)
    }
    defer k.Close()
    
    keyNames, err := k.ReadSubKeyNames(-1)
    if err != nil {
        log.Fatal(err)
    }

    for _, keyName := range keyNames {
        n, _ := matchKey(k, keyName)
        if n != "" {
            fmt.Println(n)
        }
    }
}

func matchKey(zones registry.Key, keyName string) (string, error) {
    k, err := registry.OpenKey(zones, keyName, registry.READ)
    if err != nil {
        return "", err
    }
    defer k.Close()

    netCfgInstanceId, _, err := k.GetStringValue("NetCfgInstanceId")
    if err != nil {
        return "", err
    }

    return netCfgInstanceId, nil
}
Sort:  

Congratulations @ssh0702! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Do not miss the last post from @steemitboard:

Carnival Challenge - Here are the winners
Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Coin Marketplace

STEEM 0.15
TRX 0.25
JST 0.031
BTC 84750.12
ETH 1580.64
USDT 1.00
SBD 0.73