Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Система, Windows API > LoadUserProfile - Ошибка 1008


Автор: Gen 15.10.16, 12:31
- Запускаю из под сервиса утилиту под учетной записью пользователя.

Все пускается хорошо, все работает, но недавно после доработки и необходимости обратиться к директории %tmp% пользователя, появилась проблема в виде того что
все переменные окружения или как они там правильно называются такие же как для сервиса который пускал утилиту.
Например GetEnvironmentVariable('TMP') Выдает c:\windows\temp\ вместо c:\users\username\Application data ....

Посмотрел много статей на эту тему, вроде как получается что перед выполнением CreateProcessAsUser необходимо загурзить профайл пользователя, потом
создать какой то энвиромент блок, и его укзатель запихнуть в CreateProcessAsUser

LoadUserProfile > CreateEnvironmentBlock > CreateProcessAsUser(...And CREATE_UNICODE_ENVIRONMENT....LpvEnv....);

в некоторых статьях написано что еще перед этим надо выполнить DuplicateTokenEx, в некоторых что перед загрузкой надо сделать ImpersonateLoggedOnUser
в итоге бьюсь уже несколько дней, исчерпались статьи отлючающиеся содержанием где можно было бы что-то еще попробовать, и далее не знаю как быть

1) Получаю активные сессии: имею список ID UserName и тд данне по всем текущим сессиям.
2) Выбираю необходимого пользователя, и получаю Token с помощью WTSQueryUserToken: имею токен
3) Выполняю LoadUserProfile с полученным токеном : ОШИБКА: 1008 (Попытка ссылки на несуществующий токен.)
4) Выполняю CreateEnvironmentBlock с полученным токеномЖ ОШИБКА: 203 (Системе не удается найти указанный параметр среды.)
5) Выполняю CreateProcessAsUser с полученным токеном: Процесс запускается без ошибок под учетной записью пользователя

Если бы токен был бы несуществующий то не сработал бы CreateProcessAsUser (кроме того при создании токена не выдает ошибок и он не Nil)


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Загрузить профайл пробую так:
     
    UserName:String;
     
    FillChar(Profile, SizeOf(Profile), 0);
    Profile.dwSize:=SizeOf(TProfileInfo);
    Profile.lpUserName:=PWideChar(WideString(UserName));;
    LoadUserProfile(hToken, Profile);
    ОШИБКА: 1008
     
    Создать Энвиромент блок пробую так:
     
    lpvEnv:Pointer;
     
    CreateEnvironmentBlock(lpvEnv, hToken, True);



В чем может быть проблема?

- Если сделать DuplicateTokenEx после WTSQueryUserToken и использовать новый, то разницы никакой все те же ошибки, процесс пускается нормально от указанного пользователя.
- Если сделать ImpersonateLoggedOnUser Перед LoadUserProfile тогда он выдает ошибку 5.

Автор: Gen 15.10.16, 21:28
Вопрос решен. Если кому надо вот НУ ОЧЕНЬ полезная статья

http://www.delphimaster.net/view/2-1234290981/all

Основное внимание на: TOKEN_ADJUST_SESSIONID

ну и токен получать с нужной сесии, в примерах текущий берется.

Да и еще не маловажный момент, касательно моего вопроса: ошибка такая то по GetLastError. Проблема не в ошибке а в longbool, правильно обрабатывать надо, ошибок как оказалось почти и не было.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)