📝

Active Directory:ユーザー情報をCSV出力

に公開

オンプレAD環境でユーザー情報の整理をするためにアカウント名、表示名、所属OUが欲しかったのでCSV出力するPowerShellを書いてみた。

前提条件

  • ドメインコントローラーにコンソールかリモートデスクトップでログオンして操作する
  • 管理者の PC から操作する場合は、Active Directory モジュールが使えること

処理の中身

  • ユーザー情報をCSV出力(アカウント名,表示名,所属OUのみ)
UserOU.csv
"SamAccountName","DisplayName","TargetOU"
"test-user01","テストユーザー01","testOU01"
"test-user02","テストユーザー02","testOU02"
  • TargetOU,SamAccountNameで並び替え
  • Shift_JISでCSV出力

完成したスクリプト

GetAllUserOU.ps1
<#
.SYNOPSIS
    指定したOU配下のユーザー情報を抽出し、所属OU名付きでCSVに出力する。
#>
param (
    # 実行時に引数として渡すことも、そのまま実行してデフォルト値を使うことも可能
    [Parameter(Mandatory=$false)]
    [string]$TargetOU = "OU=〇〇,DC=〇〇,DC=〇〇",
    [Parameter(Mandatory=$false)]
    [string]$OutFile = "UserOU.csv"
)

# エラー発生時に処理を続行せず、必ずcatchブロックへ移行させるための厳格な設定
$ErrorActionPreference = "Stop"

try {
    Write-Host "処理を開始します。対象OU: $TargetOU" -ForegroundColor Cyan

    # 1. 前提条件の確認:ActiveDirectoryモジュールのロード
    # (Windows Server 2012環境も考慮し、明示的なロードと存在チェックを実施)
    if (-not (Get-Module -Name ActiveDirectory -ListAvailable)) {
        throw "ActiveDirectoryモジュールが存在しません。RSAT等のインストール状況を確認してください。"
    }
    Import-Module ActiveDirectory

    # 2. ADからの情報取得
    # OUの指定ミスや権限不足のエラーはここでcatchへ飛ぶ
    $users = Get-ADUser -Filter * -SearchBase $TargetOU -SearchScope Subtree -Properties DisplayName

    if ($users.Count -eq 0 -or $null -eq $users) {
        Write-Warning "指定されたOU配下にユーザーが存在しません。"
        exit
    }

# 3. オブジェクトの加工・ソート・CSV出力
    # CSVファイルがExcel等で開かれていてロックされているエラーはここでcatchへ飛ぶ
    $users | Select-Object SamAccountName, 
                           DisplayName, 
                           @{Name="TargetOU"; Expression={
                               if ($_.DistinguishedName -match "OU=(.*?),") { $matches[1] } else { "None" }
                           }} |
             # 【追加】ここで指定したプロパティの順にソートを実行
             Sort-Object -Property TargetOU,SamAccountName |
             Export-Csv -Path $OutFile -Encoding UTF8 -NoTypeInformation -Force

    Write-Host "正常に完了しました。出力先: $($pwd)\$OutFile" -ForegroundColor Green

} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
    # 原因解析1:AD側の問題(OUが存在しないなど)
    Write-Error "【ADエラー】指定されたOUが存在しないか、アクセス権がありません。設定値を確認してください。`n詳細: $($_.Exception.Message)"
} catch [System.IO.IOException] {
    # 原因解析2:ファイルシステム側の問題(現場で最も多いエラー)
    Write-Error "【ファイルエラー】出力先ファイル($OutFile)に書き込めません。ファイルがExcel等で開かれたままになっていないか確認してください。`n詳細: $($_.Exception.Message)"
} catch {
    # 原因解析3:その他の予期せぬエラー
    Write-Error "【予期せぬエラー】処理中にエラーが発生しました。`n詳細: $($_.Exception.Message)"
} finally {
    # 状態の復元(スクリプト終了後もPowerShellコンソールを閉じない場合への配慮)
    $ErrorActionPreference = "Continue" 
}

参考

https://docs.microsoft.com/en-us/powershell/module/addsadministration/get-aduser?view=windowsserver2019-ps

関連スクリプト

https://zenn.dev/8chikuwa3/articles/dad9b6372f2985

Discussion