2017-12-14 5 views
0

私はWindowsレジストリのすべてを監視して、いくつかのキーと値を見つけようとしています。私は値とキーを読み取るために、私はregistry.QUERY_VALUEとregistry.ENUMERATE_SUB_KEYSの許可を使用する必要があるので、いくつかのキーはregistry.READ権限で開くことができません。 しかし、正常なアクセス権を持つ(たとえば、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 

をレジストリ.QUERY_VALUEは正常に返されます。その後、k.ReadSubKeyNames()はsyscallを使用してサブキーを列挙し、registry.ENUMERATE_SUB_KEYS権利が使用されます。 Windowsのレジストリの権利は、ORを使用して要約することができるので、それが答えです。

関連する問題