none
ADGroupとADGroupメンバーの一覧 RRS feed

  • 質問

  • 「Get-ADGroup」および「Get-ADGroupMember」コマンドレットを利用して、Active Direcotryのグループ一覧(メンバーリスト含め)を作成したいと考えています。

    単純にGet-ADGroupからパイプでGet-ADGroupMemberに渡すと、メンバー一覧は抽出できますが、どのグループに所属しているかがわからなくなってしまいます。

    目的のADグループ一覧(メンバーリスト含む)を抽出する方法をご教示頂けると幸いです。

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

    2016年5月30日 10:30

回答

  • > メンバーが多い場合、「...」で省略されてしまうグループがかなりあります。こちらを省略せずに出力することは可能でしょうか?

    やり方は色々あると思いますが、例えば以下のような感じでしょうか。

    Get-ADGroup -Filter *| 
        select Name, @{Label = "MemberNames"; Expression = {($_| Get-ADGroupMember| select -ExpandProperty Name) -join ","}}|
        Format-List

    上記の例ではグループ名とメンバー名以外のプロパティの出力は省略しています。必要であれば、select Name, @{...となってるところを select *, @{...として下さい。

    なおファイルに出力するときはFormat-ListではなくExport-Csv等を使います。

    Get-AdGroup -Properties Membersでもメンバー一覧は取れますが、識別名の文字列配列として返ってくるので、Name等他のプロパティを取るのにどのみち他のコマンドレットが必要になるので、上記のようにGet-ADGroupMember併用で良いかと思います。

    (やきさんがご指摘のMemberOfプロパティは、グループが属するグループ名を取るものかと思います)

    >■出力例1

    >■出力例2

    一例として以下のようなスクリプトを挙げます。

    # 出力例1
    Get-ADGroup -Filter *| 
        foreach{
            Write-Host $_.Name
            $_| Get-ADGroupMember| foreach {Write-Host $_.Name}
            Write-Host 
       }
    
    # 出力例2
    Get-ADGroup -Filter *| 
        foreach{
            $group = $_.Name
            $_| Get-ADGroupMember| foreach {Write-Host "$group,$($_.Name)"}
       }

    上記スクリプトでは表示にWrite-Hostコマンドレットを使っていますが、文字列として変数に入れたり、パイプラインを通じてSet-Contentコマンドレット等でファイルに書き出す場合は、Write-Outputコマンドレットに変えてください。

    この辺りになると、ちょっとPowerShellのきまりや構文の知識が必要になってくるかもしれません。

    • 回答としてマーク kick. _ 2016年6月2日 9:14
    2016年5月31日 6:42
    モデレータ

すべての返信

  • こういう感じでしょうか?

    Get-ADGroup -Filter * |select *, @{Label = "Members"; Expression = {$_| Get-ADGroupMember |select -expand Name}}

    ADGroupオブジェクトに、そのグループに属するメンバー名の配列を格納した、Membersという名前のプロパティを作って追加した形になります。

    # それとも、グループと、当該グループに属するメンバーリストをフラットな形で出力したいということでしょうか?

    2016年5月30日 11:56
    モデレータ
  • Get-ADGroup に -Properties Memberof を付与すると、そのグループがどのグループに属しているかのプロパティーを一緒に取ることができます。

    2016年5月30日 12:27
  • 牟田口さん
    ご回答ありがとうございます。

    配列への追加がまさにやりたかったことです。
    記載頂いたコマンド実行により、取得したい結果が返ってきますが、1点教えて頂けますか?

    • メンバーが多い場合、「...」で省略されてしまうグループがかなりあります。こちらを省略せずに出力することは可能でしょうか?


    ># それとも、グループと、当該グループに属するメンバーリストをフラットな形で出力したいということでしょうか?
    また上記についても後学のため併せて教えて頂けないでしょうか?
    以下のような出力形式も行いたいと考えています。

    ■出力例1
    GroupA
    User1
    User2
    User3

    GroupB
    User4

    GroupC
    User5
    User6

    ■出力例2
    GroupA,User1
    GroupA,User2
    GroupA,User3
    GroupB,User4
    GroupC,User5
    GroupC,User6

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

    2016年5月31日 4:06
  • やきさん
    ご回答ありがとうございます。

    Get-ADGroupでもオプションをつけることでメンバーを取得できることを知れました。
    LDAP形式なので、名前などでの一覧化には多少編集が必要ではありますが勉強になりました。

    2016年5月31日 4:08
  • > メンバーが多い場合、「...」で省略されてしまうグループがかなりあります。こちらを省略せずに出力することは可能でしょうか?

    やり方は色々あると思いますが、例えば以下のような感じでしょうか。

    Get-ADGroup -Filter *| 
        select Name, @{Label = "MemberNames"; Expression = {($_| Get-ADGroupMember| select -ExpandProperty Name) -join ","}}|
        Format-List

    上記の例ではグループ名とメンバー名以外のプロパティの出力は省略しています。必要であれば、select Name, @{...となってるところを select *, @{...として下さい。

    なおファイルに出力するときはFormat-ListではなくExport-Csv等を使います。

    Get-AdGroup -Properties Membersでもメンバー一覧は取れますが、識別名の文字列配列として返ってくるので、Name等他のプロパティを取るのにどのみち他のコマンドレットが必要になるので、上記のようにGet-ADGroupMember併用で良いかと思います。

    (やきさんがご指摘のMemberOfプロパティは、グループが属するグループ名を取るものかと思います)

    >■出力例1

    >■出力例2

    一例として以下のようなスクリプトを挙げます。

    # 出力例1
    Get-ADGroup -Filter *| 
        foreach{
            Write-Host $_.Name
            $_| Get-ADGroupMember| foreach {Write-Host $_.Name}
            Write-Host 
       }
    
    # 出力例2
    Get-ADGroup -Filter *| 
        foreach{
            $group = $_.Name
            $_| Get-ADGroupMember| foreach {Write-Host "$group,$($_.Name)"}
       }

    上記スクリプトでは表示にWrite-Hostコマンドレットを使っていますが、文字列として変数に入れたり、パイプラインを通じてSet-Contentコマンドレット等でファイルに書き出す場合は、Write-Outputコマンドレットに変えてください。

    この辺りになると、ちょっとPowerShellのきまりや構文の知識が必要になってくるかもしれません。

    • 回答としてマーク kick. _ 2016年6月2日 9:14
    2016年5月31日 6:42
    モデレータ
  • 出力例2 ですが一例としてこんな感じでは如何でしょうか?

    $results = @()
    
    $results += "グループ名称,グループ説明,アカウント,名前,アカウント説明"
    
    # グループ一覧を取得
    $group_results = Get-ADGroup -Filter * -SearchBase "OU=XXXX,dc=YYYY,dc=local" -Property Description | select Name, Description | sort-object -property Name
    foreach($group_result in $group_results){
      # 所属ユーザ一覧を取得
      $user_results = Get-ADGroupMember -Identity $group_result.Name  | select Name, objectClass | sort-object -property Name
      foreach($user_result in $user_results){
        if($user_result.objectClass -like "*user*"){
            # ユーザ情報を取得
            $username = Get-ADUser -Identity $user_result.Name -Property DisplayName, Description | select Name, DisplayName, Description | sort-object -property Description, Name
            $results += $group_result.Name + "," + $group_result.Description + "," + $user_result.Name + "," + $username.DisplayName + $username.Description
        }else{
            $results += $group_result.Name + "," + $group_result.Description + "," + $user_result.Name + ",[グループ]," 
        }
      }
    }
    
    # 結果をファイルに出力
    $outputFileName = ".ADGroupUserList" + (Get-Date).ToString("yyyyMMddHHmmss") + ".csv"
    $results | Out-File -FilePath $outputFileName -Encoding utf8
    

    2016年5月31日 9:18
  • $groups = Get-ADGroup "hoge" -Properties memberof

    とした場合、DNからグループ名だけ欲しい場合は

    $memberof -replace "^CN=([^,]*),.*","`$1"

    です。

    ただ出力例を見るとグループが属しているグループというより、誰がグループに属しているかを知りたいようですので

    Get-ADGroup "hoge" -Properties Members

    とすることで取れます。

    その他であれば

    Get-ADGroup "hoge" -Properties * 

    を確認し、お好みの属性を参照ください。
    2016年5月31日 9:30
  • 牟田口さん
    早々にご回答ありがとうございます。

    出力例1,2ともに理想通りの出力結果となりました。
    知識が足りずに質問ばかりしてしまってすみません。
    トレースさせてもらって理解もできたつもりです。$($_.Name)のところ以外。。

    PowerShellのきまりや構文についてこれから勉強していきたいと思います。

    2016年6月1日 10:43
  • acr50wさん
    ご回答ありがとうございます。

    コマンドをすべて追えていませんが、グループやアカウントの説明の項目の抽出や、
    ファイル出力の部分で役立てさせて頂きたいと思います。

    2016年6月1日 10:46
  • >$($_.Name)のところ以外。。

    Write-Host "$group,$($_.Name)"

    は、文字列リテラル(""で囲った部分)の中に、部分式($()の部分)を埋め込んだ形式になります。

    部分式演算子$()とは、括弧の中身を式として評価して、得られた値を返すものです。

    Write-Host ($group + "," + $_.Name)

    と同じ結果になります。

    2016年6月1日 12:54
    モデレータ
  • やきさん
    ご回答ありがとうございます。

    Get-ADGroup の属性についての情報ありがとうございます。-Properties * で内容確認してみます。
    置換時の正規表現の部分についても勉強したいと思います。

    2016年6月2日 0:54
  • 牟田口さん
    重ね重ねご回答ありがとうございます。
    部分式演算子$()もおかげさまで理解できました!

    2016年6月2日 9:14