PowerShellを使用してActiveDirectoryにユーザーを一括更新する

Active Directory

組織変更となると結構な人数が動きますのでそこそこ時間がかかりますが、箝口令をしかれているため辞令前の反映は認められていません。なおかつなるはやで反映しなければいけないため、PowerShellで一括更新するスクリプトを作成しました。

概要

複数人の既存ユーザー情報を更新するスクリプトです。
私の業務向けに作成していますので、流用される際は必要箇所を変更してください。
PowerShellで実行すると、ps1ファイルと同じフォルダー内に保存したusers.csvファイルを読み込み、データがなくなるまでActiveDirectoryにユーザーに反映します。
users.csvのレイアウトについては後述の項目を参考にしてください。

サンプルコード

ipcsv users.csv -Encoding Default | %{
    $samAccountName = $_.'ad_account_name'
    $employeeID = $_.'employee_id'
    $userPrincipalName = $_.'ad_account_name' + '@hogehoge.co.jp'
    $company = 'hogehoge株式会社'
    $department = $_.'orgnaization_path'
    $department = $department.Replace('hogehoge','')
    $department = $department.Replace('\','')

    if($_.'manager' -eq '')
    {
        $manager = ''
    }else{
        $manager = 'CN=' + $_.'manager' + ',OU=Users,DC=hogehoge,DC=co,DC=jp'
    }

    $user = Get-ADUser -Identity $samAccountName
    $user.EmailAddress  = $_.'mail'
    $user.EmployeeID = $employeeID
    $user.EmployeeNumber = $employeeID 
    if($manager -ne '' ){
        $user.Manager = $manager
    }
    $user.Company = $company
    if($department -ne ''){
        $user.Department = $department
    }
    if($_.'title' -ne ''){
        $user.Title = $_.'title'
    }

    Set-ADUser -Instance $user

    Set-ADUser $_.'ad_account_name' -Replace @{'msDS-PhoneticLastName'=$_.'family_name';'msDS-PhoneticFirstName'=$_.'given_name';'msDS-PhoneticDisplayName'= $_.'name';}

    if($manager -eq ''){
        Set-ADUser -Identity $samAccountName -Clear Manager
    }
    if($department -eq ''){
        Set-ADUser -Identity $samAccountName -Clear Department
    }
    if($_.'title' -eq ''){
        Set-ADUser -Identity $samAccountName -Clear Title
    }

}

詳細

所々解説します。

私が利用しているusers.csvファイルのレイアウトは以下になります。
1行目は列名になります。

employee_id,ad_account_name,japanese_family_name,japanese_given_name,japanese_name,name,given_name,family_name,mail,orgnaization_code,orgnaization_path,title,boss_structure,manager
101,user1,テスト,ユーザー1,テスト ユーザー1,TEST USER1,USER1,TEST,testuser1@hogehoge.co.jp,01,hogeホールディングス\営業部,部長,ボス1\ボス2,ボス2
102,user2,テスト,ユーザー2,テスト ユーザー2,TEST USER2,USER2,TEST,testuser2@hogehoge.co.jp,02,hogeホールディングス\製造部,,ボス1\ボス3\ボス4,ボス4

まずは、同じフォルダー内に保存したusers.csvファイルを ipcsv で読み込んでいます。
その結果を「|」で ForEachに値を渡しています。
「|」は パイプラインと言い、先のコマンドで出力された内容を次のコマンドに橋渡しするためのものです。かなり便利ですが、使用しすぎて可読性は下げないようにしましょう。
「%」は ForEach-Object コマンドレットのエイリアスです。

ipcsv users.csv -Encoding Default | %{
# 登録処理など
}

必要に応じて読み込んだデータを変数に設定しています。
読み込んだデータへのアクセスは $_.’列名’ で出来ます。
$department でごちゃごちゃしているのは、別途作成したユーザー管理ツールの都合で、組織階層から直属の組織を取得するためですので、ここは読み飛ばしてください。

    $employeeID = $_.'employee_id'
    $userPrincipalName = $_.'ad_account_name' + '@hogehoge.co.jp'
    $company = 'hogehoge株式会社'
    $department = $_.'orgnaization_path'
    $department = $department.Replace('hogehoge','')
    $department = $department.Replace('\','')
    if($_.'manager' -eq '')
    {
        $manager = ''
    }else{
        $manager = 'CN=' + $_.'manager' + ',OU=Users,DC=hogehoge,DC=co,DC=jp'
    }
    echo $_.'ad_account_name'

ユーザー情報を設定していくのですが、このスクリプトで更新しない情報については既存の情報を利用したいため、 指定した SamAccountName でユーザー情報を取得します。

$user = Get-ADUser -Identity $samAccountName

取得したユーザー情報に変更内容を反映し、Set-ADuser コマンドレットでユーザー情報を更新します。
ふりがななど、パラメータに存在しない項目については @{info=”テスト”} の用に記述して登録することが出来ます。

    $user.EmailAddress  = $_.'mail'
    $user.EmployeeID = $employeeID
    $user.EmployeeNumber = $employeeID 
    if($manager -ne '' ){
        $user.Manager = $manager
    }
    $user.Company = $company
    if($department -ne ''){
        $user.Department = $department
    }
    if($_.'title' -ne ''){
        $user.Title = $_.'title'
    }

    Set-ADUser -Instance $user

    Set-ADUser $_.'ad_account_name' -Replace @{'msDS-PhoneticLastName'=$_.'family_name';'msDS-PhoneticFirstName'=$_.'given_name';'msDS-PhoneticDisplayName'= $_.'name';}

    if($manager -eq ''){
        Set-ADUser -Identity $samAccountName -Clear Manager
    }
    if($department -eq ''){
        Set-ADUser -Identity $samAccountName -Clear Department
    }
    if($_.'title' -eq ''){
        Set-ADUser -Identity $samAccountName -Clear Title
    }

利用可能なパラメータについては以下を参照ください。

Set-ADUser
   [-WhatIf]
   [-Confirm]
   [-AccountExpirationDate <DateTime>]
   [-AccountNotDelegated <Boolean>]
   [-Add <Hashtable>]
   [-AllowReversiblePasswordEncryption <Boolean>]
   [-AuthenticationPolicy <ADAuthenticationPolicy>]
   [-AuthenticationPolicySilo <ADAuthenticationPolicySilo>]
   [-AuthType <ADAuthType>]
   [-CannotChangePassword <Boolean>]
   [-Certificates <Hashtable>]
   [-ChangePasswordAtLogon <Boolean>]
   [-City <String>]
   [-Clear <String[]>]
   [-Company <String>]
   [-CompoundIdentitySupported <Boolean>]
   [-Country <String>]
   [-Credential <PSCredential>]
   [-Department <String>]
   [-Description <String>]
   [-DisplayName <String>]
   [-Division <String>]
   [-EmailAddress <String>]
   [-EmployeeID <String>]
   [-EmployeeNumber <String>]
   [-Enabled <Boolean>]
   [-Fax <String>]
   [-GivenName <String>]
   [-HomeDirectory <String>]
   [-HomeDrive <String>]
   [-HomePage <String>]
   [-HomePhone <String>]
   [-Identity] <ADUser>
   [-Initials <String>]
   [-KerberosEncryptionType <ADKerberosEncryptionType>]
   [-LogonWorkstations <String>]
   [-Manager <ADUser>]
   [-MobilePhone <String>]
   [-Office <String>]
   [-OfficePhone <String>]
   [-Organization <String>]
   [-OtherName <String>]
   [-Partition <String>]
   [-PassThru]
   [-PasswordNeverExpires <Boolean>]
   [-PasswordNotRequired <Boolean>]
   [-POBox <String>]
   [-PostalCode <String>]
   [-PrincipalsAllowedToDelegateToAccount <ADPrincipal[]>]
   [-ProfilePath <String>]
   [-Remove <Hashtable>]
   [-Replace <Hashtable>]
   [-SamAccountName <String>]
   [-ScriptPath <String>]
   [-Server <String>]
   [-ServicePrincipalNames <Hashtable>]
   [-SmartcardLogonRequired <Boolean>]
   [-State <String>]
   [-StreetAddress <String>]
   [-Surname <String>]
   [-Title <String>]
   [-TrustedForDelegation <Boolean>]
   [-UserPrincipalName <String>]
   [<CommonParameters>]

詳細については Microsoft のドキュメントをご参照ください。

New-ADUser (ActiveDirectory)
Use this topic to help manage Windows and Windows Server technologies with Windows PowerShell.

おすすめ書籍

どこでもインターネットで調べることができますが、社内のセキュリティーポリシーでインターネットを利用できない場所で作業することもありますし、ネットワークトラブルで使用できないこともありますので、買って損はしない一冊です。

Windowsコマンドプロンプトポケットリファレンス
Windows PowerShell ポケットリファレンス

おわりに

PowerShellとcsvファイルを用いた方法は以上になります。
ユーザー情報の更新になるため、使用する項目は最低限のものにしています。利用可能なパラメータを参考に、環境にあった内容に変更してください。

先日投稿した一括登録するスクリプトの更新バージョンです。

事前の作業が出来ればいいのですが、様々な事情で出来ないことが多いですし、催促の連絡が来ることが多いのでスクリプトを作成しました。所属するグループについてはまだスクリプト化していませんので、今後の課題になります。

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