执行“reg query”作为新进程不显示所有键

时间:2012-02-24 16:02:36

标签: c windows-7 registry

如果我打电话

REG QUERY HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI

在批处理脚本中,然后显示正确的结果:

ShowTabletKeyboard    REG_DWORD 0x0
LastLoggedOnProvider  REG_SZ    {???}
LastLoggedOnSAMUser   REG_SZ    foo\bar
LastLoggedOnUser      REG_SZ    .\bar

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonU \Background
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\BootAnimation
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\LogonSoundPlayed
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData

如果我在c程序(mingw)中运行上面的命令:

#include <stdio.h>
#include <unistd.h>
int main(void) {
    system("REG QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI");
    return (0);
}

输出

ShowTabletKeyboard    REG_DWORD    0x0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\BootAnimation

输出的其余部分在哪里?哪个权限有误?我对关键的LastLoggedOnUser感兴趣。非常感谢提前。

2 个答案:

答案 0 :(得分:2)

这是registry redirector的行动。你有一个64位系统。批处理文件由本机64位命令解释程序执行。但是你的C程序是32位,system命令作为32位进程运行。这是因为文件重定向器在64位Windows上运行32位进程时将system32转换为syswow64。

所有这些意味着C程序正在读取注册表的32位视图。您尝试阅读HKLM\Software的行为会重定向到HKLM\Software\Wow6432Node

理想的解决方案是停止使用system并使用本机Windows API函数来访问注册表。然后,您可以指定要从注册表的64位视图读取,即使从32位进程也可以访问它。

完全令人反感的黑客就是让你的system命令启动%SystemRoot%\Sysnative\reg.exe,这会强制使用64位版本的reg

答案 1 :(得分:1)

命令提示符为64位,将读取密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI

我怀疑你的应用程序是32位,实际上会读取密钥HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Authentication\LogonUI

有关详细信息,请参阅32-bit and 64-bit Application Data in the Registry