如果我打电话
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感兴趣。非常感谢提前。
答案 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。