使用openquery 查询AD无法超过1000条记录的解决办法 | 无法从链接服务器 “ADSI“ 的 OLE DB 访问接口“ADSDSOObject“提取行。 (7330)

默认情况下,使用ADSI连接用SQL查询AD资料,只能查询1000条,超过就会报错7330
原因:这是AD架构决定的
解法:修改AD架构,或者使用分页查询

1.修改架构法,参考下图

默认是1000,修改为10000或更多
在这里插入图片描述

2. 分段查询后union,修改下列代码中的OU路径

DECLARE @SYMBOLS AS VARCHAR(128); DECLARE @query VARCHAR(MAX); DECLARE @ADfields VARCHAR(MAX);
SET @SYMBOLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; -- AD Search character prefixes used to partition search. (1000 page limit). Below, AD fields to retrieve:
SET @ADfields = 'cn, sAMAccountName, accountExpires, pwdLastSet, userAccountControl, ADsPath, lockouttime, manager, mail, createTimeStamp, employeeID, lastLogon, co, l';
SET @query = 'SELECT * INTO ##tmpAD FROM (';
 
-- Get each character and for each character construct and AD query:
WITH nmTbl AS (SELECT TOP (LEN(@SYMBOLS)) Idx = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects ORDER BY Idx)
SELECT @query = @query + 'SELECT * FROM OPENQUERY(ADSI, ''SELECT ' + @ADfields + ' FROM ''''LDAP://修改为你的OU路径''''   
WHERE objectCategory=''''Person'''' AND (cn = ''''' + SUBSTRING(@SYMBOLS, nmTbl.Idx, 1) + '*'''') AND (objectClass = ''''user'''' OR objectClass = ''''contact'''')'')
UNION
' FROM nmTbl;
 
-- Finish generating query string:
SELECT @query = LEFT(@query, LEN(@query) - CHARINDEX(REVERSE('UNION'), REVERSE(@query)) - 4) + ') AS qry'
 
-- Remove temp table if existing before running:
IF OBJECT_ID('tempdb.dbo.##tmpAD', 'U') IS NOT NULL
    DROP TABLE ##tmpAD; 
EXECUTE(@query)
 
SELECT * FROM ##tmpAD

猜你喜欢

转载自blog.csdn.net/wangrui1573/article/details/125263040
今日推荐