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
相关产品推荐
相关产品推荐

