请问如何获取共享目录对各个用户(组)的权限信息
可以使用NetShareEnum获得各个共享目录的安全描述符,但是我如何从这个安全描述符获取对应每个用户的权限(可写,可读和完全)信息? 问题点数:200、回复次数:13Top
1 楼nkwesley(江南丝竹)回复于 2006-03-09 10:28:41 得分 0
学习,支持Top
2 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-09 10:42:24 得分 0
you need to do this at server sideTop
3 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 10:52:40 得分 0
呵呵,jiangsheng(蒋晟.Net[MVP]) 来了就好。
我写了如下代码:
ret = GetSecurityDescriptorDacl(p->shi502_security_descriptor, &preBool, &pacl, &defaultBool); // p为PSHARE_INFO_502
ACCESS_MASK mask;
TRUSTEE trustee;
LPTSTR groupname = "Administrator";
trustee.pMultipleTrustee = NULL;
trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
trustee.TrusteeForm = TRUSTEE_IS_NAME;
trustee.TrusteeType = TRUSTEE_IS_USER;
trustee.ptstrName = groupname;
DWORD dret = GetEffectiveRightsFromAcl(pacl, &trustee, &mask);
if(dret != ERROR_SUCCESS)
return;
if(mask & GENERIC_READ)
{
ShowMessage("Administrator has read right");
}
似乎感觉没有错误,运行所有函数都返回正确结果....可是与实际情况不符(Administraotor有读权限)
Top
4 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 10:54:40 得分 0
我在蒋大哥的blog上找到了设置共享权限的代码,可是自己用起来还是不太清楚。。。
我在上面贴的代码有什么问题吗?Top
5 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 10:56:23 得分 0
我需要获取的是本机的权限。不是网络上其他计算机的共享目录的权限。Top
6 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 11:17:50 得分 0
。。。请各位兄弟帮帮忙。。。。Top
7 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 11:41:35 得分 0
继续顶。。。@_@Top
8 楼laiyiling(陌生人[MVP])回复于 2006-03-09 12:07:15 得分 0
试试用LogonUser->ImpersonateLoggedOnUser模拟用户登陆后判断Top
9 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 12:31:21 得分 0
To laiyiling(【CSDN●目标】)
LogonUser需要用户名和密码,这些东西我不太可能知道。。。(一个机器上会有n多用户)
而且模拟了用户以后呢?
最主要的问题是我得到的安全描述符如何与权限相对应?Top
10 楼chehw(chehw)回复于 2006-03-09 12:58:10 得分 200
GetSecurityDescriptorDacl之后
1、调用GetAclInformation获得ACL的Entry个数,
2、再调用GetAce获取每个"access control entry"的指针,(ACCESS_ALLOWED_ACE *), 根据(ACCESS_ALLOWED_ACE *)pACE->mask判断访问权限
3、调用LookupAccountSid(NULL, pACE->SidStart, ...);根据pACE->SidStart查找SID,获取用户及组信息.Top
11 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 13:30:52 得分 0
To chehw(chehw)
非常感谢。
我使用了下面的代码:
char Buf[10000];
ret = GetAclInformation(pacl, Buf, 10000, AclSizeInformation);
ACL_SIZE_INFORMATION *pcount;
pcount = (ACL_SIZE_INFORMATION *)Buf;
for(DWORD i=0;i<pcount->AceCount;i++)
{
LPVOID pace;
ret = GetAce(pacl, i, &pace);
if( ((ACCESS_ALLOWED_ACE *)pace)->Mask & GENERIC_WRITE)
{
printf("write right\n");
}
}
判断一个ace是否拥有写权限是这样判断吗?
((ACCESS_ALLOWED_ACE *)pace)->Mask & GENERIC_WRITE
可是为什么我获得的所有的Mask的高8位全都是0呢?(我已经给这个目录增加了两个用户拥有写权限)Top
12 楼chehw(chehw)回复于 2006-03-09 13:52:29 得分 0
应判断standard access rights(16-23bit);
高8位中前四位是设置权限时为简化代码而用的, 设置时自动映射至16-23bit的标准访问权限中,后4位是保留位。
The Windows API also defines the following combinations of the standard access rights constants.
Constant Meaning
STANDARD_RIGHTS_ALL Combines DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, and SYNCHRONIZE access.
STANDARD_RIGHTS_EXECUTE Currently defined to equal READ_CONTROL.
STANDARD_RIGHTS_READ Currently defined to equal READ_CONTROL.
STANDARD_RIGHTS_REQUIRED Combines DELETE, READ_CONTROL, WRITE_DAC, and WRITE_OWNER access.
STANDARD_RIGHTS_WRITE Currently defined to equal READ_CONTROL.
Top
13 楼shootingstars(有容乃大,无欲则刚)回复于 2006-03-09 14:00:55 得分 0
To chehw(chehw)
非常感谢。
已经解决。。。稍后接贴。。。Top




