私は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