如果我调用
REG QUERY HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUI
在批处理脚本中,则显示正确的结果:
ShowTabletKeyboard REG_DWORD 0x0
LastLoggedOnProvider REG_SZ {???}
LastLoggedOnSAMUser REG_SZ foobar
LastLoggedOnUser REG_SZ .bar
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonU Background
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUIBootAnimation
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUILogonSoundPlayed
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUISessionData
如果我在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_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUIBackground
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUIBootAnimation
剩下的输出在哪里?哪些权限是错误的?我对LastLoggedOnUser密钥感兴趣。非常感谢。
这是注册表重定向程序的操作。您有一个64位系统。批处理文件由本机64位命令解释器执行。但是您的C程序是32位的,system
命令作为32位进程运行。这是因为当您在64位Windows上运行32位进程时,文件重定向器会将system32转换为syswow64。
所有这些都意味着C程序正在读取注册表的32位视图。您读取HKLMSoftware
的尝试被重定向到HKLMSoftwareWow6432Node
。
理想的解决方案是停止使用system
,并使用本机Windows API函数来访问注册表。然后,您可以指定要从注册表的64位视图中读取,甚至可以从32位进程中访问该视图。
一个完全令人反感的黑客攻击是让你的system
命令启动%SystemRoot%Sysnativereg.exe
,这将强制使用64位版本的reg
。
命令提示符为64位,将读取密钥HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUI
。
我怀疑您的应用程序是32位的,并且实际上会读取密钥HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionAuthenticationLogonUI
。
有关详细信息,请参阅注册表中的32位和64位应用程序数据。