2012-06-19 10 views
3

Я пишу программу, которая включает в себя службу Windows и GUI-программу, потому что служба Windows не может напрямую взаимодействовать с окнами.unkillable process

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

Процесс GUI запускается с использованием автозапуска Windows и выполняется с разрешениями пользователей. Из-за этого пользователи могут просто просто убить GUI-процесс. Это плохо, потому что GUI-процесс вызывает выход из системы (и пользовательское сообщение).

Как я могу остановить пользователей от убийства процесса?

+0

Нужна ли вам программа GUI/WinForms? Может ли это не программа командной строки? – Arran

+0

Если вы можете справиться с возрождением процесса каждый раз, когда он убит и продолжает его работу, я даю вам то, что я написал, называемый «Watch Dogs» - две программы, которые оживляют друг друга, когда кто-то убивают, и оживляют третий данный процесс как Что ж. Единственный способ остановить это - убить обе часовых собак очень быстро (используя код), а затем убить третий процесс вручную - что достаточно хорошо для большинства случаев. – SimpleVar

+0

@YoryeNathan: На самом деле довольно легко убить такую ​​систему и вообще не требует никакого кода. – Skizz

ответ

0

Я, наконец, закончил использование альтернативной программы RunAs, CPAU, чтобы начать процесс как администратор при входе в систему. Делая это, ученики могут, по крайней мере, не убивать его, просто используя Taskmanager или подобное.

Я также мог бы реализовать метод, предложенный Jon. Таким образом, даже если ученикам удастся убить процесс, им это не удастся.

-1

Вы не должны запрещать пользователю убивать ваше приложение. Если служба завершилась неудачей после кривого графического интерфейса, вы должны исправить Service not GUI.

Но если вы действительно хотели бы, чтобы остановить при закрытии посмотреть here

+2

Ссылка - это просто страница поиска - без хороших результатов в этом отношении ... – SimpleVar

+2

это ответ или комментарий? Спросите себя .... – Carsten

8

Поскольку вы не имеете возможность использовать безопасности операционной системы, чтобы предотвратить это, технический ответ, что это не может быть сделано. Это оставляет только обходные пути или альтернативные подходы.

Один из способов, который официально не поддерживается, опирается на недокументированные возможности и которые вы не слышали от меня это:

public static class Unkillable 
{ 
    [DllImport("ntdll.dll", SetLastError = true)] 
    private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3); 

    public static void MakeProcessUnkillable() 
    { 
     Process.EnterDebugMode(); 
     RtlSetProcessIsCritical(1, 0, 0); 
    } 

    public static void MakeProcessKillable() 
    { 
     RtlSetProcessIsCritical(0, 0, 0); 
    } 
} 

После вызова Unkillable.MakeProcessUnkillable, убивая процесс приведет к немедленный BSOD. Это действительно уродливое решение, но трудно возразить против «может быть реализовано за 2 минуты».

Другим обходным решением было бы создать группу процессов, которые будут взаимодействовать, перезаряжая друг друга, когда кто-то умрет.

+1

«Не слышал для меня» - Лол! Симпатичное решение, за исключением части BSOD. Я бы не хотел, чтобы лично BSOD был вызван BSOD. Я бы предпочел просто ... не умереть. – SimpleVar

+0

Где он сказал, что он не может использовать безопасность ОС? Я думаю, мы действительно должны предлагать _that_ вместо этого :) –

+0

@romkyns: «работает с разрешениями пользователя» - поэтому пользователь может его убить. – Jon

0

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

3

Процесс GUI запускается с использованием автозапуска Windows и выполняется с разрешениями пользователей. Из-за этого пользователи могут просто просто убить GUI-процесс.

Как насчет этого: вы запускаете процесс GUI, чтобы показать им сообщение, но вы use the service to actually log off. Затем они могут убить процесс GUI, который они хотят, не затрагивая основную функцию вашего программного обеспечения.

+0

У студентов нет прав администратора. Как я могу запустить процесс с разными правами на вход пользователя? – Zulakis

+0

@ Zulakis Я считаю, что вы можете использовать планировщик заданий для этого. Установите триггер для входа в систему и используйте параметр «Запустить как». Тем не менее, я обновил свой ответ с помощью альтернативного подхода, который, я думаю, будет работать лучше. –

+0

@ Zulakis [этот вопрос] (http://stackoverflow.com/questions/267838/how-can-a-windows-service-execute-a-gui-application) показывает, как служба может запускать процесс как другой пользователь , но это также объясняет, что это, вероятно, плохая идея. –

1

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

Я предполагаю, что каждый ПК настроен с соответствующими настройками учетной записи (то есть не как администраторы).

Сценарии входа в систему также могут выполнять другие функции, такие как настройка сетевых ресурсов.

+0

У нас есть сценарии входа в систему, конечно. Но это не поможет, если ученики просто подключат сетевой шнур. – Zulakis

0

Вы можете сделать процесс, который трудно убить, используя this code (простой C, извините, но его не должно быть слишком сложно переносить на C#).

Технически это не мешает пользователю убивать процесс, поскольку они могут изменять разрешения, но им нужно будет написать код или использовать специально разработанный инструмент для этого. Ни менеджер задач, ни pskill не будут работать, если у пользователя нет прав администратора.

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