Windows 设置字符串安全描述符以向提升的用户授予读取权限

Windows 设置字符串安全描述符以向提升的用户授予读取权限,windows,winapi,Windows,Winapi,我正在使用convertstringsecuritydescriptor-securitydescriptor创建一个安全描述符,然后可以与CreateFile一起使用,因为它更容易阅读 我的目的是让文件完全由其所有者/创建者控制,并且只能由提升的进程读取 因此,我提出了以下SSDL字符串: SSDL := 'O:'+ SIDAsString + // owner is user 'D:' +

我正在使用
convertstringsecuritydescriptor-securitydescriptor
创建一个安全描述符,然后可以与
CreateFile
一起使用,因为它更容易阅读

我的目的是让文件完全由其所有者/创建者控制,并且只能由提升的进程读取

因此,我提出了以下SSDL字符串:

  SSDL :=
    'O:'+ SIDAsString  +                   // owner is user
    'D:' +                                 // Discretionary ACL
    'P' +                                  // protected
    '(A;NP;FA;;;' + SIDAsString + ')' +    // Full control to owner
    // Read only access to administrators 
    '(A;NP;FR;;;LA)' +
    '(A;NP;FR;;;BA)';
sidaString
包含有效的
SID
,例如
S-1-5-18

convertstringsecuritydescriptor安全描述符
返回一个有效的安全描述符,并使用我期望的权限创建文件

但是,提升的进程(例如卸载程序)无法读取该文件,它们会收到拒绝访问错误。 如果尝试读取文件的进程通过
以管理员身份运行
选项启动,它将按预期接收访问权限

我试着寻找提升的用户
SID
,但我找不到任何关于它的提及,这让我相信没有这样的事情

除了向所有人授予读取权限外,是否有方法指定一个SSDL字符串,该字符串向以提升权限运行的进程授予读取权限

我试图寻找提升的用户SID

此SID是
S-1-5-32-544
Administrators
)。每个进程都有令牌,令牌包含哪个数组。对于启动提升或未提升的同一管理员用户-此阵列不同。(提升和未提升)管理员都有
S-1-5-32-544
,但属性不同!提升的管理员启用了
SE_GROUP_
,但没有提升(限制)的管理员启用

具有此属性的SID是仅拒绝的SID。当系统执行 访问检查,它检查应用于 SID,但它忽略SID允许的访问ACE

所以这是关键点-我们需要使用DACL创建SD,在这里我们只允许适当访问
S-1-5-32-544
Administrators
)(也可以说是对
system
)-因此,提升的进程在未提升时将有权访问文件-否

演示:我们在
DACL
规则中创建下一个SD访问权限:

001F01FF S-1-5-18 SYSTEM
001200A9 S-1-5-32-544 Administrators
因此,使用此
DACL
非提升进程(如记事本)对
系统
的所有访问以及对
管理员
-文件的读取/执行都不能以只读方式打开。提升记事本时-可以打开并阅读。但不能写入或删除

注意:对于设置
系统
作为所有者,我们需要
SE\u RESTORE\u权限


您可以测试提升/未提升进程(如notepad.exe)如何打开此文件。

提升不会更改用户的SID或组关联,只更改其令牌权限。同一用户可以运行提升和非提升进程。好的,您不能使用安全描述符根据提升状态授予/撤销访问权限。我认为你们需要仔细阅读海拔到底是什么以及它是如何工作的。也许阅读应用程序可以尝试为自己启用
SE\u BACKUP\u NAME
权限,然后在启用
file\u FLAG\u BACKUP\u语义的情况下打开文件。这可能会授予您正在寻找的读取权限。@RemyLebeau-当进程在UAC下未提升运行时-他有
管理员
S-1-5-32-544
),但具有
SE\u GROUP\u USE\u for\u DENY\u
属性。当流程开始提升时-他有
管理员
S-1-5-32-544
)启用了
SE\u GROUP\u
-因此确实存在不同的组关联。如果我们只允许
管理员访问
S-1-5-32-544
)-提升的进程将具有访问权限,但不会提升-否“但是,提升的进程无法读取文件”-vs“如果进程通过“以管理员身份运行”选项启动,它将按预期获得访问权限”-那么提升的进程是否可以读取文件?和
(A;NP;FR;;LA)
或可能需要
(A;NP;FRFX;;LA)
来启用对文件的执行访问?@RbMm:
SE_组_使用_仅用于_拒绝
SE组_启用
不是安全描述符可以引用的用户/组。它们只是控制如何将SID与安全描述符的ACE进行比较的令牌属性。因此,您仍然无法根据使用属性的用户/组的提升状态定制安全描述符以授予/拒绝访问。@RemyLebeau-“您不能使用安全描述符基于提升状态授予/撤销访问。”-这不是真的。举个简单的例子-
c:\windows
文件夹-提升的用户可以创建/更改此文件夹中的文件,但不能提升。因为
管理员
具有写入权限,但提升用户在令牌中没有此SID,但它仅用于Denny
void TestX()
{
    SECURITY_ATTRIBUTES sa = { sizeof(sa) };

    if (ConvertStringSecurityDescriptorToSecurityDescriptor(
        L"O:SYD:P(A;NP;FA;;;SY)(A;NP;FRFX;;;BA)", 
        SDDL_REVISION_1, &sa.lpSecurityDescriptor, 0))
    {
        HANDLE hToken;
        if (OpenProcessToken(NtCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
        {
            static ::TOKEN_PRIVILEGES tp = {
                1, { { { SE_RESTORE_PRIVILEGE }, SE_PRIVILEGE_ENABLED|SE_PRIVILEGE_ENABLED_BY_DEFAULT } }
            };
            AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), 0, 0);
            CloseHandle(hToken);
        }

        HANDLE hFile = CreateFile(L"c:\\windows\\1.txt", FILE_GENERIC_WRITE, 0, &sa, CREATE_NEW, 0, 0);

        if (hFile != INVALID_HANDLE_VALUE)
        {
            ULONG cb;
            WriteFile(hFile, "1234567890", 10, &cb, 0);
            CloseHandle(hFile);
        }

        LocalFree(sa.lpSecurityDescriptor);
    }
}