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

C# ASP.NET如何查询Active Directory安全组及成员并在GridView展示

解决方案

实现可行性

该需求完全可以实现,你遇到的问题是代码逻辑存在多处错误导致成员数据无法正确加载、渲染效果不符合预期。

原代码核心问题

  • DataRow仅全局初始化一次,循环过程中反复修改同一个行对象的属性,会覆盖之前已经添加到DataTable的行数据
  • 每次新增一行就执行一次GridView绑定,逻辑冗余性能极低,应该先完成全量数据构造再统一绑定
  • 查询组成员时传入的参数是固定的strADPath,而非当前遍历到的安全组标识,导致永远查不到对应组的成员
  • 成员行未将安全组列置空,无法实现分组展示的合并效果

修复后的后台代码

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, strADPath, strUsername, strPassword);
GroupPrincipal qbeGroup = new GroupPrincipal(ctx);
PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);

// 先构造DataTable结构
DataTable dt = new DataTable();
dt.Columns.Add("Security Groups");
dt.Columns.Add("Members");

// 遍历所有安全组
foreach (GroupPrincipal found in srch.FindAll().OfType<GroupPrincipal>())
{
    bool isFirstMember = true;
    // 获取当前安全组的成员
    var members = found.GetMembers(true);
    if (members.Count == 0)
    {
        // 空组单独加一行
        DataRow emptyDr = dt.NewRow();
        emptyDr["Security Groups"] = found.Name;
        emptyDr["Members"] = "无成员";
        dt.Rows.Add(emptyDr);
        continue;
    }
    foreach (UserPrincipal user in members.OfType<UserPrincipal>())
    {
        DataRow dr = dt.NewRow();
        // 仅第一行显示组名,后续行组名列留空
        if (isFirstMember)
        {
            dr["Security Groups"] = found.Name;
            isFirstMember = false;
        }
        else
        {
            dr["Security Groups"] = "";
        }
        dr["Members"] = user.Name;
        dt.Rows.Add(dr);
    }
}

// 全量数据构造完成后统一绑定
grdSecurityGroups.DataSource = dt;
grdSecurityGroups.DataBind();

ViewState["dirState"] = dt;
ViewState["sortdr"] = "Desc";
lblSecurityTotal.Text = grdSecurityGroups.Rows.Count.ToString();

GridView前端配置(可选,优化合并效果)

如果你需要让空的安全组列自动合并为单元格,可添加RowDataBound事件实现:

<asp:GridView ID="grdSecurityGroups" runat="server" OnRowDataBound="grdSecurityGroups_RowDataBound">
</asp:GridView>

后台对应的事件逻辑:

protected void grdSecurityGroups_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (e.Row.RowIndex > 0)
        {
            GridViewRow prevRow = grdSecurityGroups.Rows[e.Row.RowIndex - 1];
            if (string.IsNullOrEmpty(e.Row.Cells[0].Text))
            {
                e.Row.Cells[0].Visible = false;
                prevRow.Cells[0].RowSpan = prevRow.Cells[0].RowSpan < 2 ? 2 : prevRow.Cells[0].RowSpan + 1;
            }
        }
    }
}

注意事项

  • 确保AD查询账号拥有足够权限读取所有安全组及成员信息
  • 域内安全组数量较多时可添加分页逻辑避免页面加载过慢

内容的提问来源于stack exchange,提问作者Allrounder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:48:04