c语言 - 执行"reg query",因为新进程不显示所有键



如果我调用

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位应用程序数据。

最新更新