便利!EC2のUserDataでWindowsのユーザーを作成する

記事タイトルとURLをコピーする

技術一課の鎌田(兄)です。

みなさん、EC2のインスタンス作成の際、UserDataをご活用かと思います。
Linuxではbash、WindowsだとPowerShellで書ける訳ですが、Windowsの場合、管理者権限を求められた上に、ポップアップで許可をしないと進めない、というケースがあります。

直近でも、「Windowsインスタンスが起動する時に、ローカルの管理者権限を持ったローカルユーザーを追加して欲しい!」なんてリクエストがあったのですが、こちらのブログで成果を公開したいと思います。

Windowsのローカルユーザー追加に必要なこと

Windowsのローカルユーザーを追加する際、コマンドで、しかもクリックなどもなく流れるようにするには、制約があります。

  • ユーザーアカウントの制御を無効化する必要がある
  • ユーザー追加コマンドを管理者権限で起動する必要がある

ユーザーアカウントの制御を無効化する必要がある

以下画面で、スライダーを一番下まで下げた状態にしておく必要があります。
この点を無効化しておかないと、せっかくUserDataにPowerShellのコードを入れても、ユーザー作成が行われません。

レジストリで管理されていますので、レジストリを書き換えるPowerShellコマンドを流すことで、無効化が可能です。
Set-ItemPropertyというPowerShellコマンドを使い、レジストリキー、レジストリ名、値を指定することで、書き換えることが出来ます。
これを使いましょう。

ユーザー追加コマンドを管理者権限で起動する必要がある

ユーザー追加を、管理者権限のない状態で実行しても、「アクセスが拒否されました」という、悲しいメッセージしか出てきません。
このため、ユーザー追加のコマンドを、「Powershellやcmdを管理者権限で実行する」のと同様に起動する必要があります。
通常であれば、以下のように、右クリックのメニューから選択されるケースが多いと思います。

が、こちらなんと、Start-ProcessというPowerShellコマンドに、 -Verb runAs という引数を付けることで、管理者モードで起動が出来ます。
これを使いましょう。

そしてコードが出来上がった!

出来上がったコードはこちらです。
testuserというユーザーを、パスワードTeset123!というパスワードで作っている例になります。


Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -name "ConsentPromptBehaviorAdmin"  -value "0"
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -name "EnableLUA" -value "0"
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -name "PromptOnSecureDesktop" -value "0"
Start-Process -FilePath "net" -ArgumentList "user testuser Test123! /add" -Verb runAs
Start-Process -FilePath "net" -ArgumentList "localgroup testuser sky365 /add" -Verb runAs

おわりに

WindowsのPowerShellはどうしても敬遠されがちですが、使いこなしていくことで、実に様々な作業を行うことが出来ます。
ユーザー作成も、その一例でしょう。
みなさんも、便利さを実感してください!