<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409732&amp;view=findpost&amp;p=3688870</guid>
        <pubDate>Sat, 15 Oct 2016 21:28:21 +0000</pubDate>
        <title>LoadUserProfile - Ошибка 1008</title>
        <link>https://forum.sources.ru/index.php?showtopic=409732&amp;view=findpost&amp;p=3688870</link>
        <description><![CDATA[Gen: Вопрос решен. Если кому надо вот НУ ОЧЕНЬ полезная статья<br>
<br>
<a class='tag-url' href='http://www.delphimaster.net/view/2-1234290981/all' target='_blank'>http://www.delphimaster.net/view/2-1234290981/all</a><br>
<br>
Основное внимание на: TOKEN_ADJUST_SESSIONID<br>
<br>
ну и токен получать с нужной сесии, в примерах текущий берется.<br>
<br>
Да и еще не маловажный момент, касательно моего вопроса: ошибка такая то по GetLastError. Проблема не в ошибке а в longbool, правильно обрабатывать надо, ошибок как оказалось почти и не было.]]></description>
        <author>Gen</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409732&amp;view=findpost&amp;p=3688808</guid>
        <pubDate>Sat, 15 Oct 2016 12:31:04 +0000</pubDate>
        <title>LoadUserProfile - Ошибка 1008</title>
        <link>https://forum.sources.ru/index.php?showtopic=409732&amp;view=findpost&amp;p=3688808</link>
        <description><![CDATA[Gen: - Запускаю из под сервиса утилиту под учетной записью пользователя.<br>
<br>
Все пускается хорошо, все работает, но недавно после доработки и необходимости обратиться к директории %tmp% пользователя, появилась проблема в виде того что<br>
все переменные окружения или как они там правильно называются такие же как для сервиса который пускал утилиту.<br>
Например GetEnvironmentVariable(&#39;TMP&#39;) Выдает c:&#092;windows&#092;temp&#092; вместо c:&#092;users&#092;username&#092;Application data .... <br>
<br>
Посмотрел много статей на эту тему, вроде как получается что перед выполнением CreateProcessAsUser необходимо загурзить профайл пользователя, потом <br>
создать какой то энвиромент блок, и его укзатель запихнуть в CreateProcessAsUser<br>
<br>
LoadUserProfile &gt; CreateEnvironmentBlock &gt; CreateProcessAsUser(...And CREATE_UNICODE_ENVIRONMENT....LpvEnv....);<br>
<br>
в некоторых статьях написано что еще перед этим надо выполнить DuplicateTokenEx, в некоторых что перед загрузкой надо сделать ImpersonateLoggedOnUser<br>
в итоге бьюсь уже несколько дней, исчерпались статьи отлючающиеся содержанием где можно было бы что-то еще попробовать, и далее не знаю как быть<br>
<br>
1) Получаю активные сессии:                                                        имею список ID UserName и тд данне по всем текущим сессиям.<br>
2) Выбираю необходимого пользователя, и получаю Token с помощью WTSQueryUserToken: имею токен<br>
3) Выполняю LoadUserProfile с полученным токеном :                                 ОШИБКА: 1008 (Попытка ссылки на несуществующий токен.)<br>
4) Выполняю CreateEnvironmentBlock с полученным токеномЖ                           ОШИБКА:  203 (Системе не удается найти указанный параметр среды.)  <br>
5) Выполняю CreateProcessAsUser с полученным токеном:                              Процесс запускается без ошибок под учетной записью пользователя<br>
<br>
Если бы токен был бы несуществующий то не сработал бы CreateProcessAsUser (кроме того при создании токена не выдает ошибок и он не Nil)<br>
<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Загрузить профайл пробую так:</div><div class="code_line">&nbsp;</div><div class="code_line">UserName:String;</div><div class="code_line">&nbsp;</div><div class="code_line">FillChar(Profile, SizeOf(Profile), 0);</div><div class="code_line">Profile.dwSize:=SizeOf(TProfileInfo);</div><div class="code_line">Profile.lpUserName:=PWideChar(WideString(UserName));;</div><div class="code_line">LoadUserProfile(hToken, Profile);</div><div class="code_line">ОШИБКА: 1008 </div><div class="code_line">&nbsp;</div><div class="code_line">Создать Энвиромент блок пробую так:</div><div class="code_line">&nbsp;</div><div class="code_line">lpvEnv:Pointer;</div><div class="code_line">&nbsp;</div><div class="code_line">CreateEnvironmentBlock(lpvEnv, hToken, True);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<br>
В чем может быть проблема?<br>
<br>
- Если сделать DuplicateTokenEx после WTSQueryUserToken и использовать новый, то разницы никакой все те же ошибки, процесс пускается нормально от указанного пользователя.<br>
- Если сделать ImpersonateLoggedOnUser Перед  LoadUserProfile тогда он выдает ошибку 5.]]></description>
        <author>Gen</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      </channel>
      </rss>
	