另一个winapi文件权限C头抓取程序。为什么不是';我的方法行不通吗?

另一个winapi文件权限C头抓取程序。为什么不是';我的方法行不通吗?,c,windows,winapi,file-io,acl,C,Windows,Winapi,File Io,Acl,对于如何正确使用windows api来确定文件权限,我真是摸不着头脑。我看过很多关于这方面的帖子,但我似乎没能把它做好。具体来说,我想检查用户是否对给定文件具有读写权限。以下是我的步骤: (1) 使用GetUserNameEx访问呼叫客户端的完全限定用户名(包括域名);(返回0错误;用户名显示为使用cout debug消息正确打印出来) (2) 使用LookupAccountName访问用户的SID。(我做了两次,第一次是设置SID和域缓冲区大小——第一次调用返回122个错误,第二次调用返回0

对于如何正确使用windows api来确定文件权限,我真是摸不着头脑。我看过很多关于这方面的帖子,但我似乎没能把它做好。具体来说,我想检查用户是否对给定文件具有读写权限。以下是我的步骤:

(1) 使用GetUserNameEx访问呼叫客户端的完全限定用户名(包括域名);(返回0错误;用户名显示为使用cout debug消息正确打印出来)

(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);
与其说是新的,不如说是新的,因为它们似乎不能正确地填充DACL(至少是调用)

  std::cout<<"ACE count: "<<ppDacl->AceCount<<std::endl;
这表示我执行以下操作时没有访问权限:

 ((access & GENERIC_WRITE)==GENERIC_WRITE)

我希望你们中的一个人能对此有所了解

干杯


Ben.

GetNamedSecurityInfo()
的调用应在作为第三个参数传递的标志集中设置
DACL\u安全信息
。只有在第六个参数中返回的值引用的数据在调用返回后才有效

GetNamedSecurityInfo()
的逐字记录:

ppDacl[输出,可选]

。。。 仅当设置了DACL_安全性_信息标志时,返回的指针才有效



另请注意:无需初始化
ppDacl
ppSecurityDescriptor
,因为这是由
GetNamedSecurityInfo()
完成的。如果动态分配内存给这些脚本,则会导致内存泄漏,如调用
GetNamedSecurityInfo()
您丢失了对所分配内容的引用。

std::vector v是否缺少0-终止?啊,我假设在使用pathString(string)迭代器进行复制时会包含它。因此我想我可以在分配后添加v.push_back('\0')(对吗?)您可以发布一段完整的代码来演示这个问题吗?(最好只是使用一个常量字符串作为文件名,以消除任何不必要的潜在问题。)GetLastError()与此函数无关;它的返回代码将指示错误(如果有)发生。Harry--将很快发布一些。@Luke,我很抱歉,但是你的评论对我来说没有意义。你能澄清一下吗?Alk,非常感谢。我已经做了你建议的更改,删除了初始化并将GetNameSecurityInfo中的第三个参数更改为读取|控制| DACL)安全信息。我现在收到一个错误1008(试图引用一个不存在的令牌)。有什么想法吗?干杯。这可能是因为在我对OP的其他评论中提到的缺少0-终止符。@BenJWell,我添加了v.push_back(“\0”)我仍然得到相同的错误..所有这些错误代码..那么如何分配
pathString
,使用哪个值?@BenJpathString是boost::filesystem::path.string()。即pathString=tstring(bp.string())其中,bp是boost路径,tstring是typedef'ed std::wstring或std::string,具体取决于编译是unicode(使用wstring的情况下)还是ansi(使用字符串的情况下)。
  std::cout<<"ACE count: "<<ppDacl->AceCount<<std::endl;
 ACCESS_MASK access;
 GetEffectiveRightsFromAcl(ppDacl, tptr, &access);
 ((access & GENERIC_WRITE)==GENERIC_WRITE)
 ((access & GENERIC_READ)==GENERIC_READ)