2

データベースサーバーにユーザーが作成したストアドプロシージャがあり、Active Directoryにユーザー情報を照会し、データをテーブルに挿入します。データベースサーバーから操作を削除し、外部呼び出し(PowerShellまたはC#)で最初のADクエリとデータ挿入を実行したいと思います。

ストアドプロシージャは、sp_OAプロシージャを使用して、実際のADクエリを実行するADsDSOObjectを作成します。ADsDSOObjectはデフォルトでobjectSIDを16進数で返しているようです。以下は出力値の例です。

-- ADsDSOObject: 0x010500000000000515000000D94242061941C67FC9004A20EE030000

<objectSID>PowerShellを介してADSIクエリを実行すると、objectSIDのバイト配列が取得され、.NET System.Security.Principal.SecurityIdentifier( 、0) を介して文字列に変換できます。

これにより、実際の文字列SID識別子が適切なSID形式で返されます。

-- Byte Array: {1, 5, 0, 0, 0, 0, 0, 5, 21, 0, 0, 0, 217, 66, 66, 6, 25, 65, 198, 127, 201, 0, 74, 32, 245, 1, 0, 0}

-- .NET SID: S-1-5-21-105005785-2143699225-541720777-501

ただし、アプリケーションの変更を回避するために、データベース内のプロシージャを.NETソリューションに置き換えるために、データをバイナリとして保存する必要があります。

PowerShellまたはC#を使用して、バイト配列を16進数に変換する方法、または文字列SID表現を16進数に変換する方法を知っている人はいますか?

4

1 に答える 1

1

ここに解決策があります:

PS> $sid = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-21-105005785-2143699225-541720777-501")
PS> $c = New-Object 'byte[]' $sid.BinaryLength
PS> $sid.GetBinaryForm($c, 0)

$ cには、必要なバイト配列が含まれています。

于 2011-05-24T19:03:50.143 に答える