Sql-Server

從 SQL Server 查詢外部 LDAP 伺服器

  • March 26, 2021

我對查詢 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_addlinkedserverand EXEC master.dbo.sp_addlinkedsrvlogin,您也會面臨另一個問題:您將無法使用OPENROWSETOPENDATASOURCE除非您是數據庫管理員

您可以在啟用此 AdHoc 功能的數據庫伺服器上創建系統資料庫設置。

引用自:https://dba.stackexchange.com/questions/188126