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

时间:2012-11-12 10:39:25

标签: c windows winapi file-io acl

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

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

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

(3)用获得的sid建立受托人:

        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虽然我不确定如何手动验证这个;我真的不是一个窗户的人)。但是,在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 个答案:

答案 0 :(得分:2)

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

GetNamedSecurityInfo()的{​​{3}} {/ p>>逐字逐句

  

ppDacl [out,optional]

     

...   仅当您设置DACL_SECURITY_INFORMATION标志时,返回的指针才有效。


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