C++ 如何创建空/空DACL?

C++ 如何创建空/空DACL?,c++,security,winapi,dacl,C++,Security,Winapi,Dacl,我需要授予每个人对我正在创建的命名管道的访问权限。我知道这样做的方法是创建一个空/空DACL并将其传递给CreateNamedPipe 如何创建空DACL?我被告知,这与为LPSECURITY\u属性传递空指针不同,如下所示: SECURITY_DESCRIPTOR SD; InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&SD, TRUE, NU

我需要授予每个人对我正在创建的命名管道的访问权限。我知道这样做的方法是创建一个空/空DACL并将其传递给
CreateNamedPipe

如何创建空DACL?我被告知,这与为
LPSECURITY\u属性传递空指针不同,如下所示:

SECURITY_DESCRIPTOR SD;
InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&SD, TRUE, NULL, FALSE);
为了简洁起见,我省略了错误检查。你不会那样做的

然后,当您调用
CreateNamedPipe
时,可以如下设置安全属性记录:

SA.nLength = sizeof(SA);
SA.lpSecurityDescriptor = &SD;
SA.bInheritHandle = TRUE;
SetSecurityDescriptorDacl
的文档说明:

当pDacl参数不指向DACL且bDaclPresent标志为TRUE时,将指定空DACL。允许所有访问。您不应该对对象使用空DACL,因为任何用户都可以更改DACL和安全描述符的所有者。这将干扰对象的使用


因此,上面是如何做到这一点的,但文档确实强调您不应该这样做。

以下是我们在其中一个项目中使用的代码:

SECURITY_DESCRIPTOR  pSD;
SECURITY_ATTRIBUTES  SA;

if(!InitializeSecurityDescriptor(&pSD, SECURITY_DESCRIPTOR_REVISION))
    throw error;
if(!SetSecurityDescriptorDacl(&pSD, true, NULL, false))
    throw error;
SA.nLength = sizeof(SA);
SA.lpSecurityDescriptor = &pSD;
SA.bInheritHandle = true;
pSA = &SA;
...
FMapping = CreateFileMapping(INVALID_HANDLE_VALUE, pSA, PAGE_READWRITE, 0, 4096, p);

这段代码为所有人创建了一个具有访问权限的映射

Hm,关于更改所有权的部分令人惊讶。但在我的情况下,这不是一个问题,我只需要能够从我的exe连接,而不管运行它的用户是谁,并且连接到管道不会让他们攻击我的windows服务或任何东西。但它仍然很有趣-是否可以授予每个人连接的权限,而不允许他们更改所有权?是的,那么您需要使用真正的DACL。我在上一个问题的评论中的代码解释了我是如何做到这一点的。为什么要使用指针变量(
pSA
),而不仅仅是使用
SA
的地址?