You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Active Directory ACL获取用户身份:查询Send-To扩展权限关联账户

解决Send-To扩展权限关联账户的获取问题

你遇到的问题是原代码只过滤了权限的ObjectType GUID,但没考虑其他关键校验条件,导致误匹配了默认的NT AUTHORITY\Authenticated Users规则。咱们来一步步修正:

关键问题分析

  1. 缺少权限类型过滤:原代码没区分允许/拒绝权限,默认的Authenticated Users规则可能是不符合需求的权限条目。
  2. 未校验扩展权限的AccessMask位:Send-To属于AD扩展权限,对应的AccessMask必须包含ADS_RIGHT_DS_CONTROL_ACCESS(0x00000100)位,否则不是有效的Send-To权限。
  3. 继承权限开关可能错误:如果目标账户的权限是从父容器继承来的,原代码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:45:14