请问如何获取共享目录对各个用户(组)的权限信息

shootingstars 2006-03-09 10:07:49
可以使用NetShareEnum获得各个共享目录的安全描述符,但是我如何从这个安全描述符获取对应每个用户的权限(可写,可读和完全)信息?
...全文
273 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chehw 2006-03-09
  • 打赏
  • 举报
回复
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,获取用户及组信息.
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
To laiyiling(【CSDN●目标】)
LogonUser需要用户名和密码,这些东西我不太可能知道。。。(一个机器上会有n多用户)
而且模拟了用户以后呢?

最主要的问题是我得到的安全描述符如何与权限相对应?
Kudeet 2006-03-09
  • 打赏
  • 举报
回复
试试用LogonUser->ImpersonateLoggedOnUser模拟用户登陆后判断
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
继续顶。。。@_@
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
。。。请各位兄弟帮帮忙。。。。
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
我需要获取的是本机的权限。不是网络上其他计算机的共享目录的权限。
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
我在蒋大哥的blog上找到了设置共享权限的代码,可是自己用起来还是不太清楚。。。

我在上面贴的代码有什么问题吗?
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
呵呵,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有读权限)



蒋晟 2006-03-09
  • 打赏
  • 举报
回复
you need to do this at server side
nkwesley 2006-03-09
  • 打赏
  • 举报
回复
学习,支持
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
To chehw(chehw)
非常感谢。
已经解决。。。稍后接贴。。。
chehw 2006-03-09
  • 打赏
  • 举报
回复
应判断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.
shootingstars 2006-03-09
  • 打赏
  • 举报
回复
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呢?(我已经给这个目录增加了两个用户拥有写权限)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧