gpt4 book ai didi

c# - 拒绝访问 Kiosk 程序进程

转载 作者:可可西里 更新时间:2023-11-01 13:16:22 25 4
gpt4 key购买 nike

我有一个信息亭应用程序,必须始终禁用任务管理器以防止用户关闭程序
但有些用户需要TaskManager来关闭挂起的程序。

任何帮助都会被挪用。

但是,我确信 Windows 中有一个功能可以防止关闭程序的进程,就像有人试图杀死 rundll.exe 进程一样。我想知道我是否可以使用 DllImport

调用该函数

谁能帮忙解决一个问题?
黑客?
函数?
还有其他解决方案吗?

编辑:

至少如果没有办法阻止进程被关闭,我需要一种方法将它从任务管理器中出现的进程列表中隐藏起来。

编辑 2:到目前为止我找不到解决方案

最佳答案

如果您可以在管理上下文中访问进程 ID,一种方法是拒绝最终用户对进程的 PROCESS_TERMINATE 权限。终止进程(通过任务管理器或其他上下文)默认授予所有者,但可以明确拒绝。当它被拒绝时,终止进程将需要所有者手动更改 ACL,然后终止进程。如果用户既不是管理员也不是进程的所有者,他将无法强制终止进程(例如,通过任务管理器),尽管允许进程正常退出。

以下代码为 Everyone 组的成员在具有 PID processid 的进程上放置一个显式拒绝 ACE。

#include "Aclapi.h"
#include "Sddl.h"
DWORD RestrictTerminateOnProcessId(DWORD processid)
{
PACL dacl = NULL, newdacl = NULL;
HANDLE ph = NULL;
PSECURITY_DESCRIPTOR* desc = NULL;
PSID everyonesid = NULL;
ph = OpenProcess(WRITE_DAC | READ_CONTROL, false, processid);
if (!ph) goto cleanup;

if (ERROR_SUCCESS != GetSecurityInfo(ph,
SE_KERNEL_OBJECT,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
&dacl,
NULL,
desc)) goto cleanup;

SID_IDENTIFIER_AUTHORITY WorldAuth = SECURITY_WORLD_SID_AUTHORITY;
if (!AllocateAndInitializeSid(
&WorldAuth,1,SECURITY_WORLD_RID,
0,0,0,0,0,0,0,&everyonesid)) goto cleanup;

// begin copy dacl
_ACL_SIZE_INFORMATION si;
GetAclInformation(dacl,
&si,
sizeof(si),
AclSizeInformation);

DWORD dwNewAclSize = si.AclBytesInUse +
(2*sizeof(ACCESS_DENIED_ACE)) + (2*GetLengthSid(everyonesid)) -
(2*sizeof(DWORD));

newdacl = (PACL)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
dwNewAclSize);

if (newdacl == NULL) goto cleanup;

if (!InitializeAcl(newdacl, dwNewAclSize, ACL_REVISION_DS))
goto cleanup;

if (!AddAccessDeniedAce(newdacl,
ACL_REVISION_DS,
PROCESS_TERMINATE,
everyonesid)) goto cleanup;

for (int i = 0; i < si.AceCount; i++)
{
LPVOID pace = NULL;
if (!GetAce(dacl, i, &pace)) goto cleanup;
if (!AddAce(newdacl, ACL_REVISION_DS,
MAXDWORD, pace, ((PACE_HEADER)pace)->AceSize))
goto cleanup;
}

// end copy dacl

if (!SetSecurityInfo(ph,
SE_KERNEL_OBJECT,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
newdacl,
NULL)) goto cleanup;
SetLastError(0);

cleanup:
DWORD ret = GetLastError();
if (desc) LocalFree(desc);
if (newdacl) HeapFree(GetProcessHeap(), 0, (LPVOID)newdacl);
if (ph) CloseHandle(ph);
if (everyonesid) FreeSid(everyonesid);
return !ret;
}

关于c# - 拒绝访问 Kiosk 程序进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5380018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com