首页 文章

另一个winapi文件权限C头搔痒 . 为什么我的方法不起作用?

提问于
浏览
0

我真的很想知道如何正确使用windows api来确定文件权限 . 我已经看到了这么多帖子,但我似乎无法做到这一点 . 具体来说,我想检查用户是否具有给定文件的读或写权限 . 这些是我的步骤:

(1)使用GetUserNameEx访问主叫客户端(包括域名)的完全限定用户名; (返回0错误;用户名似乎使用cout调试消息正确打印出来) .

(2)使用LookupAccountName访问用户的SID . (我这样做了两次,第一次设置SID和域缓冲区大小 - 第一次调用时返回122错误,第二次调用返回0错误(预期)) . 我假设正确设置了SID缓冲区 .

(3)与获得的sid Build 受托人:

TRUSTEE t;
        PTRUSTEE tptr = &t;
        BuildTrusteeWithSid(tptr,&sid[0]);

(4)获得DACL:

// following are freed up later using LocalFree (maybe I should use delete?)
 PACL ppDacl = new ACL;
 PSECURITY_DESCRIPTOR ppSecurityDescriptor = new SECURITY_DESCRIPTOR;
 std::vector<TCHAR> v(pathString.begin(), pathString.end());
 GetNamedSecurityInfo(&v[0],
                      SE_FILE_OBJECT,
                      READ_CONTROL,
                      NULL,
                      NULL,
                      &ppDacl,
                      NULL,
                      &ppSecurityDescriptor);

一个简单的电话

std::cout<<"ACE count: "<<ppDacl->AceCount<<std::endl;

然后表明有58个ACE让我假设DACL结构正在被正确实例化(我进一步假设有58个ACE虽然我不确定如何手动验证这个;我真的不是一个Windows人员) . 但是,在GetNamedSecurityInfo调用之后打印GetLastError()会给我一个122(即ERROR_INSUFFICIENT_BUFFER),因此在此步骤中出现问题 .

请注意,初始化PACL和PSECURITY_DESCRIPTOR如下:

ACL dacl;
 PACL ppDacl = &dacl;
 SECURITY_DESCRIPTOR sd;
 PSECURITY_DESCRIPTO = &sd;

而不是新的它们似乎没有正确地填充DACL(至少是呼叫

std::cout<<"ACE count: "<<ppDacl->AceCount<<std::endl;

报告0而不是58) . 我不知道为什么 .

(5)最后,我尝试在给定创建的受托者和dacl的情况下获取文件的访问掩码:

ACCESS_MASK access;
 GetEffectiveRightsFromAcl(ppDacl, tptr, &access);

这表示我没有访问权限:

((access & GENERIC_WRITE)==GENERIC_WRITE)

要么

((access & GENERIC_READ)==GENERIC_READ)

我希望你们中的一位能够对此有所了解

干杯,

本 .

1 回答

  • 1

    GetNamedSecurityInfo() 的调用必须在作为第3个参数传递的标志集中设置 DACL_SECURITY_INFORMATION . 只有这样,第6个参数中返回的值引用的数据在返回调用后才有效 .

    GetNamedSecurityInfo()documentation on MSDN逐字:

    ppDacl [out,optional] ...仅当您设置DACL_SECURITY_INFORMATION标志时,返回的指针才有效 .


    另外作为旁注:没有必要初始化 ppDaclppSecurityDescriptor ,因为这是由 GetNamedSecurityInfo() 完成的 . 如果动态地为那些导致内存泄漏的内存分配内存,就像调用 GetNamedSecurityInfo() 一样,你会丢失对你分配的内容的引用 .

相关问题