Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File can';无法获取文件的sacl_File_Security_Winapi_Acl - Fatal编程技术网

File can';无法获取文件的sacl

File can';无法获取文件的sacl,file,security,winapi,acl,File,Security,Winapi,Acl,我想知道文件的完整性级别,但无法获取sacl。GetNamedSecurityInfo返回0(错误\成功),这意味着 执行时没有错误,但SACL仍然变为0x00000000。有人知道问题出在哪里吗 int GetFileIntegrityLevel() { DWORD integrityLevel = SECURITY_MANDATORY_UNTRUSTED_RID; PSECURITY_DESCRIPTOR pSD = NULL; PACL acl = 0; i

我想知道文件的完整性级别,但无法获取sacl。GetNamedSecurityInfo返回0(错误\成功),这意味着 执行时没有错误,但SACL仍然变为0x00000000。有人知道问题出在哪里吗

int GetFileIntegrityLevel()
{
    DWORD integrityLevel = SECURITY_MANDATORY_UNTRUSTED_RID;
    PSECURITY_DESCRIPTOR pSD = NULL;
    PACL acl = 0;
    int dw = 0; 
        GetNamedSecurityInfoA("C:\\8.docx", SE_FILE_OBJECT, SACL_SECURITY_INFORMATION,  0, 0, 0, &acl, &pSD));
    {
        if (0 != acl && 0 < acl->AceCount)
        {
            SYSTEM_MANDATORY_LABEL_ACE* ace = 0;
            if (GetAce(acl, 0, reinterpret_cast<void**>(&ace)))
            {
                SID* sid = reinterpret_cast<SID*>(&ace->SidStart);
                integrityLevel = sid->SubAuthority[0];
            }
        }

        PWSTR stringSD;
        ULONG stringSDLen = 0;

        ConvertSecurityDescriptorToStringSecurityDescriptor(pSD, SDDL_REVISION_1, ACCESS_SYSTEM_SECURITY, &stringSD, &stringSDLen);

        if (pSD)
        {
            LocalFree(pSD);
        }
    }

    if (integrityLevel == 0x0000)
        return 0;
    else if (integrityLevel == 0x1000)
        return 1;
    else if (integrityLevel == 0x2000)
        return 2;
    else if (integrityLevel == 0x3000)
        return 3;
    else if (integrityLevel == 0x4000)
        return 4;
    else
        return -1;
}


int main()
{

    HANDLE curProcess = GetCurrentProcess();

    TOKEN_PRIVILEGES tp;
    LUID sdv;

    HANDLE hToken = 0;
    OpenProcessToken(curProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_READ | TOKEN_QUERY, &hToken);

    LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &sdv);

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = sdv;  
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), (PTOKEN_PRIVILEGES)NULL, 0);


    int i = GetFileIntegrityLevel();

    printf("%d\n", i);



    printf("%d\n", i);
    CloseHandle(curProcess);
    std::cin.get();
}
int-GetFileIntegrityLevel()
{
DWORD integrityLevel=安全性\强制性\不受信任\ RID;
PSECURITY_描述符pSD=NULL;
PACL-acl=0;
int-dw=0;
GetNamedSecurityInfoA(“C:\\8.docx”,SE_文件对象,SACL_安全信息,0,0,&acl,&pSD));
{
如果(0!=acl&&0AceCount)
{
系统\强制性\标签\ ACE*ACE=0;
if(获取ace(acl,0,重新解释强制转换(&ace)))
{
SID*SID=reinterpret_cast(&ace->SidStart);
integrityLevel=sid->子权限[0];
}
}
PWSTR-stringSD;
ULONG stringSDLen=0;
ConvertSecurityDescriptor StringSecurityDescriptor(pSD、SDDL修订版1、访问系统安全、stringSD和stringSDLen);
中频(pSD)
{
本地自由(pSD);
}
}
if(integrityLevel==0x0000)
返回0;
else if(integrityLevel==0x1000)
返回1;
else if(integrityLevel==0x2000)
返回2;
else if(integrityLevel==0x3000)
返回3;
else if(integrityLevel==0x4000)
返回4;
其他的
返回-1;
}
int main()
{
HANDLE curProcess=GetCurrentProcess();
令牌特权;
路易德斯德夫;
句柄hToken=0;
OpenProcessToken(curProcess、TOKEN_ADJUST_PRIVILEGES、TOKEN|READ、TOKEN|QUERY和hToken);
LookupPrivilegeValue(NULL、SE_SECURITY_NAME和sdv);
tp.privilegecont=1;
tp.Privileges[0]。Luid=sdv;
tp.Privileges[0]。Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),(PTOKEN\u PRIVILEGES)NULL,0);
int i=GetFileIntegrityLevel();
printf(“%d\n”,i);
printf(“%d\n”,i);
闭合手柄(curProcess);
std::cin.get();
}
您不需要使用,但是

示例代码:

ULONG GetFileIntegrityLevel(PCWSTR fileName, PULONG pil)
{
    PACL Sacl;
    PSECURITY_DESCRIPTOR pSD;
    *pil = SECURITY_MANDATORY_MEDIUM_RID;// default LABEL

    ULONG err = GetNamedSecurityInfoW(fileName, SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION, 0, 0, 0, &Sacl, &pSD);

    if (!err)
    {
        if (Sacl)
        {
            union {
                PVOID Ace;
                PSYSTEM_MANDATORY_LABEL_ACE pLabel;
                PACE_HEADER pHeader;
            };

            err = ERROR_GEN_FAILURE;

            ACL_SIZE_INFORMATION asi;

            if (GetAclInformation(Sacl, &asi, sizeof(asi), AclSizeInformation))
            {
                PSID Sid;

                union {
                    PUCHAR pc;
                    PULONG pl;
                };

                static SID_IDENTIFIER_AUTHORITY LabelAuth = SECURITY_MANDATORY_LABEL_AUTHORITY;

                switch (asi.AceCount)
                {
                case 1:
                    if (GetAce(Sacl, 0, &Ace))
                    {
                        if (pHeader->AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE)
                        {
                            Sid = &pLabel->SidStart;

                            if (pc = GetSidSubAuthorityCount(Sid))
                            {
                                if (*pc == 1 && !memcmp(&LabelAuth, GetSidIdentifierAuthority(Sid), sizeof(SID_IDENTIFIER_AUTHORITY)))
                                {
                                    if (pl = GetSidSubAuthority(Sid, 0))
                                    {
                                        *pil = *pl;
                case 0:
                                        err = ERROR_SUCCESS;
                                    }
                                }
                            }
                        }
                    }
                    break;
                }
            }
        }

        LocalFree(pSD);
    }

    return err;
}

尽管
SYSTEM\u emmandable\u LABEL\u ACE\u TYPE
位于SACL-
SACL\u SECURITY\u INFORMATION
中,但不会返回此
ACE
——它会过滤SACL并从输出中删除此ACE类型。仅
LABEL\u SECURITY\u INFORMATION
返回此ACE类型-SACL还将筛选并删除除此类型之外的所有ACE。如果我们希望未按原样筛选SACL-需要使用两个标志-
标记安全信息| SACL安全信息

在大多数情况下,文件/文件夹根本没有强制标签。在这种情况下,默认情况下-
SECURITY\u MANDATORY\u MEDIUM\u RID
假定。因此,下一步是算法-我们使用
标签安全信息查询标签

  • 若文件根本并没有SACL—我们在输出中得到空SACL—那个么 默认
    SECURITY\u MANDATORY\u MEDIUM\u RID
  • 如果文件有SACL但没有标签-我们在输出中得到空SACL
    (Sacl!=NULL&&acecont==0)
    -再次 默认情况下,
    SECURITY\u employment\u MEDIUM\u RID
  • 如果文件具有强制标签-我们必须使用
    acecont==1
    - 需要从这个ACE中提取RID吗
也为了

需要查询的权限:访问\u系统\u安全

需要设置的权限:访问\系统\安全

要从安全描述符读取SACL,调用进程 当句柄 打开了。获取此访问权限的正确方法是启用 SE_SECURITY_NAME privilege在调用方的当前令牌中,打开 处理访问\系统\安全访问,然后禁用 特权

但对于got,我们不需要拥有/启用任何特权

查询所需的权限:读取\u控件

需要设置的权限:写入所有者


代码中几乎没有错误处理。几乎任何呼叫都可能失败,但我们不知道是不是这样。请执行错误报告。除了使代码更简单之外,
LABEL\u SECURITY\u INFORMATION
是否还有其他好处?例如,这是否意味着你不需要提升特权?@HarryJohnston-信息真的不多。几乎大多数文件都没有明确的标签-因此默认情况下-
MEDIUM
。一些文件,例如在
Users\\AppData\LocalLow
中具有
LOW
-对于低完整性,应用程序可以写入此位置
HIGH
我只在系统驱动器的根目录中查看(例如
c:\\
),而另一个系统文件夹(如
c:\windows
-没有标签-因此
MEDIUM
)也没有标签。这对于一些实用程序来说是非常有用的。当然,这里没有提到文件DACL,只读,etc@HarryJohnston-“这是否意味着您不需要提升权限”-是的,当我们使用它时,我们不需要
SE\u SECURITY\u NAME
权限,这与使用
SACL\u SECURITY\u信息时不同。但main-即使对象在SACL-
SACL\u SECURITY\u信息中有标签
-也不会返回它。仅
标签\u安全信息
-返回标签。所以没有别的办法了。真奇怪。我猜它是这样工作的compatibility@HarryJohnston-不,我检查了SACL_安全信息,但没有返回标签ace。尽管它在SACL上。只有标签安全信息才能返回它。