golang으로 Windows Registry에 등록된 NetCfgInstanceId를 얻는 방법
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
}
Congratulations @ssh0702! You received a personal award!
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:
Vote for @Steemitboard as a witness to get one more award and increased upvotes!