我真的很想知道如何正确使用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 回答
对
GetNamedSecurityInfo()
的调用必须在作为第3个参数传递的标志集中设置DACL_SECURITY_INFORMATION
. 只有这样,第6个参数中返回的值引用的数据在返回调用后才有效 .从
GetNamedSecurityInfo()
的documentation on MSDN逐字:另外作为旁注:没有必要初始化
ppDacl
和ppSecurityDescriptor
,因为这是由GetNamedSecurityInfo()
完成的 . 如果动态地为那些导致内存泄漏的内存分配内存,就像调用GetNamedSecurityInfo()
一样,你会丢失对你分配的内容的引用 .