Мне нужно открыть и изменить ключ реестра пользователя из 32-разрядной службы (обратите внимание, что пользователь не вошел в систему в то время.) Я делаю следующее:
//For simplicity error checks are not shown
//I also made sure to enable the following privileges:
// SE_RESTORE_NAME, SE_BACKUP_NAME
//"ntuser.dat" = is the file OS uses to load user's profile
if(RegLoadKey(HKEY_LOCAL_MACHINE, L"Test123", L"C:\\Users\\UserA\\ntuser.dat") == ERROR_SUCCESS)
{
HKEY hKey;
DWORD dwRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
L"Test123\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\TrayNotify"),
NULL, KEY_READ | KEY_WOW64_64KEY, &hKey);
//'dwRes' = is returned as 2, or ERROR_FILE_NOT_FOUND
RegUnLoadKey(HKEY_LOCAL_MACHINE, L"Test123");
}
Проблема в том, что Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
ключ не загружен, хотя я знаю, что он существует в реальном профиле пользователя. Я могу убедиться в этом, загрузив учетную запись пользователя и используя 64-битный regedit.
Я подозреваю, что это как-то связано с перенаправлением Wow64, но я не могу понять, что я делаю не так?
РЕДАКТИРОВАТЬ: Добавлена проверка ошибок для первого API.
Я думаю, что понял. Два исправления к моему оригинальному коду:
Во-первых, с Vista мне нужно загрузить Usrclass.dat
файл для улья классов а не ntuser.dat
, Это имеет смысл, потому что ntuser.dat
является частью перемещаемого профиля пользователя и Classes\Local Settings
не вписывается в картину хорошо. Так вот расположение Usrclass.dat
файл, который содержит данные пользователя, не находящегося в роуминге (в основном COM, но также и некоторые другие настройки):
% LocalAppData% \ Microsoft \ Windows \ Usrclass.dat
Ключ, который нужно открыть после загрузки пользовательского улья:
Test123 \ Локальные настройки \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ TrayNotify
это потому что оригинал HKCU\Software\Classes
перенаправлен на HKU\<UserSID>_Classes
который хранится в Usrclass.dat
файл.
Других решений пока нет …