SSISパッケージでVB.NETを使用して、SQL Serverテーブルに複数のActiveDirectoryドメイン(同じフォレスト内)のユーザーを入力するにはどうすればよいですか?
3 に答える
リンクサーバークエリの代わりにADSIプロバイダーを使用することを除いて、Sivaのアプローチと同様のクエリを使用する方法を採用しました。ActiveDirectorySSISデータソース
SELECT
distinguishedName
, mail
, samaccountname
, Name
, employeeNumber
, objectSid
, userAccountControl
, givenName
, middleName
, sn
FROM
'LDAP://DC=domain,DC=net'
WHERE
sAMAccountType = 805306368
ORDER BY
sAMAccountName ASC
参照されている投稿のコードは、特定のドメインからすべてのユーザーをプルします。NTEXTからTEXT、Stringに変換した後、識別名とDirectoryServicesアセンブリを使用して、識別名を介してユーザーのすべてのファーストオーダーグループを列挙します。ネストされたグループには対応していません。便利なことに、その投稿は2005 SSISの実装をカバーしているため、ロジックはVBになっています。
System.DirectoryServices を使用したスクリプト コンポーネント (VB.NET)
Sourceとして構成されたスクリプト コンポーネントの VB.NET を使用して、Active Directory ユーザー情報を 1 つのドメインからデータベース テーブルにインポートするサンプル ロジックを次に示します。このサンプルは SSIS 2012 でテストされましたが、SSIS 2008 以降で動作するはずです。名前空間は .NET Framework 3.5 でのみ導入され、SSIS 2005 は .NET Framework 2.0 を使用するため、このロジックは SSIS 2005 では機能しません。System.DirectoryServices.AccountManagement
SSIS パッケージを作成します。このサンプルでは、SSIS 2012 を使用しています。
OLEDB Connection Manager
SQL Server データベースに接続する を作成します。データ ソースを作成した場合は、データ ソースをパッケージの [接続マネージャー] タブに追加します。を [制御フロー] タブにドラッグ アンド ドロップし
Data Flow Task
ます。をダブルクリックして、 [データ フロー] タブ
Data Flow Task
に切り替えます。を [データ フロー] タブにドラッグ アンド ドロップし
Script Component
ます。[スクリプト コンポーネント タイプ
Source
の選択] ダイアログをオンにして、 [OK] をクリックします。スクリプト コンポーネントをダブルクリックして、スクリプト変換エディタを開きます。
Inputs and Outputs
タブページをクリックします。出力の名前を ActiveDirectory に変更して、意味のある名前を付けます。
[出力列] を選択し、[列の追加] をクリックして、以下の各列を追加します。これは、この例を説明するためだけのものです。好みの列を追加する必要がある場合があります。
スクリプト コンポーネント内の列定義
Name Data Type Length
----------------- ------------------------ ------
FirstName Unicode string [DT_WSTR] 255
LastName Unicode string [DT_WSTR] 255
SAMAccountName Unicode string [DT_WSTR] 255
UserPrincipalName Unicode string [DT_WSTR] 255
列を定義した後、
Script
タブページをクリックしますScriptLanguage を次のように変更します。
Microsoft Visual Basic 2010
ソリューション エクスプローラーで、スクリプト コンポーネント プロジェクトを右クリックし、[ ] をクリックします
Add Reference...
。次の名前空間への参照を追加します。
スクリプト コンポーネントで参照される名前空間
System.DirectoryServices
System.DirectoryServices.AccountManagement
- 以下の VB.NET コードをスクリプト コンポーネントに貼り付けます。
<Your domain name goes here>
セクションを適切なドメイン名に置き換えます。このコードは、メソッドでPrincipalContextオブジェクトとPrincipalSearcherオブジェクトを初期化し、メソッドでそれらを破棄します。CreateNewOutputRows メソッドは、AD で見つかった各行をループして、ユーザー属性情報を取得します。PreExecute
PostExecute
スクリプト コンポーネント コード (VB.NET)
#Region "Imports"
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports System.DirectoryServices.AccountManagement
Imports System.DirectoryServices
#End Region
<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute()> _
<CLSCompliant(False)> _
Public Class ScriptMain
Inherits UserComponent
Dim principalContext As PrincipalContext = Nothing
Dim principalSearcher As PrincipalSearcher = Nothing
Public Overrides Sub PreExecute()
principalContext = New PrincipalContext(ContextType.Domain, "<Your domain name goes here>")
principalSearcher = New PrincipalSearcher(New UserPrincipal(principalContext))
MyBase.PreExecute()
End Sub
Public Overrides Sub PostExecute()
principalContext = Nothing
principalSearcher = Nothing
MyBase.PostExecute()
End Sub
Public Overrides Sub CreateNewOutputRows()
For Each principal As Principal In principalSearcher.FindAll()
Dim entry As DirectoryEntry = TryCast(principal.GetUnderlyingObject(), DirectoryEntry)
With ActiveDirectoryBuffer
.AddRow()
If entry.Properties("givenName").Value IsNot Nothing Then
.FirstName = entry.Properties("givenName").Value.ToString()
Else
.FirstName = "Unknown"
End If
If entry.Properties("sn").Value IsNot Nothing Then
.LastName = entry.Properties("sn").Value.ToString()
Else
.LastName = "Unknown"
End If
If entry.Properties("samAccountName").Value IsNot Nothing Then
.SAMAccountName = entry.Properties("samAccountName").Value.ToString()
Else
.SAMAccountName = "Unknown"
End If
If entry.Properties("userPrincipalName").Value IsNot Nothing Then
.UserPrincipalName = entry.Properties("userPrincipalName").Value.ToString()
Else
.UserPrincipalName = "Unknown"
End If
End With
Next
End Sub
End Class
スクリプト変換エディターを閉じます。
OLE DB 変換先を [データ フロー] タブにドラッグ アンド ドロップします。スクリプト コンポーネントを OLE DB 宛先に接続して、ソース出力をリダイレクトします。適切な OLE DB 接続マネージャーと、データを挿入するテーブルを選択します。
このアプローチを改善する方法:
このサンプルは、1 つのドメインのみからの読み込み情報を提供します。複数のドメインがある場合は、それらをテーブルに格納できます。すべてのドメイン リストの情報をForeach Loop Container
取得し、制御フローで使用可能なものを使用して各ドメインをループし、上記の方法を使用してユーザー情報を取得します。VB.NET 内でこれを行うためのより良い方法もあるかもしれません。
Active Directory ユーザー属性
Active Directory ユーザー属性の完全なリストは、以下の MSDN リンクにあります。LDAP-Display-Name を見つけるには、リンクをクリックする必要があります。
ユーザーオブジェクトの属性を取得するのに役立つ別のリンクがあります