Windows Server の初期設定を Session Manager で即完了させよう
bash だけじゃなく PowerShell も触っていこうと思い直しました、那須です。
先日、Windows Server のディスク初期設定を PowerShell でやってしまおうと書きました。
Windows Server の初期設定っていろいろとやることあるんですが、いちいち RDP で入って GUI で作業するのも時間かかるので全部 PowerShell でかつ Session Manager 経由でやりたいなと思ってやってみました。 なんとかなるもんですね。
やること
今回は下記のタスクを PowerShell で一気に片付けてしまおう、というお話です。
やってみよう
今回はこの Windows Server 2019 を実験台にしてやってみましょう。
EC2 インスタンスが起動したら、すぐに Systems Manager の Session Manager コンソールに移動しましょう。 そしてセッションを開始します。
時々、いくら待っても Systems Manager から対象の EC2 インスタンスが見えない時があります。
そんな場合は、EC2 インスタンスを再起動するとかなりの確率で見えるようになりますよ。
セッションが開いたら、スクリプトをコピペして実行します。
コピペするスクリプトは↓こんな感じの内容です。 改良の余地はたくさんあると思いますが、初期設定でしか使わないのでこんなんで十分です。
# Set variable $AdminKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" $UserKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" $Timezone = "Tokyo Standard Time" $Hostname = "nasunoserver" $InitializedDisks = @( @( "vol-0e6dfb6b7edc3cc24", "VVVVV", "V" ), @( "vol-010029bd0a044c8a4", "WWWWW", "W" ) ) # Disable Windows firewall get-NetFirewallProfile | set-NetFirewallProfile -Enabled false # Change timezone Set-TimeZone -Id $Timezone # Disable IE ESC Set-ItemProperty -Path $AdminKey -Name "IsInstalled" -Value 0 Set-ItemProperty -Path $UserKey -Name "IsInstalled" -Value 0 # Initialize disks $InitializedDisks | foreach { Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Set-Disk -IsReadonly $False | Set-Disk -IsOffline $False Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel $_[1] -Force | Get-Partition | Add-PartitionAccessPath -AccessPath ($_[2] + ":") } # Change administrator password $Password = Read-Host "Enter Administrator password" -AsSecureString $UserAccount = Get-LocalUser -Name "Administrator" $UserAccount | Set-LocalUser -Password $Password # Rename hostname Rename-Computer -NewName $Hostname -Force -Restart
確かめてみよう
再起動が終わったタイミングを見計らって、RDP でログインしてみましょう。
先ほど変更したパスワードを使って administrator ユーザで入ります。
入れましたか?
サーバーマネージャーとエクスプローラを開いてみると、変更をかけた部分がちゃんと変わっていますね。
なんか Windows Firewall が On のままだけど、この後もう一回同じ手順でやったら Off になったのでよしとしよう。
初期設定のためにエラーハンドリングを時間をかけてきっちり書いていくのもちょっと違うなーと思っているので、そういうこともあるよなと割り切ってます。
まとめ
いいこと
- キーペアで初期パスワードを復号する必要がない&EC2 インスタンス作成後の数分待つのがなくなる
- パスワードを忘れたとしても簡単にパスワード変更ができる
- RDP で入らなくてもいいので、なんか遅いな…とかでストレスたまらない
- 同じ作業をたくさんの EC2 インスタンスにすればするほど時間短縮の恩恵がある
もひとつなこと
- PowerShell で実行してエラーが出なかったからといって想定通り変更されているとは限らない(可能性は低いけど 0 ではない
これは PowerShell の問題というよりは Session Manager の問題な気もします。 コマンドレット実行してるように見えるけど実際には実行されてない、とか?
確実に変更されていることを確認するには、コマンドレット実行後に状態を確認して必要に応じて処理をする、みたいな流れのスクリプトにすることである程度は対処できそうですね。
というわけで、Session Manager は本当に便利ですよ!というお話でした。