【问题标题】:SQL Query to loop through AD OUs and get a count of objects用于循环 AD OU 并获取对象计数的 SQL 查询
【发布时间】:2015-05-14 05:24:25
【问题描述】:

我正在尝试生成一个报告,其中包含来自 SQL Server 的许多 AD OU 中的计算机对象计数,以便我可以将其连接到 SQL DB 中的其他数据,然后使用 SSRS 创建一个报告。

我已经知道如何使用单个 OU(在我的情况下代表具有唯一代码的物理站点位置),但我需要能够为目录中的所有 OU 执行此操作。

这是我获取 1 个单一 OU 的结果的查询。有什么想法吗?

            DECLARE @SiteCode int
            SET @SiteCode = 1234

            DECLARE @Region nvarchar(100)
            SET @Region = (
                            SELECT TOP 1        RegionName
                            FROM            tbl_ADSiteInfo
                            WHERE           SiteCode = @SiteCode
                          )

            DECLARE @SiteName nvarchar(250)
            SET @SiteName = (
                                    SELECT TOP 1    SiteName
                                    FROM            tbl_ADSiteInfo
                                    WHERE           SiteCode = @SiteCode
                              )

            DECLARE @SQL nvarchar(1000)
            SET @SQL = '
            SELECT TOP 901  COUNT(*) As ''Count''
            FROM            OpenQuery(
                                        ADSI,
                                        ''
                                        SELECT distinguishedName,extensionAttribute3,extensionAttribute4,extensionAttribute2, name
                                        FROM ''''LDAP://OU=Computers,OU=' + @SiteName + ',OU=' + @Region + ',OU=Branches,DC=COMPANY,DC=COM''''
                                        WHERE objectClass = ''''Computer''''
                                        ''
                                    ) AS tblADSI

            '

            exec dbo.sp_executeSQL @SQL

【问题讨论】:

  • 您需要重新考虑这一点。递归地从 AD 中选择每个对象(或仅选择主文件夹下的所有对象),从可分辨名称中提取容器路径,然后按该路径分组以按 OU 进行对象计数。

标签: sql-server active-directory


【解决方案1】:

想了一会儿,我自己想出了如何做到这一点。

首先,我查询一个现有表,以获取我组织中我们网站 (SiteCode) 的唯一 ID 数据集,并将它们写入一个临时表,其中另一个名为“已处理”的列的值为 0。

然后,我执行一个 WHILE 循环,其条件为 SELECT COUNT(SiteCode) FROM #TMP WHERE Processed = 0 > 1

然后我使用 WHERE Processed = '0' 执行 SELECT TOP 1 以获取 SiteCode 并使用它来查询另一个表以获取该站点容器的 LDAP 路径,然后执行 LDAP 查询以获取计算机计数对象并将值写入另一个表,该表将保存我想要的结果。获得所需数据后,我将该记录设置为 Processed = '1',然后循环继续。

最终,所有站点的 Processed = '1' 并且循环将结束。然后我 DROP 临时表,因为我不再需要它了。

我有点担心这样做会导致执行时间过长,但除了手数之外,我不知道还能做什么,反正我很满意 :)

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多