SQLServer 使用ADSI执行分布式查询ActiveDorectory对象

网络编程 2025-04-04 10:44www.168986.cn编程入门

深入了解 SQL Server 通过 ADSI 执行分布式查询 Active Directory 对象的实现方法

在 SQL Server 中,通过 ADSI(Active Directory 服务接口)执行分布式查询 Active Directory 对象是一个强大的功能。以下是实现这一功能的步骤:

第一步:创建链接服务器

为了开始,我们需要创建一个链接服务器,这可以通过执行系统存储过程 sp_addlinkedserver 来完成。具体的命令如下:

```sql

EXEC sp_addlinkedserver 'ADSI', 'Active Directory Services 2.5', 'ADSDSOObject', 'adsdatasource'

```

通过上述命令,我们创建了一个名为 "ADSI" 的链接服务器,它连接到 Active Directory 服务,并使用 ADSDSOObject 作为数据源。

第二步:创建 SQL Server 认证登录

接下来,我们需要为链接服务器创建一个 SQL Server 认证的登录。这可以通过执行 sp_addlinkedsrvlogin 系统存储过程来完成。具体的命令如下:

```sql

EXEC sp_addlinkedsrvlogin @rmtsrvname = N'ADSI', @locallogin = NULL, @useself = N'False', @rmtuser = N'domain\Account', @rmtpassword = N'Password'

```

这里,我们为链接服务器 "ADSI" 配置了一个登录账户和密码,该账户有权访问 Active Directory。如果选择使用 Windows 授权登录,则可以通过 SQL Server 的安全委托功能访问 AD,无需额外的配置。

通过这些步骤,SQL Server 就能够通过 ADSI 执行分布式查询 Active Directory 对象了。值得注意的是,为了成功执行这些操作,需要有足够的权限和正确的配置。如果遇到任何问题,可以参考相关的官方文档或社区论坛进行排查和解决。

当我们想要查询活动目录(Active Directory)中的用户或组信息时,我们通常会使用SQL查询来执行此操作。当我们遇到返回结果限制在1000个对象以内的问题时,我们需要采取一些策略来解决这个问题。其中一种方法是使用字母循环。

让我们看一下如何使用SQL查询活动目录中的用户和组信息。通过以下代码,我们可以查询特定组织单位(OU)中的用户条目和组条目:

```sql

-- 查询某个OU中的用户条目

SELECT convert(varchar(50), [Name]) as FullName,

convert(varchar(50), Title) as Title,

convert(varchar(50), TelephoneNumber) as PhoneNumber

FROM openquery(ADSI, 'SELECT Name, Title, TelephoneNumber FROM 'LDAP://OU=Directors,OU=Atlanta,OU=Intelli,DC=vizability,DC=intelli'')

WHERE objectClass = 'User'

-- 查询某个OU中的组条目

SELECT convert(varchar(50), [Name]) as GroupName,

convert(varchar(50), [Description]) as GroupDescription

FROM openquery(ADSI, 'SELECT Name, Description FROM 'LDAP://OU=VizAbility Groups,DC=vizability,DC=intelli'')

WHERE objectClass = 'Group'

```

```sql

-- 创建临时表

CREATE TABLE tmpADUsers (employeeId varchar(10) NULL, SAMAccountName varchar(255) NOT NULL, email varchar(255) NULL)

GO

DECLARE @cmdstr varchar(255)

DECLARE @nAsciiValue smallint

DECLARE @sChar char(1)

SELECT @nAsciiValue = 65

WHILE @nAsciiValue < 91

BEGIN

SELECT @sChar = CHAR(@nAsciiValue)

EXEC master..xp_sprintf @cmdstr OUTPUT, 'SELECT employeeId, SAMAccountName, Mail FROM OPENQUERY(ADSI, ''SELECT Mail, SAMAccountName, employeeID FROM ''LDAP://dc=central,dc=mydomain,dc=int''WHERE objectCategory = ''Person'' AND SAMAccountName = ''%s'' '')', @sChar

INSERT tmpADUsers EXEC(@cmdstr)

SELECT @nAsciiValue = @nAsciiValue + 1

END

-- 查询临时表中的数据

SELECT FROM tmpADUsers

-- 删除临时表

DROP TABLE tmpADUsers

```

除了循环遍历字母表的方法外,另一种推荐的方法是修改活动目录的策略设置。我们可以通过使用Ntdsutil工具来修改服务器上的限制。以下是使用Ntdsutil修改策略设置的步骤:

1. 点击“开始”,然后运行“Run”。

2. 在“打开”文本框中,输入“ntdsutil”,然后按Enter键。

3. 在Ntdsutil提示符下,输入“LDAP policies”并按Enter键。

4. 在LDAP政策提示符下,输入“Set setting to variable”并按Enter键。例如,输入“Set MaxPoolThreads to 8”。此设置可能会根据您添加的处理器数量而更改。

5. 使用“Show Values”命令验证您的更改。要保存更改,请使用“Commit Changes”。

6. 完成操作后,输入“q”并按Enter键退出Ntdsutil。

通过修改策略设置,您可以增加活动目录返回结果的限制,从而解决返回结果限制在1000个对象以内的问题。请注意,在进行任何更改之前,请确保您了解这些更改可能对您的影响,并在必要时咨询相关专家。

上一篇:浅析Javascript中双等号(==)隐性转换机制 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by