我真的很关心如何正确使用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)
我希望你们中的一位能够阐明这个
干杯,
本。
答案 0 :(得分:2)
对GetNamedSecurityInfo()
的调用应在作为第3个参数传递的标志集中设置DACL_SECURITY_INFORMATION
。只有这样,第6个参数中返回的值引用的数据在返回调用后才有效。
从GetNamedSecurityInfo()
的{{3}} {/ p>>逐字逐句
ppDacl [out,optional]
... 仅当您设置DACL_SECURITY_INFORMATION标志时,返回的指针才有效。
另外作为旁注:不需要初始化ppDacl
和ppSecurityDescriptor
,因为这是由GetNamedSecurityInfo()
完成的。如果你动态地为这些内存分配内存会导致内存泄漏,就像调用GetNamedSecurityInfo()
一样,你会丢失对你分配内容的引用。