PowerShell を使用してユーザーのすべてのグループメンバーシップを取得する
-
net
レガシーコマンドを使用してユーザーのグループメンバーシップを取得する - ADSI でユーザーのグループメンバーシップを取得する
- 新しいオブジェクトでユーザーのグループメンバーシップを取得する
- Active Directory モジュールを使用してユーザーのグループメンバーシップを取得する
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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn