c# - C# 将联系人同步到 AD 的最佳方法
问题描述
我正在创建一个小型实用程序,它将从源中获取用户数据。该用户数据包括全名和电子邮件,此来源将发生变化(更新、创建和删除用户)。
将该信息同步到 AD 的最佳方法是什么。我觉得他们的方式我正在做的不是最好/有效的方式。
现在我有代码可以删除 OU(本地活动目录)中的所有当前联系人,然后添加所有存在的联系人。此同步实用程序每 30 分钟运行一次。大约有300个联系人。在服务器上,打开了回收站,我的另一个担心是我当前的代码会创建一堆不必要的对象。
我需要具备以下能力: 删除不再是源头的联系人。更新在源头上所做的任何更改(电子邮件更新),或创建新联系人。
我正在使用 C# System.DirectoryServices。源无法触发或发送单独更新的信息。我只能从源中提取数据。
解决方案
根据我的经验,没有语言细节,它通常是这样的。
- 使用它们之间共有的唯一值将源和目标索引到字典对象。
- 从目标中删除源中不存在的项目。
- 创建源中但不在目标中的任何对象。
- 协调源信息与目标信息。这通常采用循环的形式,您可以在其中使用源的键以您需要的任何粒度级别来引用、比较和更改值。
对于步骤 1 和 2,字典对象通常具有检查键是否存在的方法。因此,当一个对象存在或不存在时,应该直接进行检查和操作。
我有许多程序可以同步来自/到各种来源/目的地的信息,包括 AD。我知道这不是 PowerShell 问题,但我强烈建议查看 PowerShell ActiveDirectory 模块(AD cmdlet)。有一种实例化功能非常适合这类事情。
$ADUser = Get-User MrSmith -Properties "DisplayName"
$ADUser.DisplayName = "Bob Smith"
Set-ADUser -Instance $ADUser
实例化能力自然是增量的,除非它不同,否则它不会重写属性。将对象存储在散列中可以很容易地循环源数据、引用目标对象比较、报告、重置应用等......
尽管实例具有功能,但我通常不会盲目地分配数据。这主要是因为我想记录正在发生的变化。尽管如此,这种模式对我来说效果很好。
推荐阅读
- list - Quill - 使用自定义格式实现几个有序列表
- django - 使用 AWS Elastic Beanstalk 进行部署时,我应该将静态文件存储在单独的 S3 中吗?
- node.js - 为什么当我尝试将文件从角度保存到节点时没有发送数据
- rebus - 如何使用 Rebus 处理阻塞的 RabbitmMQ 连接
- reactjs - React JS:运行启动不起作用。babel-eslint 依赖问题
- xcode13 - 你知道 Xcode 13 中的 Vary for Traits 在哪里吗?
- python - 如何传递对列表子集的引用?
- javascript - 如何在 Firestore Web 版本 9(模块化)的集合中获取子集合?
- wso2 - WSo2 身份服务器:用户通过我的帐户自行注册
- python - 名称“结果”未定义 - Python 3