質問者
PowerShell での ActiveDirectory 情報取得について

質問
すべての返信
-
チャブーンです。
Get-ADUserコマンドレットで特定の属性を取りたい場合、-properties <属性名>オプションをつけるといいでしょう。全部の属性が取りたいなら -properties * (ワイルドカード)で問題ないはずです。
「うまくいかない」が何をさしているかわからないのですが、たとえばproxyAddresses属性はコレクションですので、値は配列型になります。個々の値がとりたい場合、foreach等でループさせて値を取得する必要があります。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
- 回答の候補に設定 LapivyMVP 2017年5月8日 6:57
-
チャブーンさん
ありがとうございます。
Get-ADUser 単体で全情報を取得するのはできているのですが、
併せて ProxyAddresses と ExtensionAttribute すべてを取得したいです。------------------------------------------------------------
Get-ADUser -Filter * -Properties * | Select-Object * | select *, @{L = "ProxyAddresses"; E = { $_.ProxyAddresses -join ";"}} | Export-Csv -Path C:\InfoPrxAdr2.txt -Encoding Default -NoTypeInformation
------------------------------------------------------------
というコマンドレットを実行すると、以下のエラーが出ます。
------------------------------------------------------------
Select-Object : The property cannot be processed because the property "ProxyAddresses" already exists.At line:1 char:69
+ ... -Object * | select *, @{L = "ProxyAddresses"; E = { $_.ProxyAddresses ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (@{Distinguished...opertyCount=11}:PSObject) [Select-Object], PSArgumentException
+ FullyQualifiedErrorId : AlreadyExistingUserSpecifiedPropertyNoExpand,Microsoft.PowerShell.Commands.SelectObjectCommand------------------------------------------------------------
以下のコマンドレットは正常に結果が帰ってきました。
------------------------------------------------------------
Get-ADUser -Filter * -Properties proxyaddresses | Select-Object userPrincipalName, @{L = "ProxyAddresses"; E = { $_.ProxyAddresses -join ";"}} | Export-Csv -Path C:\InfoPrxAdr2.txt -Encoding Default -NoTypeInformation
------------------------------------------------------------
上記について、コマンドレットだけで対応するのは難しいでしょうか。
.ps1 を記述することはおそらく大丈夫かと思います。
以上よろしくお願いいたします。
-
エラーメッセージの通り、Select-Objectに指定するプロパティ"ProxyAddresses" が、ワイルドカードに含まれている分と、明示的に指定した分で重複しているのが原因です。
よって、以下のように-ExcludePropertyパラメータを使って、ワイルドカードから当該のプロパティ名を除外するとうまくいくかと思います。
Get-ADUser -Filter * -Properties * | Select-Object *, @{L = "ProxyAddresses"; E = { $_.ProxyAddresses -join ";"}} -ExcludeProperty ProxyAddresses | Export-Csv -Path C:\InfoPrxAdr2.txt -Encoding Default -NoTypeInformation
- 回答の候補に設定 チャブーンMVP 2017年5月8日 9:32
-
チャブーンです。
エラーの件ですが、
Select-Object : The property cannot be processed because the property "ProxyAddresses" already exists.At line:1 char:69
下線にあるとおり、select * ですべてのプロパティを選択しているのに、さらに"ProxyAddresses"プロパティを選択したため「(存在するプロパティを選ぼうとして)カブっていますよ」と怒られているのです。
端的にいうと、出力したいプロパティを明示的に選んで、それを書くようにするのが一番簡単です。全部書き出したい場合は、オブジェクトのpropertynamesプロパティからプロパティ名を表示させ、それを連列させた文字列をInvoke-Expressionコマンドで実行する、といった工夫が要ります。この中でProxyAddressesだけを別の文字列に差し替えるといった風になると思います。追記:牟田口さんから答えが出ていますので、そちらを参考にしてください。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
- 編集済み チャブーンMVP 2017年5月8日 9:32
-
チャブーンです。
Get-ADUser -filter * -properties *とすれば、すべての属性について取得できるという認識です。ですから追加対応は要らないように思うのですが、実際はぜんぜん取れていないのですか?
コードがエラーで「試してない」ということでしたら、まずは牟田口さんの回答を試されることをお奨めします。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
-
Get-ADUser -filter * -properties *では、値が未設定の属性については取得できないようですが、ExtensionAttributeはきちんと設定されているのでしょうか?
問題の切り分けのため、ADの属性エディタで該当の属性が存在し、値が設定されているか、まず確認してみてください。
あとは、少し検索したら以下のようなページを見つけましたが、関係ありますでしょうか。
ExtensionAttribute 属性に値がない場合のトラブルシューティング方法: Exchange 2007 ヘルプ
- 編集済み 牟田口大介Moderator 2017年5月9日 8:17
-
チャブーンです。
この件ですが、ここはご自身で切り分けられてみてはどうでしょうか?まずGet-ADUser -filter * -properties ExtensionAttribute1,ExtensionAttribute2,~で、ちゃんと属性は表示されますか?
そこで表示がされるのであれば、Get-ADUser -filter * -properties * ,ExtensionAttribute1,ExtensionAttribute2,~とためしに行ってみてどのようか結果になるか、で確認できると思います。
ご希望通りに表示されればそれでよいですし、エラーが出た場合(おそらく以前と同じ内容になると思いますが)、属性が表示されるべきなのに実際は表示されないのはなぜか、という方面での調査が必要になると思います。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
-
チャブーンさん
ありがとうございます。最初のコマンドレットを実行したところ、
"DistinguishedName","Enabled","GivenName","Name","ObjectClass","ObjectGUID","SamAccountName","SID","Surname","UserPrincipalName"
が表示される結果となりました。
エラーは発生しませんでした。繰り返しですが、すべてのユーザー、すべての属性に値をセットしているわけではありませんが、
複数のユーザー、属性に値をセットしております。以上よろしくお願いいたします。
-
すべてのユーザー、すべての属性に値をセットしているわけではない、ということで思い当たることがあります。
Export-Csvコマンドには、最初の1個目のオブジェクトに存在するプロパティ値のみ、CSVに書き出すという仕様があります。よって仮に1個目にADの拡張属性が付与されていないオブジェクトが渡されると、2個目以降に拡張属性が付与されていたとしても、無視されCSVに出力されない、という結果になります。
(他に、Format-Tableコマンド等にも同様の特性があります。)
この問題を回避するのは正直厄介かと思います。おそらく、Select-Objectでワイルドカードを使うのではうまくいきません。チャブーンさんが指摘されたように、何らかの方法で、あらかじめ取得したいプロパティを全部書き出しておく必要があるように思います。
具体的には、
Get-ADUser -Filter * -Properties * | Select-Object DistinguishedName, Enabled, GivenName, …,@{L = "ProxyAddresses"; E = { $_.ProxyAddresses -join ";"}}, ExtensionAttribute1, ExtensionAttribute2, … | Export-Csv …
のように、事前に出力したいすべての属性名を調べておき、Select-Objectに全部指定するのが結局は早いかもしれません。
こうしておけば、たとえGet-ADUserで最初に取得されたユーザーに拡張属性が付与されてなかったとしても、付与されていないものはnullとしてExport-Csvコマンドに渡されるので、ワイルドカードを使ったときのような問題は起こらなくなるはずです。
あるいは、
$properties = "DistinguishedName", "Enabled", "GivenName", …,@{L = "ProxyAddresses"; E = { $_.ProxyAddresses -join ";"}}, "ExtensionAttribute1", "ExtensionAttribute2", …
Get-ADUser -Filter * -Properties * | Select-Object $properties | Export-Csv …のように変数に入れてやってもOKです。