web-dev-qa-db-ja.com

SQL Serverからの外部LDAPサーバーへのクエリ

私はLDAPサーバーのクエリについて広範な調査を行いましたが、これまでのところ回避できませんでした。したがって、専門家に助けを求める

Background: LDAPサーバーがOnPremiseであるクライアントを公開していますが(パブリックに面しています)、ファイアウォールの内側にSQL Server(2012 SE)があります。外部LDAPと内部SQL Server間の通信は、お互いにpingできるので問題ありません。また、リモートドメインアカウントを作成し、SQL Server上にリンクサーバーを作成するときにこのアカウントを使用しました。また、ドメイン信頼関係を持つ内部ドメインコントローラーもあります。ここで、ドメインアカウントを使用して2つのリンクサーバーを作成しましたが、内部と外部の両方でLDAPサーバーにクエリを実行できませんでした。これが理にかなっているといいのですが。とにかく、ここに私のリンクサーバーと私が受け取っているエラーの定義があります

[解決済み]内部LDAPサーバーへのリンクサーバー:これは、domain/ADuserの代わりに[email protected]を使用することで解決されました

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' "for execution for OLE DB provider" ADSDSOObject "forリンクサーバー「ADSI」。

外部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 OLE DBプロバイダー "ADsDSOObject"に対して実行するクエリ "SELECT * FROM 'LDAP:// Customer IP Adress' WHERE objectClass = 'User'"の準備中にエラーが発生しました"リンクサーバーの場合>" ADSIE "。

任意の助けいただければ幸いです。事前に感謝します。

7
Sid

2番目のエラーメッセージで最も目立つのは、以下のメッセージです。

プロバイダーは、ユーザーが操作を実行する権限を持っていなかったことを示しています

これは、リンクサーバー構成のユーザーがそのクエリを実行するために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=の名前を変更しましたが、アイデアを理解できるはずです。

1
H.79