ユーザーがタスクマネージャーからプロセスを強制終了しないようにする場合は、プロセスのセキュリティ記述子を使用して、全員へのアクセスの終了を拒否できます。管理者は、技術的には、プロセスの所有権を取得してDACLをリセットすることでプロセスを強制終了できますが、タスクマネージャーからこれらのいずれかを実行するためのインターフェイスはありません。ただし、 ProcessExplorerにはインターフェイスがある場合があります。
プロセスが開始したら、現在のプロセスハンドルを使用してSetKernelObjectSecurityを使用します。DACL_SECURITY_INFORMATION
ACLがゼロのDACLを設定します。これにより、タスクマネージャーでプロセスを終了しようとしているユーザーを含め、すべてのユーザーへのすべてのアクセスが拒否されます。
プロセスの所有者も変更する例を次に示します。
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をテストしていた)でこれが機能していたことを覚えているようですが、誤解される可能性があります。