создать интерактивный процесс с повышенными правами из службы Windows и показать вошедшему в систему пользователю -

У меня есть служба, которая запускает процесс приложения 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

//...
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, однако?
  • проверил его с помощью vanilla\пустого приложения 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)
  • может быть, это как-то связано со сборкой мусора?

13
задан Cel 27 March 2012 в 20:45
поделиться