技術一課の鎌田(兄)です。
みなさん、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はどうしても敬遠されがちですが、使いこなしていくことで、実に様々な作業を行うことが出来ます。
ユーザー作成も、その一例でしょう。
みなさんも、便利さを実感してください!