PowerShellでADユーザーを一括作成しよう【CSV×New-ADUser】

4月といえば、情シス担当者にとって最も忙しい時期のひとつです。新入社員のActive Directoryアカウント作成作業、みなさんはどうされていますか?

筆者の会社では毎年30〜50名程度の新入社員が入社するのですが、以前はそのたびに管理画面を開いてひとりずつ手入力していたそうです。ミスが怖いので慎重にやっていたら丸半日かかってしまう年も…。

そこで今回は、CSVファイルを読み込んでADユーザーを一括作成するPowerShellスクリプトを作成しましたので、その内容を紹介します。

課題:手作業による大量ユーザー登録の問題点

毎年4月に発生する新入社員のADアカウント作成には、次のような問題がありました。

  • 作業時間がかかる:30名分を手作業でぽちぽち入力すると数時間かかる
  • ヒューマンエラーが起きやすい:名前のスペルミスや部署名の誤入力が発生しやすい
  • 再現性がない:作業者によって設定内容にばらつきが出る
  • 引き継ぎが難しい:担当者が変わるたびに作業手順を教え直す必要がある

特に困るのが、入社直前の3月末〜4月頭という時期です。他の年度末・期初業務と重なって、なかなかじっくりAD作業に時間を割けません。

解決策:PowerShellでCSV一括登録スクリプトを作る

PowerShellには Import-Csv でCSVを読み込み、New-ADUser でADユーザーを作成するコマンドレットが用意されています。これらを組み合わせることで、CSVを用意するだけで自動的にユーザーを登録できます。

CSVファイルの準備

まず、人事部門からもらった新入社員リストをもとに以下の形式でCSVを作成します。

# users.csv の例
# 文字コードはUTF-8(BOMなし)で保存すること
名前,苗字,ユーザー名,メールアドレス,部署,役職,パスワード
Taro,Yamada,t.yamada,t.yamada@example.com,情報システム部,一般社員,P@ssw0rd2024!
Hanako,Suzuki,h.suzuki,h.suzuki@example.com,総務部,一般社員,P@ssw0rd2024!
Ichiro,Tanaka,i.tanaka,i.tanaka@example.com,営業部,一般社員,P@ssw0rd2024!

CSVの列名は後述のスクリプト内で参照するので、変更する場合はスクリプト側も合わせて修正してください。

PowerShellスクリプト本体

# ============================================================
# ADユーザー一括作成スクリプト
# 対象: Active Directory Domain Services 環境
# 実行前提: ActiveDirectory モジュール導入済み、
#           ドメイン管理者権限でPowerShellを実行
# ============================================================

# --- 設定項目 ---
# CSVファイルのパス(スクリプトと同じフォルダに置く想定)
$csvPath = ".\users.csv"

# 作成先のOU(組織単位)のDN(DistinguishedName)
# 例: "OU=新入社員,OU=ユーザー,DC=example,DC=local"
$ouDN = "OU=新入社員,OU=ユーザー,DC=example,DC=local"

# ドメイン名(UPN サフィックス)
$domain = "example.com"

# ログファイルのパス
$logPath = ".\ad_create_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"

# --- ログ出力関数 ---
function Write-Log {
    param([string]$message, [string]$level = "INFO")
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logLine = "[$timestamp] [$level] $message"
    # コンソールとログファイル両方に出力
    Write-Host $logLine
    Add-Content -Path $logPath -Value $logLine -Encoding UTF8
}

# --- メイン処理 ---
Write-Log "ADユーザー一括作成スクリプト開始"

# CSVファイルの存在確認
if (-not (Test-Path $csvPath)) {
    Write-Log "CSVファイルが見つかりません: $csvPath" "ERROR"
    exit 1
}

# CSVを読み込む(Import-Csv で1行ずつオブジェクトとして取得)
$users = Import-Csv -Path $csvPath -Encoding UTF8
Write-Log "読み込みユーザー数: $($users.Count) 件"

# 成功・失敗カウンター
$successCount = 0
$failCount = 0

foreach ($user in $users) {
    try {
        # UPN(User Principal Name)を組み立てる
        # 例: t.yamada@example.com
        $upn = "$($user.ユーザー名)@$domain"

        # New-ADUser で AD ユーザーを作成
        New-ADUser `
            -Name "$($user.苗字) $($user.名前)" `          # 表示名(姓 名)
            -GivenName $user.名前 `                         # 名(ファーストネーム)
            -Surname $user.苗字 `                           # 姓(ラストネーム)
            -SamAccountName $user.ユーザー名 `              # ログオン名(旧形式)
            -UserPrincipalName $upn `                       # ログオン名(UPN形式)
            -EmailAddress $user.メールアドレス `            # メールアドレス
            -Department $user.部署 `                        # 部署
            -Title $user.役職 `                             # 役職
            -Path $ouDN `                                   # 作成先OU
            -AccountPassword (ConvertTo-SecureString $user.パスワード -AsPlainText -Force) `
            -ChangePasswordAtLogon $true `                  # 初回ログイン時にパスワード変更を強制
            -Enabled $true                                  # アカウントを有効化

        Write-Log "作成成功: $($user.ユーザー名) ($($user.苗字) $($user.名前))"
        $successCount++

    } catch {
        # エラーが発生しても処理を止めず次のユーザーへ
        Write-Log "作成失敗: $($user.ユーザー名) - $($_.Exception.Message)" "ERROR"
        $failCount++
    }
}

# 結果サマリーを出力
Write-Log "===== 処理完了 ====="
Write-Log "成功: $successCount 件 / 失敗: $failCount 件"
Write-Log "ログファイル: $logPath"

ポイント解説

① Import-Csv:CSVをオブジェクトとして扱う

Import-Csv はCSVの1行目をプロパティ名として認識し、2行目以降を1件ずつオブジェクトとして返します。日本語ヘッダーも問題なく扱えますが、文字コードはUTF-8(BOMなし)を推奨します。

# Import-Csv の基本的な使い方
$users = Import-Csv -Path ".\users.csv" -Encoding UTF8

# 各行は PSCustomObject として取得される
# $user.ユーザー名 のようにヘッダー名でアクセスできる
foreach ($user in $users) {
    Write-Host $user.ユーザー名
}

② New-ADUser:ADユーザー作成のコマンドレット

New-ADUser はActive Directoryのユーザーオブジェクトを作成するコマンドレットです。ActiveDirectory モジュール(RSAT のAD管理ツール)が必要です。未導入の場合は以下でインストールできます。

# Windows 10/11 の場合(管理者権限のPowerShellで実行)
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0

よく使うパラメーターをまとめました。

パラメーター 説明
-SamAccountName 従来形式のログオン名(必須) t.yamada
-UserPrincipalName メール形式のログオン名(UPN) t.yamada@example.com
-Path 作成先OUのDN OU=Users,DC=example,DC=local
-AccountPassword 初期パスワード(SecureString型) ConvertTo-SecureString で変換
-ChangePasswordAtLogon 初回ログイン時にパスワード変更を要求 $true
-Enabled アカウントの有効/無効 $true

③ ConvertTo-SecureString:パスワードの安全な受け渡し

New-ADUser-AccountPassword パラメーターは SecureString 型を要求します。CSVから読んだ平文のパスワードは ConvertTo-SecureString で変換が必要です。

# 平文パスワードをSecureStringに変換する
# -AsPlainText と -Force の組み合わせが必須
$securePass = ConvertTo-SecureString "P@ssw0rd2024!" -AsPlainText -Force
⚠️ セキュリティに関する注意:CSVにパスワードを平文で記載するのはセキュリティリスクがあります。本番運用では、パスワードはスクリプト実行時に Read-Host -AsSecureString で都度入力するか、全員に同じ仮パスワードを使って初回ログイン時に必ず変更させる運用を徹底してください。

④ try-catch でエラーハンドリング

一括処理では途中でエラーが発生しても処理を止めずに続けることが重要です。try-catch を使えば、エラーが起きたユーザーだけをログに残してスキップできます。

foreach ($user in $users) {
    try {
        # ユーザー作成処理
        New-ADUser ...
        Write-Log "作成成功: $($user.ユーザー名)"
    } catch {
        # エラーメッセージを記録して次のユーザーへ進む
        Write-Log "作成失敗: $($user.ユーザー名) - $($_.Exception.Message)" "ERROR"
    }
}

応用:グループへの一括追加も自動化する

ユーザー作成だけでなく、部署ごとのADグループへの追加も自動化できます。CSVに「グループ名」列を追加して、Add-ADGroupMember を組み合わせましょう。

# ユーザー作成後にグループへ追加する例
foreach ($user in $users) {
    try {
        # まずユーザーを作成
        New-ADUser -SamAccountName $user.ユーザー名 ...

        # 部署に対応するADグループに追加
        # CSVの「グループ名」列でグループを指定する
        if ($user.グループ名) {
            Add-ADGroupMember `
                -Identity $user.グループ名 `       # 追加先グループ名
                -Members $user.ユーザー名           # 追加するユーザー
            Write-Log "グループ追加成功: $($user.ユーザー名) -> $($user.グループ名)"
        }
    } catch {
        Write-Log "処理失敗: $($user.ユーザー名) - $($_.Exception.Message)" "ERROR"
    }
}

さらに発展させると、ホームディレクトリの自動作成や、Microsoft 365アカウントとの連携(Azure AD Connect 環境であれば自動同期)なども組み込めます。

実際に使ってみた感想

このスクリプトを導入してから、毎年の新入社員対応が格段に楽になりました。

  • 作業時間:半日 → 約15分(CSV整備込み)
  • ミス件数:毎年数件あったタイポ → ゼロ
  • 引き継ぎ:スクリプトとCSVの使い方だけ覚えれば誰でもできる

人事部門からExcelで送られてくるリストをCSVに変換する作業は残りますが、それでも全体の工数は大幅に削減できました。

まとめ

今回は PowerShell を使ってCSVからADユーザーを一括作成するスクリプトを紹介しました。

  • Import-Csv でCSVを読み込み、各行をオブジェクトとして扱える
  • New-ADUser でADユーザーを作成(ActiveDirectoryモジュールが必要)
  • try-catch でエラーハンドリングし、失敗しても処理を継続できる
  • Add-ADGroupMember を組み合わせてグループ追加も自動化できる

手作業の繰り返しは自動化のチャンスです。情シス担当者として、こうしたスクリプトをひとつずつ積み上げていくことで、本来やるべき業務に集中できる環境を作っていきましょう。

スクリプトのカスタマイズや、Azure AD(Entra ID)での一括作成方法についても今後記事にする予定です。ご参考になれば幸いです!

 

コメント

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