PowerShell を使用して Active Directory に動的グループを作成する方法

Active Directoryドメインでのアクセス権限管理は、特にユーザー属性に基づいて自動的に更新されるグループが必要な場合は、少々面倒な作業になることがあります。そこで便利なのが動的セキュリティグループです。動的セキュリティグループは、部署、場所、役職など、特定の条件に一致するユーザーを抽出して自動的にグループを作成します。しかし、オンプレミスのADはAzure ADのように、真の動的グループを標準でサポートしていないという問題があります。グループを作成しても魔法のように自動的に更新されるわけではないので、少しイライラします。そのため、スクリプトやサードパーティ製のツールを使って、状況を適切に管理する必要があります。

幸いなことに、この記事ではPowerShellを使って動的グループを模倣する方法を詳しく説明しています。それほど洗練された方法ではありませんが、正しく設定すれば問題なく動作します。基本的には、定期的に実行され、ユーザーのプロパティをチェックし、それに応じてグループメンバーシップを更新するスクリプトを作成します。ドメインコントローラーまたはADモジュールがインストールされている任意のマシンでスクリプトをスケジュール設定し、完全なドメイン管理者権限を与えたくない場合は、委任権限を持つ非管理者ユーザーとして実行するように設定できます。その後、手動で編集することなく、グループは自動的に条件(特定のOUに属し、部署フィールドに「営業」を含むすべてのユーザーなど)と同期されます。

PowerShell を使用して Active Directory に動的セキュリティ グループを作成する方法

方法1: PowerShellスクリプトを使用してグループメンバーシップを自動化する

このアプローチは一種の回避策ですが、実証済みです。スクリプトは指定されたOUを検索し、部門などの属性でユーザーをフィルタリングし、対象のセキュリティグループに追加します。また、既存のグループメンバーをチェックし、基準を満たさなくなったメンバーを削除します。これは、ADが処理を必要以上に複雑にする必要があるためです。

このスクリプトの便利な点は、Windows タスク スケジューラなどを使ってスクリプトを自動実行するようにスケジュール設定できるため、グループが常に最新の状態を維持できる点です。手動で作業する必要がありません。以下のスクリプトは、特定の組織単位(OU)に属し、部門フィールドに「営業」を含むユーザーを対象としていますが、変数を調整することで、必要な条件に合わせて調整できます。

# Your AD domain name $ADDomain = 'dc=woshub, dc=com' # Dynamic group name $ADGroupname = 'EastSales' # OU list to search users $ADOUs = @( "OU=Users, OU=NewYork, $ADDomain", "OU=Users, OU=Chicago, $ADDomain" ) # Department name $DepartName="Sales" $users = @() # Search for users from the target department in the specified OUs foreach($OU in $ADOUs){ $users += Get-ADUser -SearchBase $OU -Filter {Department -like $DepartName} } # Add users to the target security group foreach($user in $users){ Add-ADGroupMember -Identity $ADGroupname -Members $user.samaccountname -ErrorAction SilentlyContinue } # Check that all group members still meet criteria; remove those who don't $members = Get-ADGroupMember -Identity $ADGroupname foreach($member in $members){ $UserOU=($member.distinguishedname -split ', ', 2)[1] if ($ADOUs -notcontains $UserOU){ Remove-ADGroupMember -Identity $ADGroupname -Members $member.samaccountname -Confirm:$false } if ((Get-ADUser -Identity $member -Properties Department).Department -notlike $DepartName ){ Remove-ADGroupMember -Identity $ADGroupname -Members $member.samaccountname -Confirm:$false } }

プロのヒント: 新しいメンバーを追加する前にすべてのグループ メンバーを消去するスクリプトが必要な場合は、この行を一番上に追加するだけです (この方が速く、エラーも少なくなる場合があります)。

Get-ADGroup $ADGroupname | Set-ADGroup -Members @()

これにより、以前のメンバーがすべてクリアされるため、毎回最初からやり直すことができます。ただし、基準に頻繁に参加したり外れたりするユーザーが多い場合は、毎回全員が削除されるため、この方法は理想的ではないかもしれません。

方法2: スケジュールされたタスクで自動化と委任を行う

スクリプトが動作するようになったら、適切な間隔で実行されるようにスケジュールタスクを設定します。たとえば、1日に2回、あるいは環境の変化が激しい場合は数時間ごとに実行するように設定できます。タスクのコマンドラインは次のようになります。

powershell.exe -ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File "C:\PS\update_dynamic_group_eastsales.ps1"

タスクを実行するアカウントに、グループメンバーシップを変更するための十分な権限があることを確認してください。ただし、この権限を委任された非管理者アカウントの方が望ましいです。一部のグループを整理するためだけに、完全なドメイン管理者権限を与えるのは避けるべきです。

設定によっては、スクリプトが初回実行時に失敗したり、権限を正しく登録するために再起動が必要になる場合があります。そのため、事前にテストを行い、検証もせずに設定したまま放置しないでください。

さらに一歩進んで、AD 管理をさらに自動化するのに役立つWinhance PowerShell モジュールなどのツールを検討することもできますが、これはまた別の機会に説明します。

結局のところ、これはちょっとしたハックですが、ほとんどの小規模から中規模の環境では十分に機能します。ただし、厳格なコンプライアンスが求められる重要なセキュリティグループには、この方法に頼るべきではありません。必ず手動チェックを実施してください。

場合によっては、古いユーザーを探すよりも、スクリプトを実行するたびにグループメンバーシップをクリアする方が簡単です。メンバーシップを再作成する前にグループをクリアするには、スクリプトの先頭に次の行を追加してください。

Get-ADGroup $ADGroupname | Set-ADGroup -Members @()

最後に、簡単にまとめると次のようになります。

まとめ

  • PowerShell スクリプトを使用してオンプレミス AD の動的グループ メンバーシップをエミュレートする
  • タスクスケジューラを使用してスクリプトを定期的に実行するようにスケジュールします。
  • 権限の委任は慎重に行い、完全な管理者権限を与えないようにしてください。
  • 必要に応じて検索フィルターとOUを調整する – 柔軟性はありますが、テストが必要です
  • 覚えておいてください、各実行の前にグループメンバーをクリアすると物事が簡単になりますが、注意してください

まとめ

この方法で動的グループを管理するのは完璧ではありませんが、自動化を目指すのであれば、手動で更新するよりも優れています。少し調整するだけで、手間をかけずにグループメンバーシップを正確に保つことができます。ただし、スクリプトは完璧ではないため、必ずステージング環境で事前にテストしてください。この方法がAD管理の時間と手間を軽減するのに役立つことを願っています。