none
PowerShell での ActiveDirectory 情報取得について RRS feed

  • 質問

  • お世話になります。

    タイトルの通り、AD の情報で取得したい属性があるのですが、うまくいきません。

    取得したい属性としては、

    ・通常の Get-ADUser で取得できる属性
    ・ProxyAddresses の属性すべて
    ・Exchange スキーマ拡張した ExtensionAttribute すべて

    となります。

    どなたかご存じの方、ご教授をお願いいたします。


    2017年5月8日 2:16

すべての返信

  • チャブーンです。

    Get-ADUserコマンドレットで特定の属性を取りたい場合、-properties <属性名>オプションをつけるといいでしょう。全部の属性が取りたいなら -properties * (ワイルドカード)で問題ないはずです。

    「うまくいかない」が何をさしているかわからないのですが、たとえばproxyAddresses属性はコレクションですので、値は配列型になります。個々の値がとりたい場合、foreach等でループさせて値を取得する必要があります。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    • 回答の候補に設定 LapivyMVP 2017年5月8日 6:57
    2017年5月8日 2:34
  • チャブーンさん

    ありがとうございます。

    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 を記述することはおそらく大丈夫かと思います。

    以上よろしくお願いいたします。

    2017年5月8日 7:30
  • エラーメッセージの通り、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

    2017年5月8日 8:50
    モデレータ
  • チャブーンです。

    エラーの件ですが、

    Select-Object : The property cannot be processed because the property "ProxyAddresses" already exists.At line:1 char:69

    下線にあるとおり、select * ですべてのプロパティを選択しているのに、さらに"ProxyAddresses"プロパティを選択したため「(存在するプロパティを選ぼうとして)カブっていますよ」と怒られているのです。

    端的にいうと、出力したいプロパティを明示的に選んで、それを書くようにするのが一番簡単です。全部書き出したい場合は、オブジェクトのpropertynamesプロパティからプロパティ名を表示させ、それを連列させた文字列をInvoke-Expressionコマンドで実行する、といった工夫が要ります。この中でProxyAddressesだけを別の文字列に差し替えるといった風になると思います。

    追記:牟田口さんから答えが出ていますので、そちらを参考にしてください。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年5月8日 9:18
  • 牟田口さん

    ありがとうございます。
    後ほど試させていただきたいと思います。

    以上よろしくお願いいたします。


    2017年5月9日 1:35
  • チャブーンさん

    ありがとうございます。

    もう一点の Exchange スキーマ拡張した際に追加される属性、
    ExtensionAttribute については取得可能でしょうか?

    以上よろしくお願いいたします。
    2017年5月9日 1:36
  • チャブーンです。

    Get-ADUser -filter * -properties *とすれば、すべての属性について取得できるという認識です。ですから追加対応は要らないように思うのですが、実際はぜんぜん取れていないのですか?

    コードがエラーで「試してない」ということでしたら、まずは牟田口さんの回答を試されることをお奨めします。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年5月9日 2:31
  • チャブーンさん

    ありがとうございます。

    ProxyAddresses は複数取得できたのですが、ExtensionAttribute は取得できていませんでした。

    これらは取得できないのでしょうか?

    以上よろしくお願いいたします。

    2017年5月9日 4:58
  • Get-ADUser -filter * -properties *では、値が未設定の属性については取得できないようですが、ExtensionAttributeはきちんと設定されているのでしょうか?

    問題の切り分けのため、ADの属性エディタで該当の属性が存在し、値が設定されているか、まず確認してみてください。

    あとは、少し検索したら以下のようなページを見つけましたが、関係ありますでしょうか。

    ExtensionAttribute 属性に値がない場合のトラブルシューティング方法: Exchange 2007 ヘルプ


    2017年5月9日 8:16
    モデレータ
  • 牟田口さん
    ありがとうございます。

    すべての属性ではないですが、値はセットしております。

    検索いただいたページも影響はなさそうです。

    コマンドレットでは取得できないのでしょうか?

    以上よろしくお願いいたします。

    2017年5月10日 4:07
  • Get-ADUser -Filter * -Properties * | Select-Object *, @{L = "ProxyAddresses"; E = { $_.ProxyAddresses -join ";"}} -ExcludeProperty ProxyAddresses 

    として、CSVファイルではなく画面に直接出力した場合にはどうでしょうか?

    2017年5月10日 4:29
    モデレータ
  • チャブーンです。

    この件ですが、ここはご自身で切り分けられてみてはどうでしょうか?まずGet-ADUser -filter * -properties ExtensionAttribute1,ExtensionAttribute2,~で、ちゃんと属性は表示されますか?

    そこで表示がされるのであれば、Get-ADUser -filter * -properties * ,ExtensionAttribute1,ExtensionAttribute2,~とためしに行ってみてどのようか結果になるか、で確認できると思います。

    ご希望通りに表示されればそれでよいですし、エラーが出た場合(おそらく以前と同じ内容になると思いますが)、属性が表示されるべきなのに実際は表示されないのはなぜか、という方面での調査が必要になると思います。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年5月10日 4:30
  • チャブーンさん
    ありがとうございます。

    最初のコマンドレットを実行したところ、

    "DistinguishedName","Enabled","GivenName","Name","ObjectClass","ObjectGUID","SamAccountName","SID","Surname","UserPrincipalName"

    が表示される結果となりました。
    エラーは発生しませんでした。

    繰り返しですが、すべてのユーザー、すべての属性に値をセットしているわけではありませんが、
    複数のユーザー、属性に値をセットしております。

    以上よろしくお願いいたします。

    2017年5月10日 6:39
  • 牟田口さん

    ありがとうございます。

    proxyAddresses はきちんと取得されておりました。

    ご教示ありがとうございました。

    以上よろしくお願いいたします。

    2017年5月10日 6:43
  • すべてのユーザー、すべての属性に値をセットしているわけではない、ということで思い当たることがあります。

    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です。

    2017年5月10日 11:41
    モデレータ