【问题标题】:Import Active Directory to SQL Server将 Active Directory 导入 SQL Server
【发布时间】:2023-04-06 18:21:01
【问题描述】:

我正在处理一个 Microsoft BI 项目。

我目前正在将我的系统连接到 SQL Server。我想将我的 Active Directory 连接到 SQL Server 中的一个表,并且我想每小时同步到一个表。这意味着每个小时都会更新 Active Directory 的详细信息。

我意识到有必要使用 SSIS 来执行此操作。我很乐意在 SSIS 的帮助下将我的 AD 连接到 SQL Server。

【问题讨论】:

  • 您想要广告的特定部分吗?除了最小的公司,AD 往往是巨大的。每小时制作整个森林的 SQL 副本是一件非常奇怪的事情,它可能会对您的 AD、网络、安全性和域范围的性能产生许多不利影响。如果您只是想备份您的 AD,我相信还有其他可用的选项。

标签: sql-server ssis active-directory business-intelligence


【解决方案1】:

您可以通过两种途径将 AC 用户类同步到表中。您可以在 SSIS 数据流任务中使用 ADO 源,也可以编写自定义 .NET 代码作为脚本源的一部分。正确的答案取决于您的团队维护和排除特定解决方案的能力以及您的 AD 树/林的大小。如果您是一家小商店(不到一千人),那么任何事情都会奏效。如果您是一家较大的商店,那么您需要担心查询机制和返回的总行数,因为在单个查询中可以返回多少个结果是有上限的。在这种情况下,脚本任务可能更有意义,因为您可以更轻松地编写查询来提取以 A、B 等开头的所有帐户。我从未使用过希伯来语,所以我假设可以做类似的事情过滤 aleph、bet 等。

一般步骤

确定您的域控制器,因为您需要知道从哪个服务器询问信息。我不知道如何处理 Azure Active Directory 请求,因为我相信它在那里的工作方式有点不同,但还没有需要它的客户端工作。

为 ADO.NET 创建一个连接管理器。使用“.Net Providers for OleDb\OLE DB Provider for Microsoft Directory Services”并将其指向您的 DC。

编写查询以提取您需要的数据。根据评论,您似乎想要这样的东西

SELECT
    distinguishedName
,   mail
,   samaccountname
,   mobile
,   telephoneNumber
,   objectSid
,   userAccountControl
,   title
,   sn
FROM
    'LDAP://DC=domain,DC=net'
WHERE
    sAMAccountType = 805306368
ORDER BY
    sAMAccountName ASC

使用该查询,我们将添加一个数据流任务,并在其中添加一个 ADO.NET 源。将其配置为使用我们的 ADO.NET 连接管理器并使用上述查询(调整 LDAP 行和您需要/不需要的任何其他字段)

将 OLE DB 连接管理器添加到您的包中,并将其指向将记录数据的数据库。

将 OLE DB 目标添加到数据流并将 ADO.NET 源的输出线连接到此目标。在下拉列表和“列”选项卡上选择表,确保所有列都已连接。您可能会遇到数据类型不匹配的问题,因此您需要弄清楚如何处理 - 要么更改表定义以匹配源,要么您需要将数据转换/派生列组件添加到数据流将数据修改成正确的形状。

您可能很想加入群组成员资格。不要。将其作为一个单独的任务,因为一个人可能是许多组的成员(在一个客户中,我在 94 个组中)。此外,MemberOf 数据类型是 SSIS 无法处理的 DistinguishedName、DN。因此,请在将类型添加到 AD 查询之前检查它们。

参考文献

ldap query to get disabled user records with whenchanged within 30 days

http://billfellows.blogspot.com/2011/04/active-directory-ssis-data-source.html http://billfellows.blogspot.com/2013/11/biml-active-directory-ssis-data-source.html

【讨论】:

    【解决方案2】:

    您想要广告的特定部分吗?除了最小的公司之外,AD 往往是巨大的。每小时制作整个森林的 SQL 副本是一件非常奇怪的事情,它可能会对您的 AD、网络、安全性和域范围的性能产生许多不利影响。

    如果您只是想备份您的 AD,我相信还有其他可用的选项,特定于 Windows AD(甚至可能是内置的,我不是 AD 专家)。

    如果您真的非常想这样做,这里有一个链接可以帮助您入门:https://social.technet.microsoft.com/Forums/ie/en-US/79bb4879-4d82-4a41-81a4-c62afc6c4b1e/copy-all-ad-objects-to-sql-database?forum=winserverDS。您可以通过谷歌搜索“将 AD 复制到 Sql”找到更多关于此的文章。

    但是,请注意警告:AD 实际上是一个多域范围的分布式数据库,尝试每小时将其复制到像 SQL Server 这样的集中式数据库中是禁忌的。你真的在反对它的设计。


    根据评论更新:

    基本上,您在这里的一个问题太多了。 Sql Server、SSIS 和 Active Directory (AD) 各自都是巨大的主题,当您第一次尝试将它们全部一起使用时,您会遇到许多单独的问题,具体取决于您的环境、经验和特定的项目目标。我们无法在本网站的一个答案中预测所有这些问题。

    您需要开始使用您从以下链接中获得的信息开始自己实施,然后在遇到问题时提出具体的问题。

    这里是您可以开始的链接,

    当您解决此问题时,您可能会遇到特定问题,您可以在https://dba.stackexchange.com 询问有关 Sql Server 和 SSIS 的更具体专业知识。

    根据您的目标,我认为您会希望使用临时表方法。也就是说,使用您的 AD/Sql 查询将所有 AD 用户记录导入一个新的/空的临时表,该临时表与您的生产表具有相同的列定义,然后使用合并查询来查找和更新更改的用户记录并插入新的用户记录(这称为差异或类型 II 更新)。

    【讨论】:

    • 谢谢,但这不是我的意图 我需要向用户展示智能 我需要将用户复制到 SQL 我需要每小时复制一次 SQL 中缺少的用户 我只复制到用户表失踪不是一遍又一遍的规则
    • 我想做数据检索,因为在这个例子中,查询由 SSIS 计时并将信息传输到表中。 yiengly.wordpress.com/2018/04/08/… SELECT * FROM OpenQuery ( ADSI, 'SELECT mail, mobile, telephoneNumber, title, sn, givenName, SAMAccountName FROM '' LDAP: // OU = , DC = , DC = , DC = com '' WHERE objectClass = '' user '' AND NOT objectClass = '' computer '' ' ) AS tblADS ORDER BY SAMAccountName
    • @חןחכמון 我已根据您最近的 cmets 更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多