从Active Directory ACL获取用户身份:查询Send-To扩展权限关联账户
解决Send-To扩展权限关联账户的获取问题
你遇到的问题是原代码只过滤了权限的ObjectType GUID,但没考虑其他关键校验条件,导致误匹配了默认的NT AUTHORITY\Authenticated Users规则。咱们来一步步修正:
关键问题分析
- 缺少权限类型过滤:原代码没区分允许/拒绝权限,默认的Authenticated Users规则可能是不符合需求的权限条目。
- 未校验扩展权限的AccessMask位:Send-To属于AD扩展权限,对应的AccessMask必须包含
ADS_RIGHT_DS_CONTROL_ACCESS(0x00000100)位,否则不是有效的Send-To权限。 - 继承权限开关可能错误:如果目标账户的权限是从父容器继承来的,原代码
includeInherited=false会直接忽略这些规则。
修正后的代码
// 定义扩展权限相关常量 const int ADS_RIGHT_DS_CONTROL_ACCESS = 0x00000100; Guid sendToPermissionGuid = new Guid("ab721a55-1e2f-11d0-9819-00aa0040529b"); ActiveDirectorySecurity ads = myGroup.ObjectSecurity; // 加载显式+继承的权限规则,目标类型为NTAccount foreach (ActiveDirectoryAccessRule ar in ads.GetAccessRules(true, true, typeof(NTAccount))) { // 多条件精准过滤:允许权限、包含扩展权限标识位、匹配Send-To的GUID if (ar.AccessControlType == AccessControlType.Allow && (ar.AccessMask & ADS_RIGHT_DS_CONTROL_ACCESS) != 0 && ar.ObjectType.Equals(sendToPermissionGuid)) { // 确保账户对象正确解析并输出 if (ar.IdentityReference is NTAccount account) { Console.WriteLine($"拥有Send-To权限的账户:{account.Value}"); } } }
额外说明
- 如果你确定目标权限是仅显式设置的,可把
GetAccessRules的第二个参数改回false,避免加载不必要的继承规则。 - 若遇到IdentityReference解析异常,可先转成
SecurityIdentifier再转译回NTAccount,确保账户名称正确显示:if (ar.IdentityReference is SecurityIdentifier sid) { NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount; Console.WriteLine(account?.Value); }
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

