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

标签 c# c++ windows kiosk win32-process

我有一个信息亭应用程序,必须始终禁用任务管理器以防止用户关闭程序
但有些用户需要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/

相关文章:

C++11 正则表达式匹配——我无法让它正常工作

visual-studio-2008 - 调试时如何防止 Visual Studio 启动 Windows/控制台应用程序?

c++ - 参照同一 vector 的数据插入 vector

windows - 在 Mac 10.6/7/8/Windows XP/Vista/7 上自动打开 USB 驱动器

c# - Message.show() 在另一台计算机桌面上?

c# - 将 args(参数)传递到窗口窗体应用程序

c# - 使用 Linq 从字典 C# 中删除特定值

c# - Azure Cosmos DB 选择 min(int field) 返回 0

c# - 无法从拆分 int 数组中获得正确的输出

c++ - 在 C++ 中从字典文件创建 map 的 map