首页 > 解决方案 > C# 将联系人同步到 AD 的最佳方法

问题描述

我正在创建一个小型实用程序,它将从源中获取用户数据。该用户数据包括全名和电子邮件,此来源将发生变化(更新、创建和删除用户)。

将该信息同步到 AD 的最佳方法是什么。我觉得他们的方式我正在做的不是最好/有效的方式。

现在我有代码可以删除 OU(本地活动目录)中的所有当前联系人,然后添加所有存在的联系人。此同步实用程序每 30 分钟运行一次。大约有300个联系人。在服务器上,打开了回收站,我的另一个担心是我当前的代码会创建一堆不必要的对象。

我需要具备以下能力: 删除不再是源头的联系人。更新在源头上所做的任何更改(电子邮件更新),或创建新联系人。

我正在使用 C# System.DirectoryServices。源无法触发或发送单独更新的信息。我只能从源中提取数据。

标签: c#active-directorydirectoryservices

解决方案


根据我的经验,没有语言细节,它通常是这样的。

  1. 使用它们之间共有的唯一值将源和目标索引到字典对象。
  2. 从目标中删除源中不存在的项目。
  3. 创建源中但不在目标中的任何对象。
  4. 协调源信息与目标信息。这通常采用循环的形式,您可以在其中使用源的键以您需要的任何粒度级别来引用、比较和更改值。

对于步骤 1 和 2,字典对象通常具有检查键是否存在的方法。因此,当一个对象存在或不存在时,应该直接进行检查和操作。

我有许多程序可以同步来自/到各种来源/目的地的信息,包括 AD。我知道这不是 PowerShell 问题,但我强烈建议查看 PowerShell ActiveDirectory 模块(AD cmdlet)。有一种实例化功能非常适合这类事情。

$ADUser = Get-User MrSmith -Properties "DisplayName"
$ADUser.DisplayName = "Bob Smith"
Set-ADUser -Instance $ADUser

实例化能力自然是增量的,除非它不同,否则它不会重写属性。将对象存储在散列中可以很容易地循环源数据、引用目标对象比较、报告、重置应用等......

尽管实例具有功能,但我通常不会盲目地分配数据。这主要是因为我想记录正在发生的变化。尽管如此,这种模式对我来说效果很好。


推荐阅读