いろんなサーバー設定研究所

インフラエンジニアに役立つ各種設定やTipsを提供します Windows Server、Linux など

*

入れ子構成のADグループに所属するユーザーをすべて出力する

      2017/02/28

題名だけだと、なんのこっちゃですが…

Active Directoryの運用をしていると、頻繁に使うグループの入れ子構成。

学校を例にすると…


「全校生徒グループ」には

「1年生グループ」「2年生グループ」「3年生グループ」がメンバーとして所属していて、さらに各学年には

「クラス1グループ」「クラス2グループ」…と各クラスのグループが存在し、各クラスのグループにユーザーオブジェクトが所属する。

これが入れ子構成ですね。

ロジカルに収まっていればわかりやすくて気持ちのいい構成なのですが、会社においては組織変更、プロジェクト担当部署の変更…などなど外的要因によってきれいに収まらない事があります。

結果「このグループには、結局誰が含まれているのか?」っていうのを知りたいときに、グループのプロパティからチクチク確認するのは難しいですよね。

Powershell を使うにしても「 Get-ADGroupMember」は、グループに直接所属するメンバしか出力してくれないです。

で、作ってみましたスクリプト。


function get-groupmember-flat {
  $a =  $args[0]
  $members = Get-ADGroupMember -Identity $args[0]
  foreach ($member in $members){
    # グループに所属するメンバーが"ユーザー"の場合出力用配列に格納
    if ($member.objectClass -match 'user'){
        $member
    }else{
    # グループに所属するメンバーが"グループ"の場合関数を再起呼び出し
        get-groupmember-flat($member)
    }
  }
}

# Main Start
$group = 'group01'
get-groupmember-flat($group)

エラー処理は考慮していません。

$group に 展開したいグループ名を定義しますが、ここら辺はよきにしてください。

ポイントは11行目。

ObjectClassがユーザーの場合は出力用配列$all_userに突っ込みますが、グループの場合は再起的に自分自身を呼び出します。

これが繰り返されて、最終的にすべてのユーザーが出力されるというわけです。

出力結果はこんな感じ。

# 一部マスクしてます。

不明点はお問い合わせフォーム「About This Blog」までー

 - Power Shell