【问题标题】:C# Best method to sync contacts to ADC# 将联系人同步到 AD 的最佳方法
【发布时间】:2021-02-26 18:29:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 删除然后重新添加所有内容似乎是一种蛮力方法,因为您最终可能会删除您只需添加回来的内容。 (如果有人在同步完成之前尝试使用该信息,也会出现问题,因为项目会暂时丢失)。最好 (1) 删除不再位于源中的项目,(2) 遍历剩余项目以检查任何必要的更新,以及 (3) 添加任何全新的联系人。这是同步两个列表的一种非常简单的方法。
  • 我同意,但是,以编程方式实现这一目标的最佳方法是什么(不要求特定代码,我只需要一个概念)。添加新是最简单的,我所要做的就是检查对象是否存在于 AD 上,如果不存在则创建。对于更新,我可以检查是否存在,如果存在,我可以比较邮件属性并更新是否不同。但是对于删除?最好的方法是什么?
  • 您知道如何检查对象是否存在于 AD 中。你能不颠倒这个逻辑来检查源中是否仍然存在 AD 对象吗?
  • 我在想这个,源码的API很奇怪,但理论上是可以的。我稍后会尝试在此处更新状态。
  • 我个人会将问题分解。只需从奇怪的 API 中获取完整列表并将其存储在 C# 对象中,然后从那里完成其余的工作。

标签: c# active-directory directoryservices


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2011-10-09
    • 1970-01-01
    • 2016-09-17
    相关资源
    最近更新 更多