📝
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"
}
参考
関連スクリプト
Discussion