Как я могу автоматически запустить UI-приложение под окнами, которые не могут быть закрыты пользователем без прав администратора? - PullRequest
3 голосов
/ 04 января 2012

Я разработал приложение C # для Windows Forms, которое работает в фоновом режиме в виде значка системного окна и выполняет некоторые действия при его нажатии.Предполагается, что он запускается, когда Windows запускается и работает непрерывно, и обычному пользователю без прав администратора не разрешается его отключать.

Каков наилучший способ сделать это?Сначала я намеревался запустить его с учетной записью LocalSystem через планировщик задач, но затем я узнал (трудный путь) об изоляции сеанса 0 (т.е. приложение будет работать, но его элементы пользовательского интерфейса не отображаются).Когда я запускаю его с вошедшим в систему пользователем, даже если он работает с повышенными правами, он все равно может отключить его через диспетчер задач (не требуя повышения прав).

Есть ли способ предоставить процессу из LocalSystem доступ кпользовательский интерфейс?У меня есть winlogon и процесс csrss из LocalSystem, запущенный в сеансе 1, поэтому я предполагаю, что можно сделать, я просто не знаю как.Или, может быть, есть более простой способ запретить пользователям закрывать собственные процессы через диспетчер задач?Единственный другой вариант, о котором я могу подумать, - это создать дополнительную Службу Windows, которая будет опрашивать, если приложение работает, и сразу же запускать его снова, если кто-то его убьет, - но это кажется невероятно неуклюжимпотерпел крах, чтобы избежать единственной ошибки, вызывающей бесконечные циклы создания процесса).

Ответы [ 2 ]

1 голос
/ 04 января 2012

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

Если есть что-то, что они должны увидеть, но непотому что они не запускают приложение службы мониторинга.(и подтвердите сообщение обратно в службу), отправьте им электронное письмо, отправьте их начальнику электронное письмо, отправьте себе одно и затем кричите на них .....

Быть намного проще, чем пытаться получитьзакройте эту банку с червями.

Хороший способ убедиться в том, что настольное приложение запускается, было бы просто запланировать запуск каждого X, но сразу же отключить его, если оно уже есть, или что-то ужасно неправильноеset.

Не стоит писать сервис, чтобы проверить, все еще ли он там, так как они тоже могут его убить, если только вы не хотите сделать сервис, который они не могут убить.: (

Вы пытаетесь быть слишком суровым с этим. Добавьте какой-нибудь аудит, чтобы вы могли видеть, что он умирает или был выключен, отслеживать это и иметь дело с любыми неблагоприятными сообщениями. Это чертовски легко,и дает умудриться чем-то заняться ...

0 голосов
/ 05 января 2012

Вы можете запустить административный процесс в сеансе входа пользователя.Один из методов заключается в том, чтобы главный процесс (системная служба) дублировал свой собственный токен, использовал SetTokenInformation для изменения сеанса, связанного с токеном, а затем вызвал CreateProcessAsUser.Параметр lpStartupInfo может использоваться для связи процесса с конкретной оконной станцией и рабочим столом.Может потребоваться сначала явно изменить разрешения для оконной станции и рабочего стола.

ОДНАКО, это плохая идея с точки зрения безопасности, поскольку приложения с графическим интерфейсом пользователя уязвимы для вредоносных сообщений, отправляемых другими процессами в том жеdesktop («shatter attack»).

Было бы безопаснее запустить процесс в собственном контексте пользователя, но применить к нему ACL.Это можно сделать с помощью параметра lpProcessAttributes для CreateProcess или CreateProcessAsUser или с помощью функции SetSecurityInfo.Я никогда не пробовал этого, но теоретически это должно помешать пользователю использовать диспетчер задач для закрытия процесса.

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

Другая потенциальная проблема: если вы прослушиваете сообщения, указывающие, что пользователь выходит из системы (для выхода), такое сообщение может быть подделано.Если вы этого не сделаете, вам нужно найти другой способ выхода, когда пользователь выходит из системы.Возможно, вам придется поэкспериментировать здесь, я не уверен, как система будет реагировать.

...