どうもミツシマです。

今回はローカルユーザーを一括登録する為にPowershellで出来ないかを検証してみました。

今まではコマンドプロンプトで「net user」コマンドを使用していましたが、このコマンドだとパスワード無期限にする為に別コマンド「wmic UserAccount」を使用する必要があると思います。


よくやるやり方としては、エクセルでユーザー情報をまとめてコマンド生成するのが考えられますが、
先日、Powershellの「Import-Csv」コマンドを知り、これならCSVの編集だけで済むから効率がいいかも!と思い、作ってみました。
(注)Powershellバージョン5.1以上である必要があります。
  Windows10やWindowsServer2016以上であればデフォルトで搭載されています。

用意するファイルは「LocalUserAccout.csv」・「AddLocalUser.ps1」・「AddLocalGroupMember.ps1」です。


「LocalUserAccout.csv」
Name,Password,FullName,Description,LocalGroup1,LocalGroup2,LocalGroup3,LocalGroup4,LocalGroup5
testuser01,p@ssword01,test太郎01,testユーザー01,Users,testgroup1,テストgroup2,,
(続く)


「AddLocalUser.ps1」の中身
#CSVファイルを展開し、変数に取得
$CSVPath = $PSScriptRoot + "\LocalUserAccout.csv"
#Write-Output $CSVPath
$SetUserInfo = Import-Csv -Path $CSVPath -Encoding Default
#Write-Output $SetUserInfo

#CSVファイル内のユーザーを一括登録(パスワード無期限)
$SetUserInfo | ForEach-Object { New-LocalUser -Name $_.Name -Password (ConvertTo-SecureString $_.Password -AsPlainText -Force) -FullName $_.FullName -Description $_.Description -PasswordNeverExpires }


「AddLocalGroupMember.ps1」の中身
#CSVファイルを展開し、変数に取得
$CSVPath = $PSScriptRoot + "\LocalUserAccout.csv"
#Write-Output $CSVPath
$SetUserInfo = Import-Csv -Path $CSVPath -Encoding Default
#Write-Output $SetUserInfo

#CSVファイルで指定されたグループにユーザーを登録(最大5グループまで) 注:「Users」グループ必須
foreach($info in $SetUserInfo){
$UserName = $Info.Name
$LocalGroup1 = $Info.LocalGroup1
$LocalGroup2 = $Info.LocalGroup2
$LocalGroup3 = $Info.LocalGroup3
$LocalGroup4 = $Info.LocalGroup4
$LocalGroup5 = $Info.LocalGroup5

Write-Output $UserName
Write-Output $LocalGroup1
Write-Output $LocalGroup2
Write-Output $LocalGroup3
Write-Output $LocalGroup4
Write-Output $LocalGroup5

    If (-Not[string]::IsNullOrEmpty($LocalGroup1)){
        Start-Process cmd -ArgumentList "/c net localgroup $LocalGroup1 /ADD $UserName" -Wait -NoNewWindow
    }

    If (-Not[string]::IsNullOrEmpty($LocalGroup2)){
        Start-Process cmd -ArgumentList "/c net localgroup $LocalGroup2 /ADD $UserName" -Wait -NoNewWindow
    }

    If (-Not[string]::IsNullOrEmpty($LocalGroup3)){
        Start-Process cmd -ArgumentList "/c net localgroup $LocalGroup3 /ADD $UserName" -Wait -NoNewWindow
    }

    If (-Not[string]::IsNullOrEmpty($LocalGroup4)){
        Start-Process cmd -ArgumentList "/c net localgroup $LocalGroup4 /ADD $UserName" -Wait -NoNewWindow
    }

    If (-Not[string]::IsNullOrEmpty($LocalGroup5)){
        Start-Process cmd -ArgumentList "/c net localgroup $LocalGroup5 /ADD $UserName" -Wait -NoNewWindow
    }

}


<CSVファイルの対応表について>
①Name = ユーザー名
②Password = ユーザーのパスワード
③FullName = フルネーム
④Description = 説明
⑤LocalGroup1 = 所属するグループ1 ※(空白でも可だが、Usersが推奨)
⑥LocalGroup1 = 所属するグループ2 ※(空白でも可)
⑦LocalGroup1 = 所属するグループ3 ※(空白でも可)
⑧LocalGroup1 = 所属するグループ4 ※(空白でも可)
⑨LocalGroup1 = 所属するグループ5 ※(空白でも可)

ローカルユーザー作成2


⑤~⑨のLocalGroupについては空白でも実行可能ですが、「New-LocalUser」コマンドだと純粋にユーザーしか作成されず所属するグループがない状態で作成されるみたいです。
※「net user」コマンドであれば、最低限「Users」グループに所属されるのに。。。。。
その為、「Users」グループは最低限必要だと思いますので、「Users」を記述しておくことをお勧めします。
また、ローカルグループについては「AddLocalGroupMember.ps1」を実行前に作成しておくことが必須です。


<実行方法について>
CSVファイルの中身を編集しましたら、最後にCSVファイルを念のためメモ帳で開き直し、文字コードを「UTF-8」に変換して保存する。
※一応「Import-Csv」する際に「-Encoding Default」としてあるので、「UTF-8」ではなくても文字化けしないはずですが、念のための処理です。
 Excelで編集することが多いと思いますが、検証では「UTF-8」に直さなくても文字化けしませんでした。

その後、上記3つのファイルを同じフォルダ階層に配置した上で、Powershellを管理者として実行します。
「cd」コマンドで配置したファイルのカレントディレクトリまで移動し、「AddLocalUser.ps1」と「AddLocalGroupMember.ps1」を順番に実行します。
※Powershellでファイルを実行する際には「.\」をファイル名の前に付与すると実行出来ます。
 (例)「.\AddLocalUser.ps1」

また、今回は「パスワード無期限」で作成されるパラメータですが、不要であれば「-PasswordNeverExpires」の記述を削除してもらえればOKです。


後は実際に作成されたユーザーを確認して完了です。



とはいうものの実際に意図したグループに所属したか確認したいと思いますので、ローカルグループのメンバーをすべて書き出すps1ファイルも作成してみました。

GetLocalGroupMember.ps1
#出力結果を吐き出すCSVファイルのパスを変数に取得
$ResultFoler = $PSScriptRoot + "\GroupMember"

#出力先にフォルダーがなければ作成します。(実行したカレントディレクトリ直下に「GroupMember」フォルダを作成します。)
If(Test-Path $ResultFoler){
    Write-Output "GroupMemberフォルダが存在します。"
}else{
    Write-Output "GroupMemberフォルダがないため、作成します。"
    New-Item $ResultFoler -ItemType Directory
}

#すべてのローカルグループのメンバー情報を取得し、CSVファイルに出力
$AllLocalGroup = Get-LocalGroup
foreach($LocalGroup in $AllLocalGroup){
    $LocalGroupName = $LocalGroup.Name
    $ResultCsv = $ResultFoler + "\" + $LocalGroupName + ".csv"
    Write-Output $LocalGroupName
    Get-LocalGroupMember -Name $LocalGroupName | Export-Csv -path $ResultCsv -Encoding Default -NoTypeInformation
}


「GetLocalGroupMember.ps1」が配置されたカレントディレクトリ上に「GroupMember」フォルダを作成し、その中にそれぞれのローカルグループ名のcsvファイルで所属するユーザーを書き出します。



で、個人的に思うのですがこういった一括処理というのは何回か実行して検証したりしたいかな~と思います。
そこで「LocalUserAccout.csv」に記載のあるローカルユーザーを一括で削除するファイルも作成してみました。


DeleteLocalUser.ps1
#CSVファイルを展開し、変数に取得
$CSVPath = $PSScriptRoot + "\LocalUserAccout.csv"
#Write-Output $CSVPath
$SetUserInfo = Import-Csv -Path $CSVPath -Encoding Default
#Write-Output $SetUserInfo

#CSVファイルで指定されたADユーザーを一括削除
$SetUserInfo | ForEach-Object { Remove-LocalUser -Name $_.Name }


プロンプトで許可等求められずに削除されますので、実行前は注意して下さい。

最後に各ファイルをリンクにまとめました。
(文字化けしていたらすいません!!!)
AddLocalUser.ps1
AddLocalGroupMember.ps1
GetLocalGroupMember.ps1
DeleteLocalUser.ps1
LocalUserAccout.csv
スポンサードリンク