У меня есть служба, которая запускает процесс приложения WPF, когда пользователь входит в систему.
Но почему-то приложение WPF погибает примерно через 10 минут после его создания? Окончание немедленно, без следов, найденных в Журнале событий, и никаких нормальных событий закрытия/выхода, вызываемых в приложении WPF.
Фактически, когда происходит завершение, Windows 7, кажется, виснет на секунду, мышь перестает отвечать на запросы, а затем действует на жесты мыши после короткой задержки (когда она нормализуется, но теперь отсутствует созданный процесс).
Когда
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
CanHandleSessionChangeEvent = true;
}
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
if (changeDescription.Reason == SessionChangeReason.SessionLogon
&& changeDescription.SessionId > 0)
{
ApplicationLoader.PROCESS_INFORMATION procInfo;
ApplicationLoader.StartProcessAndBypassUAC(@"myapp.exe", out procInfo);
}
base.OnSessionChange(changeDescription);
}
}
Создание процесса Как для Pero Matic Code
// ...
bool result = CreateProcessAsUser(hUserTokenDup, // client access token
null, // file to execute
applicationName, // command line
ref sa, // pointer to process SECURITY_ATTRIBUTES
ref sa, // pointer to thread SECURITY_ATTRIBUTES
false, // handles are not inheritable
dwCreationFlags, // creation flags
IntPtr.Zero, // pointer to new environment block
null, // name of current directory
ref si, // pointer to STARTUPINFO structure
out procInfo // receives information about new process
);
- завершение, похоже, не происходит, если я целевую notepad.exe, однако?
- протестировал его с помощью ванильного\пустого приложения WPF (.NET 4), и он также разбился
Создание процесса с административными привилегиями и без запроса
- Кажется, что проблема заключается в попытке дублировать административный токен
SYSTEM
изwinlogon.exe
(но который работает в сеансе 1+), потому что если вы дублируете конкретный токен пользователя (например, отexplorer.exe
), катастроф уже нет! - это подтверждается тем же самым приложением WPF-приложения vanilla/empty и с запуском кода Marcel Roma здесь - обратите внимание, что вместо этого он использует
explorer.exe
ofwinlogon.exe
-
хотя использование
explorer.exe
избавляется от терминации, я теряю административные привилегии с этим, что не работает для меня -
любые идеи, как заставить его работать с токеном процесса
winlogon
? - или можно настроить токен
exlorer.exe
, чтобы сделать дубликат повышенным? im догадываясь как-то используя TokenElevation и SetTokenInformation или AdjustTokenPrivileges - или может быть, что
Windows 7
был исправлен, чтобы запретить олицетворение такого процесса? - альтернативно, есть ли способ получить конкретный пользовательский токен с правами администратора (а не владельцем
SYSTEM
), но опять же без знаний/подсказок пароля (исключаяCreateProcessWithLogonW
) - возможно ли это сделать с сборкой мусора?