2011-07-26 2 views
2

Я не могу реализовать его как услугу Windows, потому что мой процесс должен взаимодействовать с рабочим столом, и это запрещено в Windows 7.Как запретить завершение процесса обычным пользователем?

Каков самый простой способ выполнить это? Начиная с другого (привилегированного) пользователя? Как это сделать?

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

EDIT: некоторые разъяснения в соответствии с предусмотренных ответами

моего процесс не имеет графического интерфейса, так что я пытаюсь избежать убийств процесса из диспетчера задач

моего процесс является клиентом надзирающего система, которая должна контролировать рабочий стол пользователя, поэтому он должен взаимодействовать с рабочим столом

EDIT 2:

можно использовать окно обслуживание, которая начнет отдельный процесс в пользовательской сессии под системной учетной записью (с моей службы работает под системной учетной записью)? может ли пользователь убить этот дочерний процесс?

+0

Возможный дубликат [Запретить процесс пользователя из-за «завершения процесса» из Process Explorer] (http://stackoverflow.com/questions/6185975/prevent-user-process-from-being- kill-with-end-process-from-process-explorer) – EMBarbosa

ответ

2

после долгого копания я нашел приемлемый ответ здесь: Prevent user process from being killed with "End Process" from Process Explorer

отлично работает, если вы вошли в систему как обычный пользователь, вы не можете убить процесс из Process Explorer. Администратор все еще может убить его, потому что имеет достаточные привилегии.это именно то, что мне нужно

1

Закрытие окна (корень) не означает остановки процесса - когда существует цикл сообщений, вы можете просто перезапустить его в новом окне (ясно, если вы используете фреймворк, возможно, это обертка вокруг этого).

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

Чтобы помочь более конкретно, я думаю, что мы должны понять, почему:

, потому что мой процесс должен взаимодействовать с рабочим столом

является обязательным требованием.

+0

Первый вариант (фактически игнорирующий «WM_CLOSE») достаточно для указанной цели. Выживание 'TerminateProcess()', вероятно, слишком велико, учитывая контекст. – MSalters

+0

, пожалуйста, проверьте отредактированный вопрос –

2

Вы можете использовать disable the task manager с помощью групповой политики и скрыть кнопку закрытия из окна приложения и реакцию на [Alt + F4].

+2

Является ли исправление хуже, чем проблема? Диспетчер задач - это ключевой инструмент диагностики. И, конечно, не единственный способ листинга/манипулирования процессами, встроенными в Windows (например, «Stop-Process» в PSH). – Richard

+0

+1, также, пожалуйста, проверьте отредактированный вопрос –

+0

@ Рихард: моим пользователям не нужно диагностировать систему, у них есть технические лица для этого. Вероятно, это приемлемый «тупой» метод, который я попросил, все еще ожидая других предложений ... –

1

Из этого MSDN blog:


Это, как вы это делаете:

Получить маркер пользователя по телефону

WTSQueryUserToken (WTSGetActiveConsoleSessionId(), &hToken) ;  

Используйте этот маркер в CreateProcessAsUser.


Вам просто нужно позвонить WTSQueryUserToken от службы, и запустить процесс - это работает на Windows 7 тоже!

+0

+1 для очень интересной ссылки. но это не полная история! следуя вашим советам, я создам интерактивный процесс у входа в систему, поэтому он может быть завершен этим зарегистрированным пользователем. и я стараюсь избегать этого. как запустить эту службу под системной учетной записью? Случай '1.B' в этом блоге звучит похоже. Поэтому я мог бы создать временный процесс под учетной записью (как описано), а оттуда CreateProcessAsUser с токеном системной учетной записи. Но как я могу передать токен системной учетной записи из моей службы в этот временный процесс? –

+1

Я понял вашу проблему. Не знаю, как это сделать, но это возможно - процесс NAV «ccSvcHst.exe» не может быть прерван мной, несмотря на то, что он работает под моей учетной записью пользователя. Вероятно, он использует 'SetKernelObjectSecurity' для удаления всех ACL для учетной записи (или устанавливает их для« deny »). – Ajay

+0

Я попробую это, спасибо за подсказку –