3

description、memberOfなどのADから複数値のプロパティを取得することは可能ですか。memberOfを追加するだけで実行すると、エラーが発生します

select * 
FROM OPENQUERY(ADSI,'SELECT initials, samAccountName, displayName, distinguishedName, mail, memberOf FROM ''LDAP://DC=corp, DC=contoso, DC=com'' WHERE objectClass=''Person''')

エラー:

メッセージ7346、レベル16、状態2、行1
リンクサーバー「ADSI」のOLEDBプロバイダー「ADSDSOObject」から行のデータを取得できません。符号の不一致またはオーバーフロー以外の理由により、データ値を変換できませんでした。

これは、memberOfがActiveDirectoryの複数値のプロパティであるためです。SQL Server2008R2を使用しています

4

4 に答える 4

5

いいえ、これを行うことはできません。また、それを機能させるための「トリック」やハックもありません。

SQL ServerのADSIプロバイダーはかなり制限されています。複数値の属性をサポートしないことは、それらの制限の1つです。

したがって、これを行う別の方法を見つける必要があります。たとえば、SQl-CLR統合を使用して.NET経由でActive Directoryにアクセスするか、SQLServerから使用するWebサービスとして必要なデータを公開します。

于 2013-01-14T11:33:54.250 に答える
2

ADSIを使用してmemberofを返すことはできませんが、memberofにクエリを実行できるため、チェックするグループがある場合は、extenstionAttribute3が従業員IDである場合に次の操作を実行できます。

SELECT displayName
FROM OPENQUERY(ADSI,
'SELECT displayName
FROM ''LDAP://DC=company,DC=com''
WHERE memberof = ''CN=staff,OU=SharepointGroups,DC=company,DC=com''
AND extensionAttribute3 = ''12345678''
')

戻り値がnullでない場合は、ユーザーがグループの一部であると見なすことができます。

于 2013-10-31T15:11:59.450 に答える
0

これを機能させるための私のトリック/ハックは次のとおりです。

exec xp_cmdshell 'powershell -command "get-aduser -filter * -properties SamAccountName, <MultiValue> | Select samaccountname, <MultiValue>"' 

<MultiValue>プルしようとしている属性に変更します。SQLで区切られたコンマとして値を出力します。必要に応じてPowerShellコマンドレットを変更します。あなたがしなければならないのは、出力を収集し、それをフォーマットし、そしてあなたの他のデータにそれを結合することです。また、サーバーにAD PowerShellモジュールがあり、SQLでxp_cmdshellが有効になっていることを確認してください。

于 2018-07-18T19:14:29.657 に答える
0

当社のイントラネットディレクトリに説明(複数値)フィールドを含めるSQLスクリプトを作成しました。私が行ったことは、PowerShellを使用してエクスポート-csvで区切り、その情報をテーブルに一括挿入することでした。従業員(レコード)が約650人しかないため、私にとって最も簡単なソリューションです。

exec xp_cmdshell 'powershell.exe -command "get-aduser -filter * -properties SamAccountName, Description,GivenName,sn,title,telephoneNumber,mobile,mail,physicalDeliveryOfficeName| Select SamAccountName, Description,GivenName,sn,title,telephoneNumber,mobile,mail,physicalDeliveryOfficeName| export-csv -encoding unicode -delimiter "`t" -path C:\SQLJobs\addir.csv -notype"'

Go

CREATE TABLE dbLiftowDir.dbo.ADDir
(
[SamAccountName] NVARCHAR(4000),
[Description] NVARCHAR(4000),
[GivenName] NVARCHAR(4000),
[sn] NVARCHAR(4000),
[title] NVARCHAR(4000)COLLATE French_CI_AS NOT NULL,
[telephoneNumber] NVARCHAR(4000),
[mobile] NVARCHAR(4000),
[mail] NVARCHAR(4000),
[physicalDeliveryOfficeName] NVARCHAR(4000),
)

BULK
INSERT dbLiftowDir.dbo.ADDir
FROM 'C:\SQLJobs\addir.csv'
WITH
(
 CODEPAGE = 'ACP',
   DATAFILETYPE ='char',
   FIELDTERMINATOR = '\t',
   ROWTERMINATOR = '\n',
   FIRSTROW = 2

私が行った他のことは、set column replace valueを使用してフィールド値から「」を削除し、人間以外のアカウントである行を削除することでした。コードをPowerShellに渡すよりも、SQLで行う方が簡単であることがわかりました。

于 2019-08-07T17:58:59.857 に答える