Наложи ми се да да стартирам процес като друг потребител (който работи на същата машина) от service.
Та единствения вариaнт е CreateProcessAsUser който изисква обаче един token. Има доста начини да се вземе token, но голяма част от тях изискваха и паролата на потребителя с цел LoginUser което беше безумие.
Та лутайки се се сетих че и WinLogon някак си успява да стартира TaskMgr с акаунта на текущия потребител което е странно защото WinLogon работи на ниво System. Значи начини имаше. Стартирах набързо един WinDBG и видях как го правят.
Следва псевдо-код който прави подобна задачка:
OpenProcess
OpenProcessToken
DuplicateTokenEx (SecurityImpersonation) <- Най-важния параметър
CreateProcessAsUser
Разяснение: Имаме стартиран процес от потребител USER. Услугата (service) ни работи на ниво System. Намираме процеса който работи под този потребител, отваряме го и му вземаме token. След което го дупликираме с важния (да се чете НАЙ-Важния) параметър и си извикваме като пичове CreateProcessAsUser без да знаем паролата на потребителя.
Всичко това естественно е прекрасно, но работи само под потребители с ранг Administrator и SYSTEM. На останалите не съм го тествал. Под обикновенни потребители НЕ РАБОТИ защото не може да се отвори процеса (още първия ред) поради ниски привилегии.
Кода който работи в WinLogon е подобен, но там го правят малко по-странно. Всичко това с tokens е подобно. Но там правят текущия thread да работи под зададения потребител (NtSetInformationThread) стартират процеса с CreateProcessAsUser, след което връщат привилегиите на зададения thread до предишните такива. За сега смисъла на тази врътка ми остава неразбран.