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

C# 可搜索列表模拟SQL表功能 实现AD自定义属性批量维护

实现方案

核心思路

你要的两次更新操作完全可以通过C#的LINQ集合运算实现,对应SQL里的两个SET逻辑,不需要引入额外的数据库,内存里就能完成对比,性能足够应对绝大多数AD用户规模场景。

实现步骤

  1. 首先定义统一的用户数据结构(也可以用Dictionary替代,类的可读性更高)
public class AdUser
{
    // AD用户名
    public string Username { get; set; }
    // 要操作的自定义属性值
    public string CustomAttrValue { get; set; }
    // 存储AD用户的可分辨名称,方便后续直接调用AD接口更新,避免二次查询
    public string DistinguishedName { get; set; }
}
  1. 准备两个数据源
    你已经实现了读取逻辑,直接把数据赋值到两个集合即可:
  • List<AdUser> allAdUsers:从AD读取的全量用户列表,CustomAttrValue存当前AD中的现有值
  • List<AdUser> pendingUpdateUsers:从文本文件读取的待更新用户列表,仅包含需要设值的用户
  1. 第一次操作:清空未出现在待更新列表中用户的属性
    对应你SQL逻辑里的第一个SET操作,用HashSet做快速匹配:
// 提取待更新用户名到HashSet,查询复杂度O(1),大数据量下性能更高
var updateUsernameSet = new HashSet<string>(
    pendingUpdateUsers.Select(u => u.Username.Trim().ToLower())
);
// 筛选全量用户中不在待更新列表的用户,需要清空属性
var usersToClear = allAdUsers.Where(u => 
    !updateUsernameSet.Contains(u.Username.Trim().ToLower())
).ToList();
// 遍历执行清空操作,调用你已有的AD更新接口即可
foreach (var user in usersToClear)
{
    // 示例:调用AD更新方法将对应自定义属性设为null/空
    SetAdUserAttribute(user.DistinguishedName, null);
}
  1. 第二次操作:更新待更新列表中用户的属性
    对应你SQL逻辑里的第二个SET操作,用字典快速取值:
// 把待更新列表转成字典,方便根据用户名快速取到要设置的新值
var updateDict = pendingUpdateUsers.ToDictionary(
    u => u.Username.Trim().ToLower(),
    u => u.CustomAttrValue
);
// 筛选需要更新的用户
var usersToUpdate = allAdUsers.Where(u => 
    updateUsernameSet.Contains(u.Username.Trim().ToLower())
).ToList();
// 遍历执行更新操作
foreach (var user in usersToUpdate)
{
    var newValue = updateDict[user.Username.Trim().ToLower()];
    SetAdUserAttribute(user.DistinguishedName, newValue);
}

注意事项

  • AD用户名大小写不敏感,对比时统一转为小写/大写,避免因大小写不一致导致匹配失败
  • 如果AD用户量超过10万,可以分批读取分批处理,避免内存占用过高
  • 你要搜索相关方案的关键词为:C# LINQ 集合对比、C# 差集 交集

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:54:02