2017-12-14 45 views
0

의 하위 키를 열거 할 수 없습니다. 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 

답변

0

해답 결합하여 값 : k.ReadSubKeyNames는()) k.Stat() 안에 및 k.Stat을 (사용

combinedRights := registry.QUERY_VALUE | registry.ENUMERATE_SUB_KEYS 

때문에 요구를 registry.QUERY_VALUE를 반환하면 성공적으로 반환되고 k.ReadSubKeyNames()는 syscall을 사용하여 하위 키를 열거하고 registry.ENUMERATE_SUB_KEYS 권한이 사용됩니다. Windows 레지스트리 권한은 OR을 사용하여 요약 될 수 있으므로 대답이됩니다.