HOWTO · PowerShell
PowerShell を使用してユーザーのすべてのグループメンバーシップを取得する
PowerShell でユーザーの Active Directory グループメンバーシップを一覧表示する 4 つの方法を、それらの前提条件と結果の範囲を含めて比較します。
このページの内容
ユーザーの Active Directory グループメンバーシップを一覧表示するには、従来の net コマンド、ADSI、DirectorySearcher、または Active Directory モジュールから方法を選びます。最初の3つは、そのモジュールをインストールせずに Windows のディレクトリサービスを利用できます。モジュールが使える場合は、コマンドレットが最も直接的な方法です。どの方法でも、ドメインコントローラーへの接続と、ディレクトリの読み取りを許可されたアカウントが必要です。ここでいう「すべて」とは、各クエリが返すメンバーシップを指します。ディレクトリの memberOf 属性と以下の例が示すのは直接のグループリンクであり、入れ子になったグループを含む推移的なメンバーシップ全体ではありません。また、ユーザーのプライマリグループが含まれるとは限りません。
従来の net コマンドでユーザーのグループメンバーシップを取得する
net user /domain を実行すると、ドメインにサインイン中のアカウント情報を問い合わせます。結果には、そのアカウントが属するグローバルドメイングループが含まれます。別のドメインアカウントを調べるには、ユーザー名を指定して net user username /domain を実行します。
これは PowerShell から直接呼び出せる従来のコマンドラインツールであり、PowerShell のエイリアスではありません。出力は表示用に整形されます。構造化オブジェクトが必要な場合や、スクリプトでグループ名を処理する場合は、Active Directory のクエリを使ってください。このコマンドが返すのはドメイン情報であり、ユーザーが所属するローカルコンピューターのグループ情報ではありません。
ADSI でユーザーのグループメンバーシップを取得する
ADSI は、PowerShell の [adsisearcher] 型から利用できる Windows のディレクトリサービスインターフェイスです。このクエリはサインイン中のアカウント名を使い、その memberOf の値を識別名として返します。ドメインに接続した PowerShell セッションで、$searcher = [adsisearcher]"(samAccountName=$($env:USERNAME))"; $result = $searcher.FindOne(); if ($null -ne $result) { $result.Properties.memberof } を実行します。
各値は、組織内のパスを含む LDAP 識別名でグループを表します。フィルターの対象は $env:USERNAME に入っている名前のアカウントです。別のユーザーは指定できません。memberOf が表すのは直接のリンクで、プライマリグループは一覧に含まれません。この方法では別途 PowerShell モジュールを用意する必要はありませんが、ディレクトリへの接続と、アカウントを読み取る権限は必要です。クエリの実行には、環境から Active Directory を解決して検索できることも必要です。この記事にはドメイン環境での実行結果がないため、それと異なる主張はできません。
サンプルの識別名から共通名の部分を表示するには、返された文字列に正規表現を適用します。
$memberOf = @(
"CN=Finance,OU=Groups,DC=example,DC=com",
"CN=Engineering,OU=Groups,DC=example,DC=com"
)
$memberOf -replace '^CN=([^,]+).+$', '$1'
Finance
Engineering
この変換は、与えられた各文字列から LDAP のパスを取り除くもので、ディレクトリへのクエリは実行しません。この正規表現は、共通名にエスケープされたカンマが含まれないことを前提としています。
新しいオブジェクトでユーザーのグループメンバーシップを取得する
DirectorySearcher を使うと、名前を指定したアカウントを別の組み込み方法で検索できます。この例で受け付けるのは、ASCII の sAMAccountName のうち、英字、数字、ピリオド、アンダースコア、ハイフンだけで構成され、最大20文字のものに限られます。LDAP フィルターを作る前に、ほかの入力を拒否します。if ($username -notmatch '^[A-Za-z0-9._-]{1,20}$') { throw 'Use a valid account name.' }。検証したら、$searcher = New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$username))"); $result = $searcher.FindOne(); if ($null -ne $result) { $result.Properties.memberof } を実行します。この文字セットに制限することで、入力値に LDAP フィルター構文を追加できないようにします。ディレクトリでこの例の範囲外のアカウント名を許可している場合は、代わりに LDAP フィルター用のエスケープ処理を使ってください。
返される値はグループ名だけではなく、LDAP 識別名です。user01 は対象アカウントのログオン名に置き換えてください。ADSI の例と同様に、memberOf 属性を読み取るため、入れ子になったメンバーシップは展開されず、プライマリグループも含まれません。ドメインディレクトリへのアクセスが必要ですが、別途モジュールをインストールする必要はありません。
Active Directory モジュールでユーザーのグループメンバーシップを取得する
Active Directory モジュールには、ディレクトリ管理用のコマンドレットが用意されています。このモジュールがコンピューターで利用可能になっている必要があります。Install-Module だけでは、この Windows モジュールはインストールされません。使用中の Windows バージョンに該当する Microsoft の手順に従って RSAT をインストールしてください。この記事では、バージョン固有の RSAT コマンドや互換性は確認できていないため、そのようなコマンドはここでは紹介しません。
Active Directory モジュールをインストールする
該当する RSAT コンポーネントをインストールした後、PowerShell セッションで Import-Module -Name ActiveDirectory を実行してモジュールを読み込みます。
モジュールが利用できない場合、インポートコマンドで読み込むことはできません。インストール手順は Windows のリリースによって異なるため、別のバージョン向けのコマンドを流用せず、そのリリースに対応する Microsoft の最新の RSAT 手順を確認してください。
Get-ADPrincipalGroupMembership コマンドレットを使う
ユーザーのアカウント名を Get-ADPrincipalGroupMembership に渡し、グループ名だけを簡潔に表示するには、Get-ADPrincipalGroupMembership -Identity "user01" | Select-Object -ExpandProperty Name を実行します。
user01 は対象のユーザー ID に置き換えてください。このコマンドレットは、そのユーザーに関連付けられたグループのオブジェクトを返します。Name を選択すると、LDAP 識別名ではなくグループ名が表示されます。このコマンドには、Active Directory モジュール、適切なディレクトリ接続、および読み取り権限が必要です。Windows ドメイン環境でこれらの例を実行した証拠はないため、ドメインに依存する出力や動作をテスト済みとはしていません。