かつて山市良と呼ばれたおじさんのブログ
セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.166 この1年に作成したスクリプトのお気に入りトップ10(10→6)
2026年01月05日配信
執筆者:山内 和朗
2026年初のブログは、2025年中に作成、紹介したスクリプトやコマンドラインテクニックの中で、皆さんに使ってもらいたいものトップ10をお送りします。興味を持たれたスクリプトがありましたら、スクリプトやコマンドラインを掲載したオリジナル記事で詳しく確認してください。今回は第6位までカウントダウン!
| 掲載記事: vol.142 ギリギリのEOS対策に終止符を|Windows Server 2016 EOSまであと467日 |
「daystows2016eos.ps1」および「daystows2016eos.vbs」は、Windows Server 2016の延長サポート終了日である2027年1月12日までの残り日数を返すスクリプトです(画面1)。Windows SysinternalsのBgInfo用のスクリプト「daystows2016eosforbginfo.vbs」も用意しました。Windows Server 2016を運用中の場合は、壁紙にサポート終了までの残り日数を表示させてみてはいかがでしょうか?PowerShellやVBScriptの日付計算の参考にもなると思います。

画面1 Windows Server 2016のサポート終了1年前まであと7日!
| 掲載記事: vol.164 カスタムスクリプトでデータ収集を補完|Windows Server 2016 EOSまであと390日 |
「Windows Server 2016 EOSまであと X 日(シーズン1)」では、SSD-assistanceで移行元のサーバー情報を収集し、サーバー設定仕様書を自動作成すれば、移行に役立つでしょうと紹介しました。SSD-assistanceが収集しない情報、例えばディスクのパーティション構成やBitLockerドライブ暗号化状態および回復キーなどについては、移行前に自分で確認しておくことが重要です。「gatherserverinfo.ps1」は、その作業を簡素化するデータ収集スクリプトです(画面2)。Windowsの各種情報をPowerShellで取得する方法の参考になると思います。コードの一部は、Windows Admin Center(WAC)から拝借しています。
画面2 Windows Serverのハードウェア寄りの各種情報を取得するスクリプト
昨年8月末以降、マシンSIDが重複するデバイス間でKerberos認証やNTLM認証が失敗するようになる仕様変更が、Windows 11バージョン24H2以降およびWindows Server 2025に追加されました。このニュースの中で、マシンSIDの確認方法としてWindows SysinternalsのPsGetSidを紹介しましたが、PowerShellで次のコマンドラインを実行することで取得することもできます(画面3)。これは、ローカルユーザーのSIDが「マシンID-RID」の形式であることを利用して、ローカルユーザーまたはグループ(誰でもよいので最初に返ってきたもの)のSIDから最後のハイフン(-)直前までを切り出すコマンドラインです。生成AI(ChatGPT)に聞いたら、もっと複雑な方法を教えられましたが、このコマンドラインを提示したら、えらく褒められました。
| (Get-Localuser |Select -First 1).SID.Value -replace '-[^-]+$','' |

画面3 Windows SysinternalsのPsGetSidはあったら簡単だけど、無くてもPowerShellで代替できる
| 掲載記事: メモ. Azure VMの英語版(22H2~限定)を日本語化できる10行の呪文|Windows Server 2025大特集フォローアップ |
Azure VMで実行中のWindows Server 2025英語版の日本語化方法は、Windows Server 2022以前の英語版とは同じようにできません。同じ方法で日本語化すると、さまざまな問題が発生します。新しい方法は、Install-Languageコマンドレットを使用しての言語パックのインストールです。そのコマンドラインに加えて、通常、GUIで操作する日本語化のためのあらゆる設定を10行のコマンドラインで実行できるスクリプトを紹介しました。オンプレミスの物理サーバーやVMの場合は、さらにキーボードレイアウトの設定のために追加の5行のコマンドが必要です。オンプレミス向けのスクリプトはこちら。
| Install-Language ja-jp -CopyTosettings Set-WinUILanguageOverride ja-JP Set-Culture ja-JP Set-WinHomeLocation -GeoID 122 Set-TimeZone -Id "Tokyo Standard Time" $mylang = New-WinUserLanguageList ja Set-WinUserLanguageList $mylang -Force Set-WinDefaultInputMethodOverride "0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}" Set-WinSystemLocale ja-JP Restart-Computer -Force |
| 掲載記事: vol.162 アップグレード後に確認するべきポイント|Windows Server 2016 EOSまであと397日 |
Get-WinEventコマンドレットを使用すると、特定の条件に基づいて、イベントログをすばやく検索できます。条件指定のフィルター(XPathフィルター)の書き方が複雑に見えますが、イベントビューアーのGUIでフィルターを作成すれば、簡単にコピーできます。以下の1行コマンドラインは、過去24時間にシステムログに記録された、重大、警告、エラーイベントを見やすい形式に成形して出力します(画面4)。
| Get-WinEvent -LogName System -FilterXPath "*[System[(Level=1 or Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]" -ErrorAction SilentlyContinue | Sort -property RecordId -Descending | Select TimeCreated, LevelDisplayName, ProviderName, Id, Message| Format-Table @{Name="DateTime"; Expression={$_.TimeCreated}},@{Name="Level"; Expression={$_.LevelDisplayName}},@{Name="Source"; Expression={$_.ProviderName.Replace("Microsoft-Windows-","")}},@{Name="EventId"; Expression={$_.Id}},@{Name="Message"; Expression={$_.Message}} -AutoSize -Wrap |
※一致するイベントがない時のエラーに対処するため、-ErrorAction SilentlyContinueを追加しています。

画面4 過去24時間にシステムログに記録された、重大、警告、エラーイベント
次のコマンドラインを実行して「システム」ログに記録されている電源関連のイベントを検索すれば、起動、シャットダウン、スリープ、再開の状況を把握できます。
| Get-WinEvent -LogName System -FilterXPath "*[System[Provider[@Name='Microsoft-Windows-Kernel-Boot' or @Name='Microsoft-Windows-Kernel-General' or @Name='Microsoft-Windows-Kernel-Power'] and (EventID=12 or EventID=13 or EventID=20 or EventID=42 or EventID=107) and TimeCreated[timediff(@SystemTime) <= 604800000]]]" -ErrorAction SilentlyContinue | Sort -property RecordId | Select TimeCreated, LevelDisplayName, ProviderName, Id, Message| Format-Table @{Name="DateTime"; Expression={$_.TimeCreated}},@{Name="Level"; Expression={$_.LevelDisplayName}},@{Name="Source"; Expression={$_.ProviderName.Replace("Microsoft-Windows-","")}},@{Name="EventId"; Expression={$_.Id}},@{Name="Message"; Expression={$_.Message}} -AutoSize -Wrap |