Подтвердить что ты не робот

Создать интерактивный повышенный процесс из службы 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 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 of winlogon.exe
  • хотя использование explorer.exe избавляется от терминации, я теряю административные привилегии с этим, что не работает для меня

  • любые идеи, как заставить его работать с токеном процесса winlogon?

  • или можно настроить токен exlorer.exe, чтобы сделать дубликат повышенным? im догадываясь как-то используя TokenElevation и SetTokenInformation или AdjustTokenPrivileges
  • или может быть, что Windows 7 был исправлен, чтобы запретить олицетворение такого процесса?
  • альтернативно, есть ли способ получить конкретный пользовательский токен с правами администратора (а не владельцем SYSTEM), но опять же без знаний/подсказок пароля (исключая CreateProcessWithLogonW)
  • возможно ли это сделать с сборкой мусора?
4b9b3361

Ответ 1

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

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

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

Ответ 2

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