Выполните «reg query», так как новый процесс не отображает все ключи - PullRequest
3 голосов
/ 24 февраля 2012

Если я вызываю

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

Если я запускаю указанную выше команду из программы ac (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 ]

2 голосов
/ 24 февраля 2012

Это действие перенаправителя реестра .У вас есть 64-битная система.Пакетный файл выполняется собственным 64-битным интерпретатором команд.Но ваша C-программа 32-битная, а команда system работает как 32-битный процесс.Это происходит из-за перенаправителя файлов, который переводит system32 в syswow64, когда вы запускаете 32-битный процесс в 64-битной Windows.

Все это означает, что программа на C считывает данные из 32-разрядного представления реестра.Ваша попытка чтения HKLM\Software перенаправляется на HKLM\Software\Wow6432Node.

. Идеальным решением будет прекращение использования system и использование собственных функций Windows API для доступа к реестру.Затем вы можете указать, что вы хотите читать из 64-битного представления реестра, и вы можете получить доступ к нему даже из 32-битного процесса.запустить %SystemRoot%\Sysnative\reg.exe, что приведет к использованию 64-битной версии reg.

1 голос
/ 24 февраля 2012

Командная строка будет 64-битной и будет читать ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI.

Я подозреваю, что ваше приложение 32-битное и на самом деле прочитает ключ HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Authentication\LogonUI.

См. 32-битные и 64-битные данные приложений в реестре для получения дополнительной информации.

...