PowerShellでグループ一覧を取得する完全ガイド!ローカル・AD両対応の実践テクニック

Windows

「ローカルグループの一覧を確認したい…」 「Active Directoryのグループメンバーを調べたい…」 「特定のユーザーがどのグループに所属しているか知りたい…」 「GUIだと時間がかかって効率が悪い…」

Windows環境でグループ管理をする際、PowerShellを使えば効率的に情報を取得・管理できます。

特に、複数のコンピューターやActive Directory環境では、PowerShellの威力は絶大です。コマンド一つで数百のグループ情報を瞬時に取得できるんです。

この記事では、ローカルグループからActive Directoryグループまで、PowerShellでグループ一覧を取得する方法を完全解説します。

システム管理者必見の実践テクニックをマスターしましょう!

スポンサーリンク

ローカルグループの一覧取得 – 基本から応用まで

Get-LocalGroupコマンド(Windows 10/11)

基本的な使い方:

# すべてのローカルグループを表示
Get-LocalGroup

# 結果を見やすく表示
Get-LocalGroup | Format-Table -AutoSize

実行結果の例:

Name                          Description
----                          -----------
Administrators               コンピューターへの無制限のアクセス
Users                        一般的なユーザー
Guests                       ゲストアクセス用
Remote Desktop Users         リモートデスクトップ接続許可
Power Users                  レガシー互換性用

特定のグループの詳細情報

グループの詳細を取得:

# Administratorsグループの詳細
Get-LocalGroup -Name "Administrators"

# SIDも含めて表示
Get-LocalGroup -Name "Administrators" | Select-Object *

グループメンバーの一覧取得

メンバー一覧の表示:

# Administratorsグループのメンバー
Get-LocalGroupMember -Group "Administrators"

# 結果を整形して表示
Get-LocalGroupMember -Group "Administrators" | 
    Select-Object Name, ObjectClass, PrincipalSource

WMIを使った方法(レガシー環境向け)

Windows 7以前でも使える:

# WMIでローカルグループ一覧
Get-WmiObject -Class Win32_Group -Filter "LocalAccount=True" | 
    Select-Object Name, Description

# 短縮形
gwmi Win32_Group -Filter "LocalAccount=True" | Select Name

Active Directoryグループの一覧取得

AD PowerShellモジュールのインストール

前提条件の確認:

# ADモジュールがインストールされているか確認
Get-Module -ListAvailable ActiveDirectory

# インストールされていない場合(Windows 10/11)
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0

Get-ADGroupコマンドの基本

すべてのADグループを取得:

# 基本的な一覧取得
Get-ADGroup -Filter *

# 名前とグループスコープを表示
Get-ADGroup -Filter * | Select-Object Name, GroupScope

グループタイプで絞り込み:

# セキュリティグループのみ
Get-ADGroup -Filter {GroupCategory -eq "Security"}

# 配布グループのみ
Get-ADGroup -Filter {GroupCategory -eq "Distribution"}

グループスコープ別の取得

スコープごとのグループ:

# ドメインローカルグループ
Get-ADGroup -Filter {GroupScope -eq "DomainLocal"}

# グローバルグループ
Get-ADGroup -Filter {GroupScope -eq "Global"}

# ユニバーサルグループ
Get-ADGroup -Filter {GroupScope -eq "Universal"}

条件指定での検索とフィルタリング

名前での検索

ワイルドカードを使った検索:

# "Admin"を含むグループ
Get-LocalGroup | Where-Object {$_.Name -like "*Admin*"}

# ADグループで"Sales"を含む
Get-ADGroup -Filter {Name -like "*Sales*"}

# 正規表現での検索
Get-LocalGroup | Where-Object {$_.Name -match "^Remote"}

作成日時での絞り込み(AD)

期間指定の検索:

# 過去30日以内に作成されたグループ
$date = (Get-Date).AddDays(-30)
Get-ADGroup -Filter {Created -gt $date} -Properties Created |
    Select-Object Name, Created

メンバー数での絞り込み

メンバー数をカウント:

# ローカルグループのメンバー数を表示
Get-LocalGroup | ForEach-Object {
    $members = Get-LocalGroupMember -Group $_.Name -ErrorAction SilentlyContinue
    [PSCustomObject]@{
        GroupName = $_.Name
        MemberCount = $members.Count
    }
} | Sort-Object MemberCount -Descending

グループメンバーシップの確認

特定ユーザーの所属グループ

ローカルユーザーの場合:

# ユーザーが所属するグループを確認
$userName = "TestUser"
Get-LocalGroup | ForEach-Object {
    $group = $_
    $members = Get-LocalGroupMember -Group $group.Name -ErrorAction SilentlyContinue
    if ($members.Name -contains "$env:COMPUTERNAME\$userName") {
        $group.Name
    }
}

ADユーザーの場合:

# ユーザーの所属グループ
Get-ADPrincipalGroupMembership -Identity "username" | 
    Select-Object Name, GroupScope

再帰的なグループメンバーシップ

ネストされたグループも含めて取得:

# ADで再帰的にメンバーを取得
Get-ADGroupMember -Identity "GroupName" -Recursive |
    Select-Object Name, ObjectClass

結果の整形と出力

CSV形式でエクスポート

グループ一覧をCSVに保存:

# ローカルグループ
Get-LocalGroup | 
    Select-Object Name, Description, SID |
    Export-Csv -Path "C:\LocalGroups.csv" -NoTypeInformation -Encoding UTF8

# ADグループ
Get-ADGroup -Filter * -Properties Description, Created |
    Select-Object Name, GroupScope, GroupCategory, Description, Created |
    Export-Csv -Path "C:\ADGroups.csv" -NoTypeInformation

HTML形式でレポート作成

見やすいHTMLレポート:

# スタイル付きHTMLレポート
$style = @"
<style>
    table {border-collapse: collapse; width: 100%;}
    th {background-color: #4CAF50; color: white; padding: 12px; text-align: left;}
    tr:nth-child(even) {background-color: #f2f2f2;}
    td {padding: 8px; border: 1px solid #ddd;}
</style>
"@

Get-LocalGroup | 
    Select-Object Name, Description |
    ConvertTo-Html -Head $style -Title "ローカルグループ一覧" |
    Out-File "C:\GroupReport.html"

GridViewで対話的に表示

フィルタリング可能な表示:

# GridViewで表示(フィルタリング機能付き)
Get-LocalGroup | Out-GridView -Title "ローカルグループ一覧"

# 選択したグループの詳細を表示
Get-LocalGroup | 
    Out-GridView -PassThru -Title "詳細を見たいグループを選択" |
    ForEach-Object {
        Write-Host "グループ: $($_.Name)" -ForegroundColor Yellow
        Get-LocalGroupMember -Group $_.Name
    }

リモートコンピューターのグループ取得

Invoke-Commandを使った方法

リモートでグループ一覧を取得:

# 単一のリモートコンピューター
$computerName = "Server01"
Invoke-Command -ComputerName $computerName -ScriptBlock {
    Get-LocalGroup
}

# 複数のコンピューター
$computers = @("Server01", "Server02", "Server03")
Invoke-Command -ComputerName $computers -ScriptBlock {
    Get-LocalGroup | Select-Object @{Name="Computer";Expression={$env:COMPUTERNAME}}, Name, Description
}

CIMセッションを使った方法

より効率的なリモート接続:

# CIMセッションを作成
$session = New-CimSession -ComputerName "Server01"

# グループ情報を取得
Get-CimInstance -CimSession $session -ClassName Win32_Group

# セッションを閉じる
Remove-CimSession -CimSession $session

よく使う実践的なスクリプト

空のグループを探す

# メンバーがいないグループを検出
Get-LocalGroup | ForEach-Object {
    $members = Get-LocalGroupMember -Group $_.Name -ErrorAction SilentlyContinue
    if ($members.Count -eq 0) {
        Write-Host "空のグループ: $($_.Name)" -ForegroundColor Red
    }
}

管理者権限を持つユーザー一覧

# Administratorsグループの全メンバーを取得
$admins = Get-LocalGroupMember -Group "Administrators"
$admins | ForEach-Object {
    [PSCustomObject]@{
        Name = $_.Name
        Type = $_.ObjectClass
        Source = $_.PrincipalSource
        SID = $_.SID
    }
} | Format-Table -AutoSize

グループの変更履歴を監視

# イベントログから変更を検出
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4732,4728} |
    Select-Object TimeCreated, Message |
    Where-Object {$_.Message -like "*group*"}

トラブルシューティング

よくあるエラーと対処法

アクセス拒否エラー:

# 管理者権限で実行
Start-Process powershell -Verb RunAs

ADモジュールが見つからない:

# RSATツールのインストール状態確認
Get-WindowsCapability -Online | Where-Object {$_.Name -like "*ActiveDirectory*"}

# インストール
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0

パフォーマンスの改善

大量のグループを効率的に処理:

# 並列処理で高速化
$groups = Get-ADGroup -Filter * -Properties Members
$groups | ForEach-Object -Parallel {
    [PSCustomObject]@{
        GroupName = $_.Name
        MemberCount = $_.Members.Count
    }
} -ThrottleLimit 5

セキュリティ監査用スクリプト

特権グループの監査

# 重要なグループのメンバーを監査
$privilegedGroups = @(
    "Administrators",
    "Domain Admins",
    "Enterprise Admins",
    "Schema Admins",
    "Backup Operators"
)

$report = foreach ($group in $privilegedGroups) {
    try {
        $members = Get-ADGroupMember -Identity $group -Recursive -ErrorAction Stop
        foreach ($member in $members) {
            [PSCustomObject]@{
                GroupName = $group
                MemberName = $member.Name
                MemberType = $member.ObjectClass
                Date = Get-Date
            }
        }
    } catch {
        Write-Warning "グループ $group の取得に失敗: $_"
    }
}

$report | Export-Csv "C:\PrivilegedGroupAudit.csv" -NoTypeInformation

まとめ – PowerShellでグループ管理を効率化!

PowerShellを使えば、グループ管理が驚くほど簡単になります!

今日学んだポイント:

✅ Get-LocalGroupでローカルグループを一覧表示
✅ Get-ADGroupでActive Directoryグループを取得
✅ フィルタリングで必要な情報だけ抽出
✅ CSV/HTMLでレポート作成
✅ リモートコンピューターのグループも管理可能

よく使うコマンドまとめ:

# ローカル
Get-LocalGroup
Get-LocalGroupMember -Group "GroupName"

# AD
Get-ADGroup -Filter *
Get-ADGroupMember -Identity "GroupName"
Get-ADPrincipalGroupMembership -Identity "UserName"

PowerShellのグループ管理機能を活用すれば、作業時間を大幅に削減できます。

定期的な監査レポートの自動化も可能です。

ぜひこれらのコマンドを活用して、効率的なシステム管理を実現してください!🎯

コメント

タイトルとURLをコピーしました