【Windows】AD_ADユーザをCSVからインポートする

ActiveDirectory

はじめに

今回はドメインユーザのインポートについて。構築というよりは保守の作業寄りかもしれません。毎年ユーザーを追加・削除するみたいな作業がある場合、実績のあるコマンドでやる事が多いでしょう。

検証環境でユーザが一定数欲しいとかあれば、そういう時にも使えるかもしれません。あまり目的が定まってないので、丁寧な解説はしません。メモみたいなものだと思っていただければ幸いです。

スクリプト

インポート用スクリプト

まずはインポート用のスクリプトから。OUとドメイン、認証用の情報は適宜書き換えて下さい。実行時に取り込む際、CSVファイルを手動で選択できる形式になっています。CSVについては次の項目で紹介します。

# Active Directoryモジュールをインポート
Import-Module ActiveDirectory

# Windows Formsを使用するためのアセンブリをロード
Add-Type -AssemblyName System.Windows.Forms

# OUパスとドメイン、パスワードを変数に格納
$ouPath = "OU=testou,DC=mochi,DC=ricecake24book,DC=com"
$yourDomain = "mochi.ricecake24book.com" 
$plainPassword = "admin@123"
$securePassword = ConvertTo-SecureString $plainPassword -AsPlainText -Force

## パスとドメインの確認メッセージを表示
Write-Host "OU Path: $ouPath"
Write-Host "Domain: $yourDomain"

# OpenFileDialogのインスタンスを作成
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.Filter = "CSV Files|*.csv"
$OpenFileDialog.Title = "CSVファイルを選択してください"

# ファイル選択ダイアログを表示
$dialogResult = $OpenFileDialog.ShowDialog()

# ユーザーがファイルを選択したかどうかを確認
if ($dialogResult -eq [System.Windows.Forms.DialogResult]::OK) {
    $csvPath = $OpenFileDialog.FileName
    
    # CSVファイルをインポート
    $csv = Import-Csv -Path $csvPath

    # CSVファイルの内容を基に新しいユーザーを作成
    foreach ($user in $csv) {
        $userPrincipalName = "$($user.SamAccountName)@$yourDomain"
        Write-Host "Creating user: $user.DisplayName with UPN: $userPrincipalName in OU: $ouPath"

        try {
            New-ADUser -Name $user.DisplayName 
                       -SamAccountName $user.SamAccountName 
                       -UserPrincipalName $userPrincipalName 
                       -EmailAddress $user.EmailAddress 
                       -Path $ouPath 
                       -AccountPassword $securePassword 
                       -Enabled $true 
                       -GivenName $user.GivenName 
                       -Surname $user.Surname `
                       -DisplayName $user.DisplayName

            Write-Host "Successfully created user: $user.DisplayName"
        } catch {
            Write-Host "Error creating user: $user.DisplayName"
            Write-Host $_.Exception.Message
        }
    }

    Write-Host "ユーザーのインポートが完了しました。"
} else {
    Write-Host "ファイルが選択されませんでした。"
}

CSVファイル

先ほど紹介したスクリプトで取り込めるCSVを紹介します。

見ての通りですが、一行目は各列のタイトルなので、実際のデータは2行目以降に書きます。今回は簡単な例なので属性は少なめです。

DisplayName,SamAccountName,EmailAddress
test01 ichiro,test01ichiro,test01@ricecake24book.com
test02 jiro,test02jiro,test02@ricecake24book.com

エクスポート

インポートしたデータが取り込まれたかを確認するスクリプトを紹介しています。大量にエクスポートした場合は、事後の確認として取得できると作業後の正常性確認となるでしょう。

# Active Directoryモジュールをインポート
Import-Module ActiveDirectory

# Windows Formsを使用するためのアセンブリをロード
Add-Type -AssemblyName System.Windows.Forms

# OUパスとドメインを変数に格納
$ouPath = "OU=testou,DC=mochi,DC=ricecake24book,DC=com"
$outputFileName = "exported_users.csv"

# SaveFileDialogのインスタンスを作成
$SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
$SaveFileDialog.Filter = "CSV Files|*.csv"
$SaveFileDialog.Title = "CSVファイルの保存先を選択してください"
$SaveFileDialog.FileName = $outputFileName

# ファイル保存ダイアログを表示
$dialogResult = $SaveFileDialog.ShowDialog()

# ユーザーが保存先を選択したかどうかを確認
if ($dialogResult -eq [System.Windows.Forms.DialogResult]::OK) {
    $csvPath = $SaveFileDialog.FileName
    
    # 指定したOU内のユーザーを取得
    $users = Get-ADUser -Filter * -SearchBase $ouPath -Properties DisplayName, SamAccountName, EmailAddress

    # エクスポート用のオブジェクトを作成
    $exportData = $users | Select-Object DisplayName, SamAccountName, EmailAddress

    # 取得したユーザー情報を表示
    $exportData | Format-Table -AutoSize

    # CSVファイルにエクスポート
    $exportData | Export-Csv -Path $csvPath -NoTypeInformation

    Write-Host "ユーザー情報のエクスポートが完了しました。ファイルパス: $csvPath"
} else {
    Write-Host "ファイルの保存先が選択されませんでした。"
}

以上。