의 하위 키를 열거 할 수 없습니다. Windows 레지스트리 전체에서 일부 키와 값을 찾으려고합니다. registry.READ 권한으로 열 수없는 몇 가지 키가 있습니다. 따라서 값과 키를 읽으려면 registry.QUERY_VALUE 및 registry.ENUMERATE_SUB_KEYS 권한을 사용해야합니다. BUT 성공적 권한 (예 HKEY_LOCAL_MACHINE \ 소프트웨어 용) k.OpenKey()이 함수는 두 경우 모두 오류 범()를 k.ReadSubKeyNames 키 개봉 후 :golang이 레지스트리 키
ReadSubKeyNames를 HKEY_LOCAL_MACHINE \ 소프트웨어 액세스가 거부 . 물론 실제 레지스트리 키 권한 QUERY_VALUE 및 ENUMERATE_SUB_KEYS이
가 어떻게 registry.READ 권한을 사용하지 않고 하위 키 이름을 받아야하고 문제가 무엇입니까 (내가 관리자 프로파일을 사용하고 있습니다) 관리자를 사용할 수있다의
?
코드 샘플 :
var (
queryVal uint32 = registry.QUERY_VALUE
enumSubs uint32 = registry.ENUMERATE_SUB_KEYS
)
k, err = registry.OpenKey(globalK, p, queryVal)
if err != nil {
logErr(wrapErr(fmt.Sprintf("registry.OpenKey: %s", keyPath), err))
return
}
defer k.Close()
newKey := someLocalType{
}
keyStat, err := k.Stat()
if err != nil {
logWarn(fmt.Sprintf("Stat: %s %v", keyPath, err))
return
}
newKey.mod = keyStat.ModTime()
n, err := k.ReadValueNames(-1)
if err != nil {
logWarn(fmt.Sprintf("ReadValueNames: %s %v", keyPath, err))
return
}
for _, each := range n {
v, err := getKeyValue(k, each, keyStat.MaxValueLen)
if err != nil {
logWarn(fmt.Sprintf("getKeyValue: %s %v", keyPath, err))
continue
}
newKey.val = append(newKey.val, v)
}
var k1 registry.Key
if len(p) != 0 {
k1, err = registry.OpenKey(globalK, p, enumSubs)
if err != nil {
logErr(wrapErr(fmt.Sprintf("registry.OpenKey: %s", keyPath), err))
return
}
defer k1.Close()
} else {
k1 = globalK
}
subNames, err := k1.ReadSubKeyNames(-1)
if err != nil {
logWarn(fmt.Sprintf("ReadSubKeyNames: %s %v", keyPath, err))
return
}
for _, each := range subNames {
newPath := joinPath(p, each)
scanKey(globalK, newPath, c)
}
return