У меня есть служба, которая порождает процесс приложения 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);
}
}
// ...
bool result = CreateProcessAsUser(hUserTokenDup, // client's 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 и запущенным кодом Марселя Рома здесь - обратите внимание, что он использует
explorer.exe
вместо winlogon.exe
хотя использование explorer.exe
избавляет от завершения я теряю административные привилегии с тем, что у меня не работает
есть идеи, как заставить его работать с winlogon
маркером процесса?
- или можно отрегулировать токен
exlorer.exe
для повышения дубликата? я угадываю как-то используя TokenElevation и SetTokenInformation или AdjustTokenPrivileges
- или может быть,
Windows 7
был исправлен, чтобы запретить такое олицетворение процесса?
- альтернативно, есть ли способ получить определенный пользовательский токен с правами администратора (а не владельцем
SYSTEM
), но опять же, без знания пароля / подсказок (исключая CreateProcessWithLogonW
)
- это может быть как-то связано с сборкой мусора?