Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellでActive Directoryグループを管理する方法|作成・メンバー追加・削除・一覧出力のコマンド徹底解説

Active Directoryユーザーとコンピューター(ADUC)のグラフィカルスナップインは、Active Directoryのセキュリティグループを管理する唯一のツールではありません。シンプルなPowerShellコマンドを使えば、ドメイン内のユーザーグループを日々効率的に管理できます。本記事では、PowerShellを使用してADに新しいグループを作成する方法、グループへのユーザーの追加・削除、グループメンバーの一覧表示やCSVエクスポートなど、ADグループ管理でよく使われる便利なコマンドを詳しく解説します。

前提条件:Active Directoryモジュールの準備

ADグループを管理するには、Windows PowerShell用Active Directoryモジュールを使用します。RSAT-AD-PowerShellモジュールはすべてのバージョンのWindows Server(Windows Server 2008 R2以降)に搭載されており、Windows 10およびWindows 11のデスクトップ環境ではRSAT機能としてインストールできます。

まず、現在のPowerShellセッションにADモジュールが読み込まれているか確認しましょう。

Get-Module -Listavailable

ActiveDirectoryモジュールが一覧に表示されていれば準備完了です。表示されない場合は、以下のコマンドでインポートします。

Import-Module ActiveDirectory

次に、ADグループ管理に使用できるPowerShellコマンドレットを一覧表示してみましょう。

Get-Command -Module ActiveDirectory -Name "*Group*"

利用可能なコマンドレットは以下の11個です。

  • Add-ADGroupMember
  • Add-ADPrincipalGroupMembership
  • Get-ADAccountAuthorizationGroup
  • Get-ADGroup
  • Get-ADGroupMember
  • Get-ADPrincipalGroupMembership
  • New-ADGroup
  • Remove-ADGroup
  • Remove-ADGroupMember
  • Remove-ADPrincipalGroupMembership
  • Set-ADGroup

New-ADGroup:新しいADグループを作成する

New-ADGroupコマンドを使用すると、指定したActive Directoryコンテナ(OU)に新しいセキュリティグループを作成できます。

New-ADGroup "TestADGroup" -path 'OU=Groups,OU=NY,OU=US,DC=corp,dc=woshub,DC=com' -GroupScope Global -PassThru –Verbose

Description属性やDisplayName属性を使えば、グループの説明や表示名も指定できます。

GroupScopeパラメータでは、以下のいずれかのグループ種別を設定できます。

  • 0 = DomainLocal(ドメインローカル)
  • 1 = Global(グローバル)
  • 2 = Universal(ユニバーサル)

メール配布用の配布グループを作成する場合は、次のようにコマンドを実行します。

New-ADGroup "TestADGroup-Distr" -path 'OU=Groups,OU=NY,OU=US,DC=corp,dc=woshub,DC=com' -GroupCategory Distribution -GroupScope Global -PassThru –Verbose

なお、配布グループはメール送信やADアクセス権限の付与に利用できます。Exchangeの配布グループについて詳しくは、関連記事をご参照ください。

グループ作成時には任意の属性値を設定することも可能です。複数の属性をまとめて指定するには、ハッシュテーブルを使うのが最も簡単です。

$attrs = @{"mail"="mundmins@woshub.com";"displayname"="ALL Munich Admins"}
New-ADGroup -Name MUNAdmins -GroupScope Global -OtherAttributes $attrs

Add-AdGroupMember:ADグループにユーザーを追加する

Add-AdGroupMemberコマンドレットを使うと、Active Directoryグループにユーザーを追加できます。新しく作成したグループに2人のユーザーを追加してみましょう。

Add-AdGroupMember -Identity TestADGroup -Members user1, user2

多数のユーザーを一度にグループへ追加したい場合は、ユーザー名のリストをCSVファイルに保存し、そのファイルをPowerShellに取り込んで各ユーザーを順次追加するスクリプトが便利です。

CSVファイルの形式は以下のとおりです(列見出しをusersとし、1行に1ユーザーずつ記載します)。

Import-CSV .\users.csv -Header users | ForEach-Object {Add-AdGroupMember -Identity ‘TestADGroup’ -members $_.users}

あるグループ(GroupX)の全メンバーを別のグループ(GroupY)に追加したい場合は、次のコマンドを使用します。

Get-ADGroupMember “GroupX” | Get-ADUser | ForEach-Object {Add-ADGroupMember -Identity “Group-Y” -Members $_}

ネストされたグループのメンバーも含めて(再帰的に)新しいグループへコピーしたい場合は、このコマンドを実行します。

Get-ADGroupMember -Identity “GroupX” -Recursive | Get-ADUser | ForEach-Object {Add-ADGroupMember -Identity “GroupY” -Members $_}

また、Windows Server 2016以降のフォレストスキーマでは、期限付き(時間ベース)のグループメンバーシップ機能が利用できます。例えば、ユーザーを一時的に1時間だけADグループに追加するには、次のコマンドを実行します。

$ttl = New-TimeSpan -Minutes 60
Add-ADGroupMember -Identity "Domain Admins" -Members j.lennon -MemberTimeToLive $ttl

1時間後、このユーザーはセキュリティグループから自動的に削除されます。特権グループへの一時的な権限付与に非常に便利な機能です。

Remove-ADGroupMember:ADグループからユーザーを削除する

ADグループからユーザーを削除するには、Remove-ADGroupMemberコマンドレットを使用します。グループから2人のユーザーを削除する例を見てみましょう。

Remove-ADGroupMember -Identity TestADGroup -Members user1, user2

実行すると削除の確認を求められるので、「Y」で確定します。

CSVファイルのユーザーリストに基づいて一括削除したい場合は、次のコマンドを使用します。

Import-CSV .\users.csv -Header users | ForEach-Object {Remove-ADGroupMember -Identity ‘TestADGroup’ -members $_.users}

オンプレミスのActive Directoryでは、Azure ADのような動的ユーザーグループは利用できません。しかし、Add-ADGroupMemberRemove-ADGroupMemberコマンドレットを使ったPowerShellスクリプトをタスクスケジューラで定期実行すれば、ユーザーの自動追加・削除を実現できます。動的グループの作成方法については、関連記事で詳しく解説しています。

Get-ADGroup:ADグループ情報を検索・取得する

Get-ADGroupコマンドレットを使うと、ADドメイングループの情報を取得できます。

Get-ADGroup 'TestADGroup'

このコマンドは、DN、グループタイプ、名前、SIDといった主要な属性を表示します。すべての属性値を表示するには、次のコマンドを実行します。

Get-ADGroup 'TestADGroup' -properties *

これにより、グループの作成日時・変更日時、説明などの属性も確認できるようになります。

Get-ADGroupはパターン検索にも活用できます。例えば、名前にadminsという文字列を含むすべてのADグループを検索するには、次のコマンドを使用します。

Get-ADGroup -LDAPFilter “(name=*admins*)” | Format-Table

または、Filterパラメータを使って以下のように書くこともできます。

Get-ADGroup -Filter {name -like "*admins*"} -Properties Description,info | Select Name,samaccountname,Description,info

さらに、Get-ADGroupを使えばmembers属性からグループメンバーの一覧を取得できます。

Get-ADGroup -Identity "Domain Admins" -Properties members | Select-Object -ExpandProperty members

ただし、グループメンバーシップの取得には、後述のGet-ADGroupMemberコマンドレットを使う方がはるかに便利です。

Get-ADGroupMember:グループメンバーを取得してCSVエクスポートする

Get-ADGroupMemberコマンドレットを使うと、ADグループのメンバーを取得できます。取得対象はユーザーだけでなく、コンピューター、他のグループ、管理されたサービスアカウント(MSA/gMSA)なども含まれます。

Get-ADGroupMember 'TestADGroup'

結果をユーザー名だけに絞り込んで表示するには、次のコマンドを実行します。

Get-ADGroupMember 'TestADGroup'| ft name

グループ内に他のドメイングループが含まれている場合、Recursiveパラメータを付けると、ネストされたグループも含む完全なメンバーリストを表示できます。

Get-ADGroupMember ADadmins -recursive| ft name

特定のグループのメンバーアカウント一覧をCSVファイルにエクスポートする(Excelで利用するなど)には、次のコマンドを実行します。

Get-ADGroupMember 'ADadmins' -recursive| ft samaccountname| Out-File c:\PS\ADadminsList.csv

ユーザーの拡張属性を取得するには、Get-ADUserコマンドレットを組み合わせます。例えば、アカウント名に加えてUserPrincipalName、役職、電話番号などを表示できます。

Get-ADGroupMember -Identity ADadmins -recursive| foreach { Get-ADUser $_ -properties title, OfficePhone|Select-Object title, OfficePhone }

グループ内のユーザー数をカウントすることも簡単です。

(Get-ADGroupMember -Identity 'domain admins').Count

特定のOU内の空のグループ(メンバーが存在しないグループ)を抽出するには、次のコマンドを使用します。

Get-ADGroup -Filter * -Properties Members -searchbase “OU=NY,OU-US,DC=corp,dc=woshub,DC=com”  | where {-not $_.members} | select Name

また、Get-ADGroupMemberコマンドレットを応用すれば、特定のADグループに新しいユーザーが追加されたときに管理者へ通知するシンプルなPowerShellスクリプトを作成することも可能です。

Set-ADGroup:グループ属性を変更する

Set-ADGroupコマンドレットを使うと、任意のActive Directoryグループのプロパティ(属性)を変更できます。例えば、グループの説明を変更するには次のように実行します。

Set-ADGroup -Identity MunAdmins -Description “Munich Admins Group”

パイプラインを使って次のようにも書けます。

Get-ADGroup -Identity MunAdmins | Set-ADGroup -Description “Munich Admins Group”

ExchangeのGAL(グローバルアドレス帳)から特定のグループを非表示にすることもできます。

Set-ADGroup –id MunAdmins -replace @{hideDLMembership=$true}

複数の属性を一度に変更する場合は、ハッシュテーブルで変更内容を指定すると便利です。

$attrs = @{"mail"="munadmins@woshub.com";"displayname"="ALL MUN Admins"}
Set-ADGroup -Identity MunAdmins –Add $attrs

ADグループの属性一覧は、get-adgroup munadmins -Properties *コマンド、またはADUCコンソールの「属性エディター」タブから確認できます。

Remove-ADGroup:ADグループを削除する

Active Directoryからグループを削除するには、Remove-ADGroupコマンドレットを使用します。

Remove-ADGroup -Identity MunSales

グループ削除時には確認を求められます。確認を省略したい場合は、Confirmスイッチを追加してください。

Remove-ADGroup -Identity MunSales –Confirm:$false

なお、誤って削除したグループ(およびその他のADオブジェクト)は、Active Directoryごみ箱から復元できます。

Get-ADObject -Filter {Deleted -eq $True -and ObjectClass -eq 'group' -and Name -like '*MunSales*' } –IncludeDeletedObjects| Restore-ADObject –verbose
  1. RSATをインストールせずにPowerShellのActive Directoryモジュールを展開する方法

    はじめに以前の記事では、Set-ADComputerコマンドレットをGPOのログオンスクリプトで使用し、現在ログオンしているユーザーの情報を各ADコンピューターオブジェクトのプロパティに保存する方法をご紹介しました。これに対して読者から、「この方法を実行するには、すべてのユーザーコンピューターにRSAT(リモートサーバー管理ツール)とActive Directory用Windows PowerShellモジュールをインストールする必要があり、非常に手間がかかる」という妥当な指摘がありました。そこで本記事では、ユーザーコンピューターにRSATをインストールすることなく、PowerShellのAc

  2. PowerShellでExcelファイルのデータを読み書きする方法|COMオブジェクトを使った自動化入門

    本記事では、PowerShellスクリプトから直接Excelワークシートのデータを読み書きする方法を解説します。PowerShellとExcelを組み合わせることで、コンピューターやサーバー、インフラ、Active Directory(AD)などのインベントリ調査や各種レポート作成を自動化できます。前提知識:COMオブジェクトとExcelオブジェクトモデルPowerShellからExcelシートにアクセスするには、COM(Component Object Model)オブジェクトを使用します。この方法では、対象のコンピューターにExcelがインストールされている必要がある点に注意してください。