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

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

// ...
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)
  • это может быть как-то связано с сборкой мусора?

Ответы [ 2 ]

5 голосов
/ 06 апреля 2012

Ну, я просто предлагаю вам обойти: почему вы не помещаете свои основные функциональные возможности в службу Windows, а затем используете приложение wpf в качестве внешнего интерфейса?Так что, если пользователь убьет его, он не остановит службу.Затем служба может регулярно проверять, запущен ли внешний интерфейс wpf, и при необходимости перезапускать его.

Я думаю, это будет более «доверенный» дизайн, чем тот, который вы пытаетесь сделать, что можетпусть антивирус считает вас плохим программным обеспечением и блокирует вас.

А для защиты службы Windows здесь возникает еще один вопрос: Защита службы Windows от ненадежных пользователей

2 голосов
/ 02 апреля 2012

Я не думаю, что вы можете (и определенно не должны быть в состоянии) сделать это. Лучше всего создать приложение, которому не нужны повышенные привилегии, а затем использовать IPC для связи с вашим сервисом, который затем выполняет административные задачи от имени пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...