All Articles

Power Shell スクリプトで Windows のフルメモリダンプの取得設定とキーボードクラッシュの設定を行う

なんとなく毎回手動でフルダンプの取得設定を行うのが面倒になったので、設定を自動化できる Power Shell スクリプトを書いてみました。

基本的な設定値は以下の公式 Blog の内容をベースにしています。

参考:完全メモリ ダンプの出力設定 | Microsoft Japan Windows Technology Support Blog

また、フルメモリダンプの取得設定に加えて、以下の公開情報を参考にユーザモードのプロセスダンプ設定もフルダンプを取得できるように設定変更をおこなっています。

参考:Collecting User-Mode Dumps - Win32 apps | Microsoft Learn

スクリプトは以下です。

また、EnableFulldump.ps1 からもダウンロードできます。

※ 実行には管理者権限が必要です。

# Settings of Full memory dump
$crashControlRegPath = "HKLM:System\CurrentControlSet\Control\CrashControl"
$isExistKey = Test-Path -LiteralPath $crashControlRegPath
if ($isExistKey -eq $False) {
	New-Item -Path $crashControlRegPath
}
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "CrashDumpEnabled" -PropertyType "DWord" -Value "1" -Force
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "AutoReboot" -PropertyType "DWord" -Value "1" -Force
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "DumpFile" -PropertyType "ExpandString" -Value "%SystemRoot%\FULL_MEMORY.DMP" -Force
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "LogEvent" -PropertyType "DWord" -Value "1" -Force

# Settings of Full application dump
$localDumpsRegPath = "HKLM:SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
$isExistKey = Test-Path -LiteralPath $localDumpsRegPath
if ($isExistKey -eq $False) {
	New-Item -Path $localDumpsRegPath
}
New-ItemProperty -LiteralPath $localDumpsRegPath -Name "DumpFolder" -PropertyType "ExpandString" -Value "%LOCALAPPDATA%\CrashDumps" -Force
New-ItemProperty -LiteralPath $localDumpsRegPath -Name "DumpCount" -PropertyType "DWord" -Value "2" -Force
New-ItemProperty -LiteralPath $localDumpsRegPath -Name "DumpType" -PropertyType "DWord" -Value "2" -Force

# Disable CrashOnCtrlScroll
$parameterRegPaths = @("HKLM:System\CurrentControlSet\Services\i8042prt\Parameters",
					  "HKLM:System\CurrentControlSet\Services\kbdhid\Parameters",
					  "HKLM:System\CurrentControlSet\Services\hyperkbd\Parameters"
					)
foreach ($parameterRegPath in $parameterRegPaths) {
	$isExistKey = Test-Path -LiteralPath $parameterRegPath
	if ($isExistKey -eq $False) {
		New-Item -Path $parameterRegPath
	}
	New-ItemProperty -LiteralPath $parameterRegPath -Name "CrashOnCtrlScroll" -PropertyType "DWord" -Value "0" -Force
}

# Setting alt dump key
$parameterRegPaths = @("HKLM:System\CurrentControlSet\Services\i8042prt\crashdump",
					  "HKLM:System\CurrentControlSet\Services\kbdhid\crashdump",
					  "HKLM:System\CurrentControlSet\Services\hyperkbd\crashdump"
					)
foreach ($parameterRegPath in $parameterRegPaths) {
	$isExistKey = Test-Path -LiteralPath $parameterRegPath
	if ($isExistKey -eq $False) {
		New-Item -Path $parameterRegPath
	}
	New-ItemProperty -LiteralPath $parameterRegPath -Name "Dump1Keys" -PropertyType "DWord" -Value "0x2" -Force
	New-ItemProperty -LiteralPath $parameterRegPath -Name "Dump2Key" -PropertyType "DWord" -Value "0x3d" -Force
}

# Change PageFileSize
$totalPhysicalMemSize = $([Math]::Round((Get-WmiObject Win32_OperatingSystem).TotalVisibleMemorySize / 1024))
$freeStorageSizeofC = $([Math]::Round(((Get-PSDrive C).Free / 1024 / 1024)))
$pageFileSize = $totalPhysicalMemSize + 400
$pageFileSetting = "c:\pagefile.sys $pageFileSize $pageFileSize"
if (($freeStorageSizeofC -gt $pageFileSize) -eq $True) {
	New-ItemProperty -LiteralPath "HKLM:System\CurrentControlSet\Control\Session Manager\Memory Management" -Name "PagingFiles" -PropertyType "MultiString" -Value $pageFileSetting -Force
} else {
	Write-Warning "C drive space is too small."
}

なお、上記のスクリプトでは、フルダンプの取得設定に加えてキーボードクラッシュの設定を行っています。

僕のメインで使っている ThinkPad のキーボードには CtrlScroll キーがないため、CrashOnCtrlScroll ではなく代替キーを設定しています。

上記のスクリプトの設定適用後、OS を再起動して [右 CTRL を押しながら Space キー を 2 回] 叩くとキーボードクラッシュが発生し、システムの再起動後に C:\Windows\FULL_MEMORY.DMP からフルダンプを取得することができます。

※ キーボードダンプは RDP 接続や Hyper-V の拡張セッション経由では動作しないので、コンソールを使用するか NotMyFault などのツールを利用する必要があります。