使用 SQL Server OpenQuery 查詢 AD 使用者資訊,甚麼都查得到喔!
最近對於要使用程式撈 Active Directory 使用者資料一直很頭痛,LDAP 甚麼的、DirectoryEntry、DirectorySearcher、SearchResult 很頭痛 = =
幸好,找到了使用 SQL Server OPENQUERY 指令擷取 AD 使用者資訊的方法,這,方便太多了...
指令很簡單,在這邊記錄一下
測試環境:
1. Windows Server 2003 R2 + AD + SQL Server 2005 (AD 與 SQL Server在同一主機)
2. 進行查詢的 SQL Server Management Studio 也在同一伺服器上
--在 SQL Server 上建立一個連結伺服器 (Linked Server)
EXEC sp_addlinkedserver 'ADSI', 'Active Directory Services 2.5', 'ADSDSOObject', 'adsdatasource'
--預設情況下,SQL Server不允許 OpenQuery,所以用 show advanced option 打開系統預儲程式進階選項並配合下面的 Ad Hoc Distributed Queries 選項
sp_configure 'show advanced options', 1
reconfigure with override
--再使用 Ad Hoc Distributed Queries 打開特定分散式查詢選項
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
--測試查詢,結果產出如 LDAP://192.168.0.xxx/CN=Administrator,CN=Users,DC=angi,DC=com,DC=tw (裡面的值當然是改過的)
SELECT * FROM OpenQuery(ADSI, 'SELECT * FROM ''LDAP://DC=angi,DC=com,DC=tw'' WHERE objectCategory=''user'' ')
--測試查詢,找出 mail, displayName 等資訊
SELECT * FROM OpenQuery(ADSI, 'SELECT mail, displayName, userPrincipalName FROM ''LDAP://DC=angi,DC=com,DC=tw'' WHERE objectCategory=''user'' ')
EXEC sp_addlinkedserver 'ADSI', 'Active Directory Services 2.5', 'ADSDSOObject', 'adsdatasource'
--預設情況下,SQL Server不允許 OpenQuery,所以用 show advanced option 打開系統預儲程式進階選項並配合下面的 Ad Hoc Distributed Queries 選項
sp_configure 'show advanced options', 1
reconfigure with override
--再使用 Ad Hoc Distributed Queries 打開特定分散式查詢選項
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
--測試查詢,結果產出如 LDAP://192.168.0.xxx/CN=Administrator,CN=Users,DC=angi,DC=com,DC=tw (裡面的值當然是改過的)
SELECT * FROM OpenQuery(ADSI, 'SELECT * FROM ''LDAP://DC=angi,DC=com,DC=tw'' WHERE objectCategory=''user'' ')
--測試查詢,找出 mail, displayName 等資訊
SELECT * FROM OpenQuery(ADSI, 'SELECT mail, displayName, userPrincipalName FROM ''LDAP://DC=angi,DC=com,DC=tw'' WHERE objectCategory=''user'' ')
當然,小弟很懶,所以查詢的 LDAP 字串以 IP 代替... :P
ref: Running Active Directory Services Queries Using MS SQL Server OPENQUERY Command