C/C++ Windows 10 x64 (17763) 企业 DACL 问题

标签 c windows winapi

我正在创建一个具有正确(我相信)权限的用户模式进程,以允许系统访问对象,但是这似乎总是在某些系统进程上失败并显示“访问被拒绝”。

该对象是在“Global\”命名空间中创建的。有些过程成功,有些则失败;具有相同的权限。使用 ConvertStringSecurityDescriptorToSecurityDescriptor 设置权限。

检查未按预期运行的进程,我添加了更多权限:

  • 用户:字体驱动程序主机\UMFD-0
  • SID:S-1-5-96-0-0

为此,我设置了:(A;OICI;GA;;;LS)//因为 Microsoft 网站上没有这样的用户

  • 用户:NT AUTHORITY\NETWORK SERVICE
  • SID:S-1-5-20

为此我设置了:A;OICI;GA;;;NS)

  • 用户:NT AUTHORITY\LOCAL SERVICE
  • SID:S-1-5-19

为此我设置了:(A;OICI;GA;;;LS)

在这些权限下运行的某些进程能够读取我的对象,而另一些则不能。这是为什么?

我不会使用“Everyone”或空/空 DACL,因此请不要建议将其作为解决方案。这个想法是“允许”必要的事情,因为 Windows 默认情况下拒绝一切。

请指出我做错了什么,我将不胜感激。

最佳答案

您似乎正在设置用户模式驱动程序。尝试使用UD而不是LS,此声明位于sddl.h中文件。

根据AccessCheck的规则,

All ACEs have been checked and there is still at least one requested access right that has not been explicitly allowed, in which case, access is implicitly denied.

编辑:

#include <iostream>
#include <windows.h>
#include <sddl.h>
BOOL CreateMyDACL(SECURITY_ATTRIBUTES* pSA)
{
    const TCHAR* szSD = TEXT("D:")
        TEXT("(A;OICI;GA;;;UD)")
        TEXT("(A;OICI;GA;;;NS)")
        TEXT("(A;OICI;GA;;;LS)"); 

    if (NULL == pSA)
        return FALSE;

    return ConvertStringSecurityDescriptorToSecurityDescriptor(
        szSD,
        SDDL_REVISION_1,
        &(pSA->lpSecurityDescriptor),
        NULL);
}
int main()
{
    TCHAR szName[] = TEXT("Global\\MyObject");
    SECURITY_ATTRIBUTES  sa;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = FALSE;

    if (!CreateMyDACL(&sa))
    {
        printf("Failed CreateMyDACL\n");
        exit(1);
    }
    HANDLE hEvent = CreateEvent(&sa, FALSE, TRUE, szName);
    if (hEvent == NULL)
    {
        printf("error, %d\n", GetLastError());
        return -1;
    }
    else
        printf("success, %x\n", hEvent);
    //Sleep(10000); //

    CloseHandle(hEvent);
    return 0;
}

关于C/C++ Windows 10 x64 (17763) 企业 DACL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59238260/

相关文章:

c - 为什么在 char** 转换后会出现段错误?

c - "void (* parse_arg_function)(const char*)"函数参数在 C 中是什么意思?

c++ - 如何在 Windows 中读取 CD 音频数据?

c++ - 在文件扩展名和应用程序之间创建关联性?

windows - 在 Docker、tensorflow、Windows 10 中使用本地文件系统和 MySQL 数据库

c++ - SndVol 如何改变给定 Audio Session 的音量级别?

c - 变量值不变

java - 如何在hadoop map reduce中设置使用JNI创建的库文件的路径

c - 设置静态文本颜色 Win32

c++ - WideCharToMultiByte() 与 wcstombs()