douwen3836 2017-12-14 13:03
浏览 121
已采纳

Golang无法枚举注册表项的子项

i'm trying to watch all over the windows registry to find some keys and values. There are some keys, that can't be opened with registry.READ permission, so for me to read values and keys, i have to use registry.QUERY_VALUE and registry.ENUMERATE_SUB_KEYS permissions; BUT after successfully opening key with k.OpenKey() (for example HKEY_LOCAL_MACHINE\SOFTWARE) with such permissions the k.ReadSubKeyNames() function gives an error in BOTH cases:

ReadSubKeyNames: HKEY_LOCAL_MACHINE\SOFTWARE Access is denied.

Of course actual registry keys permission QUERY_VALUE and ENUMERATE_SUB_KEYS is enabled for Administrator (i'm using administrator profile)

How should i get Sub key names without using registry.READ permission and what is the problem?

Code sample:

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
  • 写回答

1条回答 默认 最新

  • dongpao1905 2017-12-14 14:26
    关注

    The answer is using combined value:

    combinedRights := registry.QUERY_VALUE | registry.ENUMERATE_SUB_KEYS
    

    Because k.ReadSubKeyNames() uses k.Stat() inside it, and k.Stat() require registry.QUERY_VALUE right to return successfully, and after that k.ReadSubKeyNames() uses syscall to enumerate subkeys and there are registry.ENUMERATE_SUB_KEYS right is used. Windows registry rights could be summarized using OR on them, so that is the answer.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#lua#的问题,请各位专家解答!
  • ¥15 什么设备可以研究OFDM的60GHz毫米波信道模型
  • ¥15 不知道是该怎么引用多个函数片段
  • ¥15 爬取1-112页所有帖子的标题但是12页后要登录后才能 我使用selenium模拟登录 账号密码输入后 会报错 不知道怎么弄了
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline