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