Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись в реестр других пользователей под WinXP  (Прочитано 7361 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« : 13-11-2013 21:43 » 

Не получается записать данные в реестр другого пользователя под WinXP. Что интересно, под Win7 этот код работает замечательно.
Логин-пароль известны, пользователь локальный.

Делаю так:

Код: (C++)
if (!LogonUser(sLogin.c_str(), ".", sPswd.c_str(), LOGON32_LOGON_INTERACTIVE,
                                                LOGON32_PROVIDER_DEFAULT, &hToken))
        throw NULL;

PROFILEINFO ProfInf = {0};
ProfInf.dwSize = sizeof(PROFILEINFO);
ProfInf.lpUserName = "Test1";

if (!LoadUserProfile(hToken, &ProfInf))
        err = GetLastError();

if (!ImpersonateLoggedOnUser(hToken))
        throw NULL;

// На всякий случай проверяем имя текущего пользователя
char szUserName[MAX_PATH] = {0};
DWORD dwLen = MAX_PATH;
GetUserName(szUserName, &dwLen);

if (RegOpenCurrentUser(KEY_ALL_ACCESS, &hUserKey) == ERROR_SUCCESS)
        bRet = true;

...............................................

if (RegOpenKeyEx(hUserKey,
                         REG_POOL_KEY,
                         0,
                         KEY_ALL_ACCESS,
                         &hKey) != ERROR_SUCCESS)
...............................................

Все вызовы отрабатывают без ошибок и имя пользователя вроде как везде меняется правильно, но в реестре у этого пользователся ничего не меняется.

Запустил Process Explorer:
USERPROFILE показывает другого польователся
а вот
USERNAME остается прежним.

В чем может быть проблема? Я уверен, что это задача тривиальная и многие должны были ее реализовывать по 100 раз, но почему-то на рсдн-е никто ничего толкового так и не посоветовал... Может все-таки здесь найдутся знатоки WinAPI под WinXP? Помогите, пожалуйста!
« Последнее редактирование: 13-11-2013 21:46 от BlackStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-11-2013 23:04 » 

Я вот ни разу такую задачу не реализовывал, поскольку единственное приложение, которое может лазать по чужим пользователям - это инсталлятор, а их вручную обычно не пишут. Налицо специфическая административная задача, и, опять же, системные администраторы её решают не при помощи C++, а при помощи Windows Script Host и разных административных API.

В первую очередь возникает мысль о правах, но тогда были бы ошибки -5 Access denied. Однако по кускам кода видно, что ошибки где-то вызывают исключения, а где-то нет - неаккуратно: кто в лес, кто по дрова. О чём тут можно судить?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 14-11-2013 06:20 » 

В первую очередь возникает мысль о правах, но тогда были бы ошибки -5 Access denied. Однако по кускам кода видно, что ошибки где-то вызывают исключения, а где-то нет - неаккуратно: кто в лес, кто по дрова. О чём тут можно судить?

Ох... Все-таки придрались к коду. Да что ж такое. Говорю же, все функции отрабатывают без ошибок.
LoadUserProfile() и GetUserName() я добавлял на скорую руку просто для проверки - на самом деле, под Win7 всё работает и без них. RegOpenCurrentUser() исключения не вызывает - так надо Ага
Ну, и вообще, код здесь несколько корявый только лишь потому что я много экспериментировал в попытках исправить ситуацию. Не обращайте внимания. Главное - последовательность вызовов и параметры. Под Win7 всё работает, но чего не хватает WinXP???

Вопрос актуален. Очень хочется получить ответы по существу.
« Последнее редактирование: 14-11-2013 06:37 от BlackStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
zubr
Гость
« Ответ #3 : 14-11-2013 07:18 » 

По коду вроде все правильно. Возможно надо понизить уровень токена до SecurityIdentification или SecurityAnonymous, используя DuplicateTokenEx. Хотя, если верить msdn - это делать не обязательно, если токен получен от LogonUser.
 Не все понятно по твоему посту:
1. Какой процесс (из под админа, уровень привилегий) вызывает данный код?
2. Из под какого пользователя проверяется то что записано в реестр ?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #4 : 14-11-2013 14:33 » 

BlackStar, загружайте куст пользователя RegLoadKey и правьте его как обычный путь реестра... и не надо париться с логонами..
Система так поступает, загружая куст вошедшего пользователя в HKEY_USERS и отражая его на псевдохэндл  HKEY_CURRENT_USER
« Последнее редактирование: 14-11-2013 14:39 от sss » Записан

while (8==8)
zubr
Гость
« Ответ #5 : 14-11-2013 17:29 » 

sss, так будет загружен весь куст, а надо конкретного пользователя. То есть тогда надо по имени пользователя определить его сид  (LookupAccountName) и искать в кусте HKEY_USERS ключ с соответствующим именем сида. Но тогда зачем париться с RegLoadKey, когда можно напрямую найти нужный ключ и писать туда.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #6 : 15-11-2013 02:27 » new

sss, так будет загружен весь куст, а надо конкретного пользователя. То есть тогда надо по имени пользователя определить его сид  (LookupAccountName) и искать в кусте HKEY_USERS ключ с соответствующим именем сида. Но тогда зачем париться с RegLoadKey, когда можно напрямую найти нужный ключ и писать туда.

Не понял. Выберите для загрузки user.dat из профиля пользователя - это и будет куст пользователя и никого больше.
Если при попытке загрузки возникнет ERROR_SHARING_VIOLATION значит куст загружен системой (или кем то ещё)..
Если хотите, можете  даже так проверять вошёл ли этом пользователь в систему.

А париться с  RegLoadKey потому что куст может быть не загружен и тогда придется с ней париться.
« Последнее редактирование: 15-11-2013 02:33 от sss » Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines