0

SSISパッケージでVB.NETを使用して、SQL Serverテーブルに複数のActiveDirectoryドメイン(同じフォレスト内)のユーザーを入力するにはどうすればよいですか?

4

3 に答える 3

2

リンクサーバークエリの代わりに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になっています。

于 2013-02-18T02:35:31.963 に答える
1

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 ManagerSQL 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 で見つかった各行をループして、ユーザー属性情報を取得します。PreExecutePostExecute

スクリプト コンポーネント コード (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 を見つけるには、リンクをクリックする必要があります。

すべての属性 (Windows)

ユーザーオブジェクトの属性を取得するのに役立つ別のリンクがあります

ユーザー オブジェクトの属性 (Windows)

于 2013-02-18T02:45:42.097 に答える