sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

Windows Server の初期設定を Session Manager で即完了させよう

bash だけじゃなく PowerShell も触っていこうと思い直しました、那須です。

先日、Windows Server のディスク初期設定を PowerShell でやってしまおうと書きました。

nasrinjp1.hatenablog.com

Windows Server の初期設定っていろいろとやることあるんですが、いちいち RDP で入って GUI で作業するのも時間かかるので全部 PowerShell でかつ Session Manager 経由でやりたいなと思ってやってみました。 なんとかなるもんですね。

 

やること

今回は下記のタスクを PowerShell で一気に片付けてしまおう、というお話です。

  • Windows Firewall の無効化
  • IE ESC の無効化
  • タイムゾーンの設定
  • ディスクの初期化
  • administratorのパスワード変更
  • ホスト名の変更と反映のための再起動

 

やってみよう

今回はこの Windows Server 2019 を実験台にしてやってみましょう。 f:id:nasrinjp1:20190307224711p:plain

EC2 インスタンスが起動したら、すぐに Systems Manager の Session Manager コンソールに移動しましょう。 そしてセッションを開始します。

時々、いくら待っても Systems Manager から対象の EC2 インスタンスが見えない時があります。 そんな場合は、EC2 インスタンスを再起動するとかなりの確率で見えるようになりますよ。
f:id:nasrinjp1:20190307224727p:plain

セッションが開いたら、スクリプトをコピペして実行します。
f:id:nasrinjp1:20190307224742p:plain

コピペするスクリプトは↓こんな感じの内容です。 改良の余地はたくさんあると思いますが、初期設定でしか使わないのでこんなんで十分です。

# 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 ユーザで入ります。 入れましたか?
f:id:nasrinjp1:20190307224756p:plain

サーバーマネージャーとエクスプローラを開いてみると、変更をかけた部分がちゃんと変わっていますね。
なんか Windows Firewall が On のままだけど、この後もう一回同じ手順でやったら Off になったのでよしとしよう。 初期設定のためにエラーハンドリングを時間をかけてきっちり書いていくのもちょっと違うなーと思っているので、そういうこともあるよなと割り切ってます。

 

まとめ

いいこと

  • キーペアで初期パスワードを復号する必要がない&EC2 インスタンス作成後の数分待つのがなくなる
  • パスワードを忘れたとしても簡単にパスワード変更ができる
  • RDP で入らなくてもいいので、なんか遅いな…とかでストレスたまらない
  • 同じ作業をたくさんの EC2 インスタンスにすればするほど時間短縮の恩恵がある

もひとつなこと

  • PowerShell で実行してエラーが出なかったからといって想定通り変更されているとは限らない(可能性は低いけど 0 ではない

これは PowerShell の問題というよりは Session Manager の問題な気もします。 コマンドレット実行してるように見えるけど実際には実行されてない、とか?

確実に変更されていることを確認するには、コマンドレット実行後に状態を確認して必要に応じて処理をする、みたいな流れのスクリプトにすることである程度は対処できそうですね。

 

というわけで、Session Manager は本当に便利ですよ!というお話でした。