В большинстве примеров указаная выше схема для запуска процессов. Я не могу понять одного момента, сто раз перечитал внимательно описание этих функций, зачем нужен вызов DuplicateTokenEx? Если WTSQueryUserToken возращает "obtains the primary access token", и CreateProcessAsUserW принимает "A handle to the primary token that represents a user. The handle must have the TOKEN_QUERY, TOKEN_DUPLICATE, and TOKEN_ASSIGN_PRIMARY access rights". Нафига нужна DuplicateTokenEx? Все работет без нее прекрасно...
Возможно, вызов DuplicateTokenEx() необходим для точной спецификации маски доступа, поскольку WTSQueryUserToken(), как можно видеть, не позволяет её задать (в описании функции мы не заметили явного указания на то, что выдаётся хендл с полными правами, и, следовательно, формально на это нельзя полагаться). С другой стороны, для дупликации необходимо иметь в маске доступа существующего хендла TOKEN_DUPLICATE, на что тоже рассчитывать нельзя. Если в примерах используется схема "попробовать дупликацию, если не получилось – воспользовать оригинальный хендл", то всё сходится, если же нет, то данная схема лишь следствие кочующего из примера в пример кода.
Ну вот судя по "WTSQueryUserToken is intended for highly trusted services." и "must be running within the context of the LocalSystem account", с связи с такими запросами, предпологаю,что она юзает копию полученую от процесса логина юзера. Но вот это чудо меня ставит в полный тупик http://msdn.microsoft.com/en-us/library/ms802203.aspx "WTSQueryUserToken (WTSGetActiveConsoleSessionId(), &hImpersonationToken)" и коменты выше и ниже... Индуский косячекс?