Если вы хотите запретить пользователям убивать процесс из диспетчера задач, вы можете просто использовать дескриптор безопасности для процесса, чтобы запретить доступ всем. Технически администраторы все еще могут убить процесс, взяв на себя ответственность за процесс и сбросив DACL, но нет интерфейса, который мог бы выполнить любую из этих вещей из диспетчера задач. Process Explorer может иметь интерфейс, хотя.
Когда ваш процесс запускается, используйте SetKernelObjectSecurity с DACL_SECURITY_INFORMATION
, используя текущий дескриптор процесса. Установите DACL с нулевыми ACL. Это запретит любой доступ всем, включая тех, кто пытается завершить ваш процесс с помощью диспетчера задач.
Вот пример, который также меняет владельца процесса:
SECURITY_DESCRIPTOR sd;
ACL dacl;
SID_IDENTIFIER_AUTHORITY ntauth = SECURITY_NT_AUTHORITY;
PSID owner;
assert(InitializeAcl(&dacl, sizeof dacl, ACL_REVISION));
assert(AllocateAndInitializeSid(&ntauth, 1, SECURITY_LOCAL_SYSTEM_RID, 0,0,0,0,0,0,0, &owner));
assert(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION));
assert(SetSecurityDescriptorDacl(&sd, TRUE, &dacl, FALSE));
assert(SetSecurityDescriptorOwner(&sd, owner, FALSE));
assert(SetKernelObjectSecurity(GetCurrentProcess(), DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, &sd));
assert(FreeSid(owner) == NULL);
К сожалению, это не кажется эффективным. Я все еще могу закрыть процесс (хотя и не как пользователь с ограниченными правами). Возможно, диспетчер задач становится владельцем или вызывает какую-то другую привилегию для прекращения процесса? Кажется, я помню эту работу в предыдущих версиях Windows (я тестировал 2003), но я мог ошибиться.