PowerShell を使用してユーザーのすべてのグループメンバーシップを取得する

Marion Paul Kenneth Mendoza 2023年1月30日
  1. net レガシーコマンドを使用してユーザーのグループメンバーシップを取得する
  2. ADSI でユーザーのグループメンバーシップを取得する
  3. 新しいオブジェクトでユーザーのグループメンバーシップを取得する
  4. Active Directory モジュールを使用してユーザーのグループメンバーシップを取得する
PowerShell を使用してユーザーのすべてのグループメンバーシップを取得する

Windows PowerShell では、特定のユーザーのグループメンバーシップのリストを取得する方法はたくさんあります。レガシーコマンド、ネイティブコマンド、または拡張機能を使用して、PowerShell のスクリプト環境内で実行できます。

この記事では、これらすべてのメソッドを 1つずつ説明し、それらの長所と短所、およびそれらが正しく実行される方法について説明します。

次のコマンドは、コンピューターまたはサーバーがドメインに参加している場合にのみ正しく実行されます。デフォルトの WORKGROUP ドメインを使用すると、例外エラーが発生します。

net レガシーコマンドを使用してユーザーのグループメンバーシップを取得する

オペレーティングシステムのごく初期の段階から存在していたレガシーコマンドから始めることができます。これを net コマンドと呼びます。net コマンドは通常、コマンドプロンプトで実行され、エイリアスを介して Windows PowerShell で機能します。

net コマンドは通常、ローカルコンピューターを管理するために使用されます。それでも、コマンドを使用して、以下の構文を使用することにより、この特定の目的のために特定のユーザーのメンバーシップを取得できます。

net user /domain username

このメソッドを使用すると、グローバルドメイングループだけでなく、ユーザーのローカルグループも返されます。

このコマンドの欠点の 1つは、新しい Windows PowerShell コマンドレットよりも柔軟性が低いことです。また、長いグループ名(約 21 文字)はコマンドラインに切り捨てられるため、エクスポート時に正しく表示されません。

ADSI でユーザーのグループメンバーシップを取得する

Microsoft によると、ADSI または Active Directory サービスインターフェイスは、ディレクトリサービスにアクセスするために使用される組み込みの COM インターフェイスです。ADSI ライブラリ内には、現在のユーザーのグループメンバーシップをクエリするために Windows PowerShell で実行できる [ADSISearcher] クラスがあります。

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof

これを改善するには、正規表現を追加して、不要な LDAP 文字 CN="groupname"を削除します。これにより、ユーザーのグループ名のみが返されます。

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'

この方法は、マシンに組み込まれているため、実行するためにモジュールをインストールする必要はありません。必要な唯一の要件は、ドメインに参加しているマシンです。上記の構文を実行すると、エラー例外がスローされます。

この構文の唯一の欠点は、クエリが現在ログインしているユーザーでのみ機能することです。これは、ログイン時に構文を実行している間は、別のユーザーをターゲットにできないことを意味します。

新しいオブジェクトでユーザーのグループメンバーシップを取得する

ユーザーのグループメンバーシップを取得する別の方法は、ディレクトリサービスを使用して新しいオブジェクトを作成することです。この方法では、これを機能させるために別のモジュールをインストールする必要もありません。

また、このメソッドは、ネットワーク内で現在参加しているドメインコントローラーにクエリを実行するため、ドメイン内の特定のユーザーをターゲットにすることができます。

(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:USERNAME)))")).FindOne().GetDirectoryEntry().memberOf

ログインしたユーザーにクエリを実行したくない場合は、$env:USERNAME をターゲットユーザーの正確なユーザー名に置き換えることができます。

$username = "user01"
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($username)))")).FindOne().GetDirectoryEntry().memberOf

この方法では、前の方法と同様に、不要な LDAP 文字を出力し、組織単位(OU)の検索ベース全体を出力します。

Active Directory モジュールを使用してユーザーのグループメンバーシップを取得する

これは、この最後の方法でユーザーのグループメンバーシップを取得するための最も簡単で最短の方法の 1つと見なすことができます。この方法の唯一の条件は、Active Directory モジュールをインストールして、AD コマンドレットをスクリプト環境にインポートすることです。

ActiveDirectory モジュールのインストール

通常、コマンドレットを実行すると、Install-Module がリモート CDN からパッケージをフェッチし、コンピューターにインストールする必要があります。それでも、Active Directory モジュールでは、成功するために前提条件のパッケージをインストールする必要があります。この前提条件のパッケージは、リモートサーバー管理ツールまたは RSAT と呼ばれるものです。

コンピューターまたはサーバーに RSAT をインストールするには、以下の PowerShell スクリプトを実行できます。

RSAT for Windows 10 のインストール:

Add-WindowsCapability -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 -Online

RSAT for Windows Server のインストール(2008 年から 2016 年までの複数のバージョン):

Install-WindowsFeature -Name "RSAT-AD-PowerShell" -IncludeAllSubFeature

マシンに RSAT 機能をインストールすると、Windows PowerShell 用の Active Directory モジュールもインストールされます。

Get-ADPrincipalGroupMembership コマンドレットの使用

Active Directory モジュールがインストールされると、次の構文で Active Directory モジュールをインポートできるようになります。

Import-Module -Name ActiveDirectory

Active Directory モジュールがインポートされると、AD コマンドレットを実行できるようになります。これらの特定の拡張コマンドレットを使用して、ユーザーのグループメンバーシップのリストを取得します。

ユーザーのグループメンバーシップを取得するには、コマンドレット Get-ADPrincipalGroupMembership を使用します。このコマンドレットは、ユーザー、コンピューター、グループ、またはサービスアカウントのすべての AD グループを返します。さらに、ユーザーとグループオブジェクトをターゲットにできるため、このコマンドレットはネストされたグループメンバーシップも返します。

以下の構文を実行して、ユーザーのグループメンバーシップを取得します。Active Directory モジュールがインポートされていることを確認してください。

Get-ADPrincipalGroupMembership username | select name

name プロパティをパイピングすると、すべてのユーザーグループメンバーシップが出力されます。

出力:

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn