2011-11-30 89 views
9

我试图以编程方式确定当前用户是否对给定的Active Directory对象具有某些权限(具体而言,在此情况下,我试图确定用户是否具有另一个Exchange用户或分发的“代理发送”权限列表对象)。如何查询Active Directory对象的有效权限?

我已经想出了如何使用ADSI访问ntSecurityDescriptor属性:我可以枚举IADsSecurityDescriptorDiscretionaryACL属性中的ACE。但是:

  • 如何根据该数据确定“代理发送”权限是否明确允许或拒绝受托人?
  • 当通过组成员资格间接授予权限时,我该如何发现此问题?我真的必须自己解析有效的权限(递归地)检查用户是否是成员的所有组?当然必须有该任务的API ...

FWIW,我使用的是ActiveDs.dll类型库在Delphi编码(即本机Win32代码),.NET特有的解决方案,这样就不会真正帮助除非他们的源代码给我提供了有关如何在本机代码中完成相同任务的线索。 PowerShell也是如此。有人开始


前:我已经知道PR_EMS_AB_PUBLIC_DELEGATESPR_EMS_AB_PUBLIC_DELEGATES_BL_O扩展MAPI属性。但是,这不是我所追求的。这些属性指的是“代表发送”-right(又名代表),而不是“代理发送”权限,这是非常不同的事情。

+0

@RRUZ:感谢您的加入,但我宁愿将delphi标签放在此外,尤其是因为一些能够回答这个问题的人甚至可能会将其放在忽略列表中。我期望最终的解决方案同样适用于任何可以使用COM的编程语言。 –

+0

德尔福特定的后续问题在这里:http://stackoverflow.com/q/8524507/9784 –

回答

2

以下是MSDN文章 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms675580(v=VS.85).aspx。有附加的示例显示如何调用API。

+0

谢谢,这看起来很有前途!不幸的是,在下一个星期之后,我没有时间去尝试。只要我知道更多,我会尽快回复结果(希望能得到赞扬和接受)。 –

+0

好吧,我现在已经进一步了一点了(我花了一段时间将示例代码转换为Delphi)。我设法创建了一个编译和运行的例子,但对于Windows安全来说,这是一个全新的例子,我不能说我明白我在做什么,甚至是我用这个过程来检查它到底是什么...... :( –

+0

我确信我不会在中长期内了解潜在的概念,但我希望稍微更高层次的方法让我开始。理想情况下,我想通过对象SID和访问掩码(尽管我仍然需要弄清楚,在我的特殊情况下,我应该检查什么,即特定于Exchange的“发送方式” - 右键 - 我确定必须有一个带常量的头文件),并返回“True”或“False”(我不需要验证除当前用户以外的任何用户的访问权限)。 –

相关问题