從 SQL Server 查詢外部 LDAP 伺服器
我對查詢 LDAP 伺服器進行了廣泛的研究,但到目前為止還沒有解決。所以請高手幫忙
**背景:**我有一個客戶端,其 LDAP 伺服器是 OnPremise(儘管面向公眾),並且我在防火牆內有一個 SQL Server(2012 SE)。外部 LDAP 和內部 SQL Server 之間的通信很好,因為我可以互相 ping 通。我還創建了一個遠端域帳戶,並在 SQL Server 上創建連結伺服器時使用了此帳戶。我也有具有域信任關係的內部域控制器。現在,我使用域帳戶創建了 2 個連結伺服器,但我無法在內部和外部查詢 LDAP 伺服器。我希望這是有道理的。無論如何,這是我的連結伺服器的定義和我收到的錯誤
$$ Solved $$將伺服器連結到內部 LDAP 伺服器:通過使用 ADuser@domain.com 而不是 domain/ADuser 解決了這個問題
USE [master] GO EXEC master.dbo.sp_addlinkedserver @server = N'ADSI', @srvproduct=N'Active Directory Service Interfaces', @provider=N'ADSDSOObject', @datasrc=N'adsdatasource' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL, @rmtuser=N'Domain/ADUser',@rmtpassword='########'
錯誤:
消息 7321,級別 16,狀態 2,第 1 行準備查詢“SELECT *
FROM ‘LDAP://Domain.com/OU=Accounts,DC=Domain,DC=com’–WHERE objectClass = ‘User ‘" 用於針對連結伺服器“ADSI”的 OLE DB 提供程序“ADSDSOObject”執行。
連結伺服器到外部 LDAP 伺服器
USE [master] GO EXEC master.dbo.sp_addlinkedserver @server = N'ADSIE', @srvproduct=N'Active Directory Service Interfaces', @provider=N'ADSDSOObject', @datasrc=N'CustomerIPAdress' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL, @rmtuser=N'Domain/ADUser',@rmtpassword='########'
錯誤:
消息 7399,級別 16,狀態 1,第 1 行連結伺服器“ADSIE”的 OLE DB 提供程序“ADsDSOObject”報告 > 錯誤。提供者表示使用者沒有>執行操作的權限。消息 7321,級別 16,狀態 2,第 1 行準備查詢“SELECT * FROM ‘LDAP://Customer IP Adress’ WHERE objectClass = ‘User’”以針對連結伺服器的 OLE DB 提供程序“ADsDSOObject”執行時發生錯誤>“ADSIE”。
任何幫助將不勝感激。在此先感謝。
您的第二條錯誤消息中最突出的是以下消息:
提供者表示使用者沒有執行操作的權限
這告訴我連結伺服器配置中的使用者無權訪問 AD / LDAP 伺服器來執行該查詢。這是我的 ADSI 配置以及範例查詢。您可能需要與您的 SA 團隊合作,以確保在您的連結伺服器中配置的帳戶具有查詢 AD / LDAP 的正確訪問權限。
USE [master] GO /****** Object: LinkedServer [ADSI] Script Date: 11/10/2017 3:46:31 PM ******/ EXEC master.dbo.sp_addlinkedserver @server = N'ADSI', @srvproduct=N'Active Directory Services 2.5', @provider=N'ADSDSOObject', @datasrc=N'adsdatasource' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL,@rmtuser=N'domain\accountname',@rmtpassword='########' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'collation compatible', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'data access', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'dist', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'pub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'rpc', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'rpc out', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'sub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'connect timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'collation name', @optvalue=NULL GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'lazy schema validation', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'query timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'use remote collation', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'remote proc transaction promotion', @optvalue=N'true' GO
這裡是一個使用openquery使用ADSI連結伺服器的例子,但是在建構LDAP連接字元串之前,你需要了解AD的OU結構和域結構。
SELECT sn, displayName, givenName, mail, telephoneNumber, ipPhone, sAMAccountName FROM OPENQUERY(ADSI, 'SELECT sAMAccountName, displayName, telephoneNumber, ipPhone, mail, givenName, sn FROM ''LDAP://DC=test,DC=intranet,DC=com'' WHERE objectCategory = ''Person'' AND objectClass = ''user''') AS derivedtbl_1
注意:出於安全原因,我更改了 LDAP 字元串中的 DC 名稱,但您應該能夠理解。
即使您設法完成
EXEC master.dbo.sp_addlinkedserver
andEXEC master.dbo.sp_addlinkedsrvlogin
,您也會面臨另一個問題:您將無法使用OPENROWSET
或OPENDATASOURCE
除非您是數據庫管理員。您可以在啟用此 AdHoc 功能的數據庫伺服器上創建系統資料庫設置。