PowerShellでシステムのスリープ・ハイバネート設定をカスタマイズする方法という問いには、利用可能状態と現在プランを確認し、必要な休止有効化とAC側タイムアウトだけを承認値へ変更するという方法で答えます。スリープと休止状態の利用可否はハードウェア、ファームウェア、ドライバー、ポリシーに依存する。powercfg /hibernate onだけで全機種に同じ電源状態が現れるわけではない。この記事ではpowercfg /aの利用可能状態、アクティブScheme GUID、AC/DCのタイムアウト、hibernateの旧状態を保存するを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。
seq13の電源ボタン動作ではなく、自動スリープ時間と休止状態の可否を管理する。完了は「powercfg /aとqueryが期待値となり、業務アプリを閉じた試験端末で復帰とネットワーク再接続を確認できる」と定義します。対象が取れない場合は「休止状態が利用不可なら理由表示、ファームウェア、ポリシー、ディスク空き容量を確認し、無理に設定を繰り返さない」として切り分け、推測で成功扱いにしません。
利用可能な電源状態を先に確認
利用可能状態と現在プランを確認し、必要な休止有効化とAC側タイムアウトだけを承認値へ変更する。スリープと休止状態の設定ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。seq13の電源ボタン動作ではなく、自動スリープ時間と休止状態の可否を管理する。
利用可能な電源状態を先に確認の合格条件は、powercfg /aとqueryが期待値となり、業務アプリを閉じた試験端末で復帰とネットワーク再接続を確認できることです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。
アクティブ電源プランを保存
アクティブ電源プランを保存では、スリープと休止状態の設定の対象を「powercfg /aの利用可能状態、アクティブScheme GUID、AC/DCのタイムアウト、hibernateの旧状態を保存する」という単位で扱います。スリープと休止状態の利用可否はハードウェア、ファームウェア、ドライバー、ポリシーに依存する。powercfg /hibernate onだけで全機種に同じ電源状態が現れるわけではない。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。
スリープと休止状態の設定を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。
ACのスリープ時間を読み取る
ACのスリープ時間を読み取るは変更前の基準点です。powercfg /aの利用可能状態、アクティブScheme GUID、AC/DCのタイムアウト、hibernateの旧状態を保存するを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
namespace Ittrip.Power {
public sealed class SleepTimeoutSnapshot {
public Guid SchemeGuid { get; set; }
public uint ACSeconds { get; set; }
public uint DCSeconds { get; set; }
}
public sealed class HibernateCapabilitySnapshot {
public bool HiberFilePresent { get; set; }
public bool SystemS4 { get; set; }
public byte HiberFileType { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
internal struct BatteryReportingScale { public uint Granularity; public uint Capacity; }
[StructLayout(LayoutKind.Sequential)]
internal struct SystemPowerCapabilities {
public byte PowerButtonPresent, SleepButtonPresent, LidPresent, SystemS1, SystemS2, SystemS3, SystemS4, SystemS5;
public byte HiberFilePresent, FullWake, VideoDimPresent, ApmPresent, UpsPresent, ThermalControl, ProcessorThrottle;
public byte ProcessorMinThrottle, ProcessorThrottleScale;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] public byte[] Spare2;
public byte ProcessorMaxThrottle, FastSystemS4, Hiberboot, WakeAlarmPresent, AoAc, DiskSpinDown;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)] public byte[] Spare3;
public byte HiberFileType, AoAcConnectivitySupported, SystemBatteriesPresent, BatteriesAreShortTerm;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=3)] public BatteryReportingScale[] BatteryScale;
public int AcOnLineWake, SoftLidWake, RtcWake, MinDeviceWakeState, DefaultLowLatencyWake;
}
public static class PowerPolicyReader {
[DllImport("powrprof.dll")] static extern uint PowerGetActiveScheme(IntPtr rootPowerKey, out IntPtr activePolicyGuid);
[DllImport("powrprof.dll")] static extern uint PowerReadACValueIndex(IntPtr rootPowerKey, ref Guid schemeGuid, ref Guid subgroupGuid, ref Guid settingGuid, out uint valueIndex);
[DllImport("powrprof.dll")] static extern uint PowerReadDCValueIndex(IntPtr rootPowerKey, ref Guid schemeGuid, ref Guid subgroupGuid, ref Guid settingGuid, out uint valueIndex);
[DllImport("powrprof.dll")]
[return: MarshalAs(UnmanagedType.U1)]
static extern bool GetPwrCapabilities(out SystemPowerCapabilities capabilities);
[DllImport("kernel32.dll")] static extern IntPtr LocalFree(IntPtr memory);
public static SleepTimeoutSnapshot ReadTimeouts() {
IntPtr pointer; uint error = PowerGetActiveScheme(IntPtr.Zero, out pointer);
if (error != 0) throw new InvalidOperationException("PowerGetActiveScheme: " + error);
try {
Guid scheme = (Guid)Marshal.PtrToStructure(pointer, typeof(Guid));
Guid subgroup = new Guid("238C9FA8-0AAD-41ED-83F4-97BE242C8F20");
Guid standby = new Guid("29F6C1DB-86DA-48C5-9FDB-F2B67B1F44DA");
uint ac, dc;
error = PowerReadACValueIndex(IntPtr.Zero, ref scheme, ref subgroup, ref standby, out ac);
if (error != 0) throw new InvalidOperationException("PowerReadACValueIndex: " + error);
error = PowerReadDCValueIndex(IntPtr.Zero, ref scheme, ref subgroup, ref standby, out dc);
if (error != 0) throw new InvalidOperationException("PowerReadDCValueIndex: " + error);
return new SleepTimeoutSnapshot { SchemeGuid=scheme, ACSeconds=ac, DCSeconds=dc };
} finally { if (pointer != IntPtr.Zero) LocalFree(pointer); }
}
public static HibernateCapabilitySnapshot ReadHibernateCapabilities() {
SystemPowerCapabilities caps;
if (!GetPwrCapabilities(out caps)) throw new InvalidOperationException("GetPwrCapabilities failed");
return new HibernateCapabilitySnapshot {
HiberFilePresent=caps.HiberFilePresent != 0,
SystemS4=caps.SystemS4 != 0,
HiberFileType=caps.HiberFileType
};
}
}
}
'@
$powerKey='HKLM:\SYSTEM\CurrentControlSet\Control\Power'
function Get-IttripStringSha256([string]$Text){$algorithm=[Security.Cryptography.SHA256]::Create();try{([BitConverter]::ToString($algorithm.ComputeHash([Text.Encoding]::UTF8.GetBytes($Text)))).Replace('-','').ToLowerInvariant()}finally{$algorithm.Dispose()}}
function Invoke-IttripPowercfgAvailabilityRead {
$output=@(& powercfg.exe /a 2>&1);$exitCode=$LASTEXITCODE
if($exitCode -ne 0){throw ("powercfg /a に失敗しました: exit=$exitCode"+[Environment]::NewLine+($output-join [Environment]::NewLine))}
$text=$output-join [Environment]::NewLine
[pscustomobject]@{ExitCode=$exitCode;Text=$text;Sha256=Get-IttripStringSha256 $text}
}
function Resolve-IttripHibernateModeProof([string]$PowercfgProofToken,[bool]$HiberFilePresent,[bool]$SystemS4,[int]$HibernateEnabled,[int]$HiberFileSizePercent,[byte]$DiagnosticHiberFileType,[string]$PowercfgASha256){
if($PowercfgASha256 -notmatch '^[0-9a-f]{64}$'){throw 'powercfg /a transcript hashを証明できません。'}
$mode=switch($PowercfgProofToken){
'FULL-HIBERNATION-AVAILABLE' {
if(-not $HiberFilePresent -or -not $SystemS4 -or $HibernateEnabled -ne 1 -or -not($HiberFileSizePercent -eq 0 -or $HiberFileSizePercent -ge 40 -and $HiberFileSizePercent -le 100)){throw 'powercfg /aのFull判定とregistry/APIが矛盾しています。'}
'Full'
}
'REDUCED-FAST-STARTUP-ONLY' {
if(-not $HiberFilePresent -or -not $SystemS4 -or $HibernateEnabled -ne 1 -or $HiberFileSizePercent -ne 0){throw 'Reducedのdocumented defaultを完全復元できるregistry/API証明がありません。'}
'Reduced'
}
'DISABLED-NO-HIBERFILE' {
if($HiberFilePresent -or $HibernateEnabled -ne 0){throw 'powercfg /aのDisabled判定とregistry/APIが矛盾しています。'}
'Disabled'
}
default {throw 'powercfg /aからFull/Reduced/Disabledを証明できません。無変更で停止します。'}
}
[pscustomobject]@{Mode=$mode;ProofStatus='Proven';PowercfgProofToken=$PowercfgProofToken;PowercfgASha256=$PowercfgASha256;HiberFilePresent=$HiberFilePresent;SystemS4=$SystemS4;HibernateEnabled=$HibernateEnabled;HiberFileSizePercent=$HiberFileSizePercent;DiagnosticHiberFileType=$DiagnosticHiberFileType}
}
function Get-IttripHibernateSnapshot {
$availability=Invoke-IttripPowercfgAvailabilityRead
Write-Host '次のpowercfg /a実測だけを一次判定に使います。HiberFileType数値やhiberfil.sys可視性からmodeを推測しません。'
$availability.Text|Write-Host
$proofToken=Read-Host '休止状態が利用可能なら FULL-HIBERNATION-AVAILABLE、Fast Startupのみでhiberfile type理由なら REDUCED-FAST-STARTUP-ONLY、休止無効なら DISABLED-NO-HIBERFILE、不明なら UNKNOWN'
$caps=[Ittrip.Power.PowerPolicyReader]::ReadHibernateCapabilities()
$registry=Get-ItemProperty -LiteralPath $powerKey -ErrorAction Stop
if($registry.PSObject.Properties.Name -notcontains 'HibernateEnabled' -or $registry.PSObject.Properties.Name -notcontains 'HiberFileSizePercent'){throw 'enabled stateとsizeをregistryで証明できないため無変更で停止します。'}
Resolve-IttripHibernateModeProof -PowercfgProofToken $proofToken -HiberFilePresent ([bool]$caps.HiberFilePresent) -SystemS4 ([bool]$caps.SystemS4) -HibernateEnabled ([int]$registry.HibernateEnabled) -HiberFileSizePercent ([int]$registry.HiberFileSizePercent) -DiagnosticHiberFileType ([byte]$caps.HiberFileType) -PowercfgASha256 $availability.Sha256
}
$oldPower=[Ittrip.Power.PowerPolicyReader]::ReadTimeouts()
$oldHiber=Get-IttripHibernateSnapshot
if($oldHiber.ProofStatus -ne 'Proven'){throw '開始前hibernate modeを証明できません。rollbackを生成せず無変更で停止します。'}
[pscustomobject]@{SchemeGuid=$oldPower.SchemeGuid;ACSeconds=$oldPower.ACSeconds;DCSeconds=$oldPower.DCSeconds;HiberMode=$oldHiber.Mode;ModeProof=$oldHiber.PowercfgProofToken;PowercfgASha256=$oldHiber.PowercfgASha256;HiberFilePresent=$oldHiber.HiberFilePresent;SystemS4=$oldHiber.SystemS4;HibernateEnabled=$oldHiber.HibernateEnabled;HiberFileSizePercent=$oldHiber.HiberFileSizePercent;DiagnosticHiberFileType=$oldHiber.DiagnosticHiberFileType}
スリープと休止状態の利用可否はハードウェア、ファームウェア、ドライバー、ポリシーに依存する。powercfg /hibernate onだけで全機種に同じ電源状態が現れるわけではない。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。
休止状態を有効化する影響
休止状態を有効化する影響では、利用可能状態と現在プランを確認し、必要な休止有効化とAC側タイムアウトだけを承認値へ変更する。スリープと休止状態の設定の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。
$targetAcMinutes=30;$targetHiberMode='Full';$targetHiberSizePercent=50
$subSleepGuid='238C9FA8-0AAD-41ED-83F4-97BE242C8F20';$standbyIdleGuid='29F6C1DB-86DA-48C5-9FDB-F2B67B1F44DA'
function Test-IttripFullPowerState($LeftPower,$LeftHiber,$RightPower,$RightHiber){
$LeftPower.SchemeGuid -eq $RightPower.SchemeGuid -and $LeftPower.ACSeconds -eq $RightPower.ACSeconds -and $LeftPower.DCSeconds -eq $RightPower.DCSeconds -and
$LeftHiber.Mode -eq $RightHiber.Mode -and $LeftHiber.ProofStatus -eq 'Proven' -and $RightHiber.ProofStatus -eq 'Proven' -and
$LeftHiber.PowercfgProofToken -eq $RightHiber.PowercfgProofToken -and $LeftHiber.PowercfgASha256 -eq $RightHiber.PowercfgASha256 -and
$LeftHiber.HiberFilePresent -eq $RightHiber.HiberFilePresent -and $LeftHiber.SystemS4 -eq $RightHiber.SystemS4 -and
$LeftHiber.HibernateEnabled -eq $RightHiber.HibernateEnabled -and $LeftHiber.HiberFileSizePercent -eq $RightHiber.HiberFileSizePercent -and
$LeftHiber.DiagnosticHiberFileType -eq $RightHiber.DiagnosticHiberFileType
}
if($oldHiber.ProofStatus -ne 'Proven'){throw '開始前modeが未証明なのでrollbackを作れず、変更候補を表示しません。'}
$approvalToken="PREPARE-POWER SCHEME=$($oldPower.SchemeGuid) HIBER=$($oldHiber.Mode)/$($oldHiber.PowercfgASha256)/$($oldHiber.HiberFileSizePercent) AC=$($oldPower.ACSeconds) DC=$($oldPower.DCSeconds)"
if((Read-Host "手動変更候補を表示する場合は $approvalToken を入力") -ne $approvalToken){throw '中止しました。'}
$approvedPower=[Ittrip.Power.PowerPolicyReader]::ReadTimeouts();$approvedHiber=Get-IttripHibernateSnapshot
if(-not(Test-IttripFullPowerState $oldPower $oldHiber $approvedPower $approvedHiber)){throw '承認後のScheme/AC/DC/powercfg mode proof/registry/API完全状態が変わりました。'}
$manualChangePlan=@(
[pscustomobject]@{Order=1;ExecuteAutomatically=$false;Command='powercfg.exe /hibernate /type full';RequiredExitCode=0;StopOnNonZero=$true}
[pscustomobject]@{Order=2;ExecuteAutomatically=$false;Command="powercfg.exe /hibernate /size $targetHiberSizePercent";RequiredExitCode=0;StopOnNonZero=$true}
[pscustomobject]@{Order=3;ExecuteAutomatically=$false;Command="powercfg.exe /change standby-timeout-ac $targetAcMinutes";RequiredExitCode=0;StopOnNonZero=$true}
)
$manualChangePlan|Format-Table -AutoSize
Write-Warning 'このブロックは状態を変更しません。1行ずつ手動実行し、各行直後のLASTEXITCODEが0でなければ停止します。完了後は次のblockでpowercfg /a一次判定、registry/API、AC/DCを再検証します。'
サーバー、遠隔端末、暗号化処理中にスリープ試験しない。ACとDC値を取り違えない。スリープと休止状態の設定でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。
standby-timeout-acを限定変更
standby-timeout-acを限定変更では同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、powercfg /aとqueryが期待値となり、業務アプリを閉じた試験端末で復帰とネットワーク再接続を確認できるかどうかです。
function Get-IttripHibernateRestoreRows($Baseline){
if($Baseline.ProofStatus -ne 'Proven'){throw '開始前modeが未証明なのでhibernate rollbackを生成しません。'}
switch([string]$Baseline.Mode){
'Disabled' {@([pscustomobject]@{Purpose='RestoreDisabled';ManualCommand='powercfg.exe /hibernate off';RequiredExitCode=0;StopOnNonZero=$true})}
'Reduced' {
if([int]$Baseline.HiberFileSizePercent -ne 0){throw 'Reduced default sizeを証明できずrollbackを生成しません。'}
@(
[pscustomobject]@{Purpose='RestoreReducedDefaultSize';ManualCommand='powercfg.exe /hibernate /size 0';RequiredExitCode=0;StopOnNonZero=$true}
[pscustomobject]@{Purpose='RestoreReducedType';ManualCommand='powercfg.exe /hibernate /type reduced';RequiredExitCode=0;StopOnNonZero=$true}
)
}
'Full' {
@(
[pscustomobject]@{Purpose='RestoreFullType';ManualCommand='powercfg.exe /hibernate /type full';RequiredExitCode=0;StopOnNonZero=$true}
[pscustomobject]@{Purpose='RestoreFullSize';ManualCommand="powercfg.exe /hibernate /size $([int]$Baseline.HiberFileSizePercent)";RequiredExitCode=0;StopOnNonZero=$true}
)
}
default {throw '未証明modeなのでhibernate rollbackを生成しません。'}
}
}
function Get-IttripManualPowerRestorePlan {
if($oldHiber.ProofStatus -ne 'Proven'){throw '開始前modeが未証明なのでrollbackを生成しません。'}
$rows=[Collections.Generic.List[object]]::new();$order=0
$rows.Add([pscustomobject]@{Order=++$order;Purpose='RestoreAC';ManualCommand="powercfg.exe /setacvalueindex $($oldPower.SchemeGuid) $subSleepGuid $standbyIdleGuid $($oldPower.ACSeconds)";RequiredExitCode=0;StopOnNonZero=$true})
$rows.Add([pscustomobject]@{Order=++$order;Purpose='RestoreDC';ManualCommand="powercfg.exe /setdcvalueindex $($oldPower.SchemeGuid) $subSleepGuid $standbyIdleGuid $($oldPower.DCSeconds)";RequiredExitCode=0;StopOnNonZero=$true})
$rows.Add([pscustomobject]@{Order=++$order;Purpose='ActivateScheme';ManualCommand="powercfg.exe /setactive $($oldPower.SchemeGuid)";RequiredExitCode=0;StopOnNonZero=$true})
foreach($row in @(Get-IttripHibernateRestoreRows $oldHiber)){$rows.Add([pscustomobject]@{Order=++$order;Purpose=$row.Purpose;ManualCommand=$row.ManualCommand;RequiredExitCode=0;StopOnNonZero=$true})}
@($rows)
}
Read-Host '手動変更後、Enterで完全target stateを再取得します'
$afterPower=[Ittrip.Power.PowerPolicyReader]::ReadTimeouts();$afterHiber=Get-IttripHibernateSnapshot;$targetAcSeconds=[uint32]($targetAcMinutes*60)
$targetExact=$afterPower.SchemeGuid -eq $oldPower.SchemeGuid -and $afterPower.ACSeconds -eq $targetAcSeconds -and $afterPower.DCSeconds -eq $oldPower.DCSeconds -and
$afterHiber.ProofStatus -eq 'Proven' -and $afterHiber.Mode -eq 'Full' -and $afterHiber.PowercfgProofToken -eq 'FULL-HIBERNATION-AVAILABLE' -and
$afterHiber.HiberFilePresent -and $afterHiber.SystemS4 -and $afterHiber.HibernateEnabled -eq 1 -and $afterHiber.HiberFileSizePercent -eq $targetHiberSizePercent
[pscustomobject]@{SchemeGuid=$afterPower.SchemeGuid;ACSeconds=$afterPower.ACSeconds;DCSeconds=$afterPower.DCSeconds;HiberMode=$afterHiber.Mode;ModeProof=$afterHiber.PowercfgProofToken;PowercfgASha256=$afterHiber.PowercfgASha256;HiberFilePresent=$afterHiber.HiberFilePresent;SystemS4=$afterHiber.SystemS4;HibernateEnabled=$afterHiber.HibernateEnabled;HiberFileSizePercent=$afterHiber.HiberFileSizePercent;DiagnosticHiberFileType=$afterHiber.DiagnosticHiberFileType;ExactTarget=$targetExact}
if(-not $targetExact){Get-IttripManualPowerRestorePlan|Format-Table -AutoSize;throw 'Scheme/AC/DC/Full powercfg proof/registry/API target条件が未達です。各rowを順に手動実行し、毎回exit 0を確認後に再読します。'}
$restoreToken="PREPARE-RESTORE-POWER CURRENT=$($afterPower.SchemeGuid)/$($afterPower.ACSeconds)/$($afterPower.DCSeconds)/$($afterHiber.Mode)/$($afterHiber.PowercfgASha256)/$($afterHiber.HiberFileSizePercent)"
if((Read-Host "手動復元候補を表示する場合だけ $restoreToken を入力。不要ならEnter") -eq $restoreToken){
$restoreRebindPower=[Ittrip.Power.PowerPolicyReader]::ReadTimeouts();$restoreRebindHiber=Get-IttripHibernateSnapshot
if(-not(Test-IttripFullPowerState $afterPower $afterHiber $restoreRebindPower $restoreRebindHiber)){throw '復元承認後にScheme/AC/DC/powercfg mode proof/registry/API完全状態が変わりました。'}
Get-IttripManualPowerRestorePlan|Format-Table -AutoSize
Read-Host '各rowを順に手動実行し、各行直後のLASTEXITCODE=0を記録した後、Enterで最終再読します'
$restoredPower=[Ittrip.Power.PowerPolicyReader]::ReadTimeouts();$restoredHiber=Get-IttripHibernateSnapshot
if(-not(Test-IttripFullPowerState $oldPower $oldHiber $restoredPower $restoredHiber)){throw '手動復元後のpowercfg /a一次判定、registry/API、Scheme/AC/DC完全状態が開始前と一致しません。'}
[pscustomobject]@{RestoredExactFullState=$true;Power=$restoredPower;Hibernate=$restoredHiber}
}
休止状態が利用不可なら理由表示、ファームウェア、ポリシー、ディスク空き容量を確認し、無理に設定を繰り返さない。スリープと休止状態の設定の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。
Modern Standby機種での違い
サーバー、遠隔端末、暗号化処理中にスリープ試験しない。ACとDC値を取り違えない。Modern Standby機種での違いに該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。
休止状態が利用不可なら理由表示、ファームウェア、ポリシー、ディスク空き容量を確認し、無理に設定を繰り返さない。スリープと休止状態の設定ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。
powercfg /aで証明した旧modeへ戻す
保存したタイムアウトと休止状態の旧値へ戻し、setactive後にqueryと実機復帰を確認する。復旧操作にも同じ識別条件を使い、名前が似た別対象へ戻し処理を適用しません。
- スリープと休止状態の設定の変更前値と取得時刻
- 復旧対象: powercfg /aの利用可能状態、アクティブScheme GUID、AC/DCのタイムアウト、hibernateの旧状態を保存する
- 復旧後の判定: powercfg /aとqueryが期待値となり、業務アプリを閉じた試験端末で復帰とネットワーク再接続を確認できる
- 再実行を止める条件: サーバー、遠隔端末、暗号化処理中にスリープ試験しない。ACとDC値を取り違えない
再起動後のpowercfg確認
機種ごとに利用可能状態が異なるため、同じ設定値を全端末の成功条件にしない。スリープと休止状態の設定を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。
| 再起動後のpowercfg確認の識別軸 | powercfg /aの利用可能状態、アクティブScheme GUID、AC/DCのタイムアウト、hibernateの旧状態を保存する |
| 採用する実測 | powercfg /aとqueryが期待値となり、業務アプリを閉じた試験端末で復帰とネットワーク再接続を確認できる |
| 0件時の扱い | 休止状態が利用不可なら理由表示、ファームウェア、ポリシー、ディスク空き容量を確認し、無理に設定を繰り返さない |
| 保留にする兆候 | サーバー、遠隔端末、暗号化処理中にスリープ試験しない。ACとDC値を取り違えない |
スリープと休止状態の設定の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「powercfg /aの利用可能状態、アクティブScheme GUID、AC/DCのタイムアウト、hibernateの旧状態を保存する」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。
PowerShellでシステムのスリープ・ハイバネート設定をカスタマイズする方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「powercfg /aとqueryが期待値となり、業務アプリを閉じた試験端末で復帰とネットワーク再接続を確認できる」、判定不能時は「休止状態が利用不可なら理由表示、ファームウェア、ポリシー、ディスク空き容量を確認し、無理に設定を繰り返さない」、中止時は「サーバー、遠隔端末、暗号化処理中にスリープ試験しない。ACとDC値を取り違えない」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。
修正後コードの合格条件:powercfgのローカライズ表示を文字列解析せず、PowrProf APIでアクティブSchemeのAC/DC待機秒を取得します。旧休止ファイル有無とAC/DC秒数を保持し、HIBERNATE/AC分を含むトークン後に変更、読戻しが違えば正確な旧秒数と旧休止状態へ戻します。
再修正後はhiberfil.sysの有無やHiberFileTypeの数値だけでmodeを判断しません。powercfg /aの実測とtranscript SHA-256を一次証拠にし、HiberFilePresent、SystemS4、HibernateEnabled、HiberFileSizePercentは矛盾検出と復元照合に使います。modeを証明できない場合は変更もrollback生成も行いません。
安全版 r4b-20260719:HiberFileTypeの数値対応をmode分類の根拠にしません。powercfg /aの成功した実測を一次証拠として保存し、registry/APIと矛盾する場合はfail closedで停止します。powercfgによる自動変更・自動rollbackは行いません。
独立監査追補 r4b-r5-20260719:Scheme不変、AC=1800、DC不変に加え、Fullはpowercfg /aの利用可能実測、HiberFilePresent、SystemS4、HibernateEnabled、size=50の整合で証明します。HiberFileTypeは診断値として記録するだけです。復元は1 row 1 command・exit code 0必須とし、Reducedはsize 0を先に復元してからtypeを戻します。
独立監査追補 final-r2-seq003-040-049-20260719:hibernate modeはpowercfg /aの実測を一次証拠とし、registry/APIとの整合が取れたFull・Reduced・Disabledだけを開始前modeとして採用します。HiberFileTypeの数値やhiberfil.sysの可視性からNoneを推測せず、未証明・矛盾時は変更もrollback生成も行いません。Reduced復元はsize 0、type reducedの順に各exit 0と最終再読を要求します。
公式情報・参考資料
スリープと休止状態の設定で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

コメント