PowerShellを使ってシステムのブライトネスレベルを確認・制御する方法

PowerShellを使ってシステムのブライトネスレベルを確認・制御する方法という問いには、Activeな全Brightnessインスタンスを列挙し、対応Methodsへパネル別の目標値を実際に設定するという方法で答えます。WmiMonitorBrightnessは値、WmiMonitorBrightnessMethodsはWmiSetBrightness操作を提供する。複数インスタンスでは配列位置で結び付けずInstanceNameを使う。この記事ではWmiMonitorBrightness.InstanceNameをキーにCurrentBrightness、Levels、対応するMethodsオブジェクトを一対一で結ぶを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。

一つの画面をその場で変えるseq5ではなく、複数の内蔵パネルを個別に管理する実装を示す。完了は「対象とした各InstanceNameのCurrentBrightnessがそのパネルの目標値となり、未対応外部画面を操作していない」と定義します。対象が取れない場合は「BrightnessまたはMethodsの対応先がないパネルはunsupportedとして除外し、全体成功へ数えない」として切り分け、推測で成功扱いにしません。

目次

BrightnessとMethodsをInstanceNameで結合

BrightnessとMethodsをInstanceNameで結合では、複数内蔵パネルの輝度取得と制御の対象を「WmiMonitorBrightness.InstanceNameをキーにCurrentBrightness、Levels、対応するMethodsオブジェクトを一対一で結ぶ」という単位で扱います。WmiMonitorBrightnessは値、WmiMonitorBrightnessMethodsはWmiSetBrightness操作を提供する。複数インスタンスでは配列位置で結び付けずInstanceNameを使う。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。

複数内蔵パネルの輝度取得と制御を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。

Activeな全内蔵パネルを棚卸し

Activeな全Brightnessインスタンスを列挙し、対応Methodsへパネル別の目標値を実際に設定する。複数内蔵パネルの輝度取得と制御ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。一つの画面をその場で変えるseq5ではなく、複数の内蔵パネルを個別に管理する実装を示す。

Activeな全内蔵パネルを棚卸しの合格条件は、対象とした各InstanceNameのCurrentBrightnessがそのパネルの目標値となり、未対応外部画面を操作していないことです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。

パネル別の対応Levelsを読む

パネル別の対応Levelsを読むは変更前の基準点です。WmiMonitorBrightness.InstanceNameをキーにCurrentBrightness、Levels、対応するMethodsオブジェクトを一対一で結ぶを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。

$brightness = @(Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightness |
  Where-Object Active)
$methods = @(Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightnessMethods |
  Where-Object Active)
if ($brightness.Count -eq 0) { throw 'Activeな内蔵Brightnessインスタンスがありません。' }
$brightness | Select-Object InstanceName, CurrentBrightness, Levels

WmiMonitorBrightnessは値、WmiMonitorBrightnessMethodsはWmiSetBrightness操作を提供する。複数インスタンスでは配列位置で結び付けずInstanceNameを使う。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。

目標値を各パネルへ割り当て

目標値を各パネルへ割り当てでは同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、対象とした各InstanceNameのCurrentBrightnessがそのパネルの目標値となり、未対応外部画面を操作していないかどうかです。

$targetByInstance = @{
  'DISPLAY\CMN14D4\4&1234567&0&UID265988_0' = 55
  'DISPLAY\LGD06A8\4&7654321&0&UID265989_0' = 65
}
$plan = @(foreach ($instanceName in $targetByInstance.Keys) {
  $panel = @($brightness | Where-Object InstanceName -eq $instanceName)
  $method = @($methods | Where-Object InstanceName -eq $instanceName)
  if ($panel.Count -ne 1 -or $method.Count -ne 1) {
    throw "BrightnessとMethodsを一対一にできません: $instanceName"
  }
  $target = [byte]$targetByInstance[$instanceName]
  if ($target -notin $panel[0].Levels) { throw "Levelsにない目標値です: $instanceName=$target" }
  [pscustomobject]@{
    InstanceName=$instanceName; Old=[byte]$panel[0].CurrentBrightness
    Target=$target; Method=$method[0]
  }
})
if ($plan.Count -ne $targetByInstance.Count) { throw '対象マップを全件計画できません。' }
$plan | Select-Object InstanceName, Old, Target | Format-Table

BrightnessまたはMethodsの対応先がないパネルはunsupportedとして除外し、全体成功へ数えない。複数内蔵パネルの輝度取得と制御の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。

WmiSetBrightnessを実際に実行

WmiSetBrightnessを実際に実行では、Activeな全Brightnessインスタンスを列挙し、対応Methodsへパネル別の目標値を実際に設定する。複数内蔵パネルの輝度取得と制御の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。

$approvalToken = 'BRIGHTNESS ' + (($plan | Sort-Object InstanceName |
  ForEach-Object { "$($_.InstanceName)=$($_.Target)" }) -join ';')
if ((Read-Host "変更する場合は次を入力: $approvalToken") -ne $approvalToken) {
  throw '輝度変更は承認されませんでした。'
}
$changed = [Collections.Generic.List[object]]::new()
try {
  foreach ($row in $plan) {
    # 呼出しが適用後に例外を返す場合も復元対象から漏らさない。
    $changed.Add($row)
    $result = Invoke-CimMethod -InputObject $row.Method -MethodName WmiSetBrightness -Arguments @{ Timeout=1; Brightness=$row.Target } -ErrorAction Stop
    if ($null -ne $result.ReturnValue -and $result.ReturnValue -ne 0) {
      throw "WmiSetBrightness failed: $($row.InstanceName) ReturnValue=$($result.ReturnValue)"
    }
  }
  Start-Sleep -Milliseconds 500
  $after = @(Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightness | Where-Object Active)
  $verification = @($plan | ForEach-Object {
    $observed = @($after | Where-Object InstanceName -eq $_.InstanceName)
    [pscustomobject]@{
      InstanceName=$_.InstanceName; Expected=$_.Target
      Actual=if ($observed.Count -eq 1) { [byte]$observed[0].CurrentBrightness } else { $null }
      Match=($observed.Count -eq 1 -and [byte]$observed[0].CurrentBrightness -eq $_.Target)
    }
  })
  if (@($verification | Where-Object { -not $_.Match }).Count) {
    throw '変更後の全InstanceName照合に失敗しました。'
  }
} catch {
  $rollbackRows = @($changed)
  [array]::Reverse($rollbackRows)
  foreach ($row in $rollbackRows) {
    Invoke-CimMethod -InputObject $row.Method -MethodName WmiSetBrightness -Arguments @{ Timeout=1; Brightness=$row.Old } -ErrorAction Continue | Out-Null
  }
  Start-Sleep -Milliseconds 500
  $restoredPanels = @(Get-CimInstance -Namespace root/WMI -ClassName WmiMonitorBrightness |
    Where-Object Active)
  $rollbackFailed = @($rollbackRows | Where-Object {
    $row = $_
    $observed = @($restoredPanels | Where-Object InstanceName -eq $row.InstanceName)
    $observed.Count -ne 1 -or [byte]$observed[0].CurrentBrightness -ne $row.Old
  })
  if ($rollbackFailed.Count) { throw '輝度の復元後再読取に失敗しました。' }
  throw
}
$verification

同じ値を全Methodsへ盲目的に流さない。自動輝度、電源ポリシー、OEM制御が値を戻す場合は競合を解消する。複数内蔵パネルの輝度取得と制御でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。

全InstanceNameを再取得して照合

パネル別に保存した旧CurrentBrightnessを同じInstanceNameへ戻し、全件を再取得する。復旧操作にも同じ識別条件を使い、名前が似た別対象へ戻し処理を適用しません。

  • 複数内蔵パネルの輝度取得と制御の変更前値と取得時刻
  • 復旧対象: WmiMonitorBrightness.InstanceNameをキーにCurrentBrightness、Levels、対応するMethodsオブジェクトを一対一で結ぶ
  • 復旧後の判定: 対象とした各InstanceNameのCurrentBrightnessがそのパネルの目標値となり、未対応外部画面を操作していない
  • 再実行を止める条件: 同じ値を全Methodsへ盲目的に流さない。自動輝度、電源ポリシー、OEM制御が値を戻す場合は競合を解消する

外部DDC/CIモニターを除外

同じ値を全Methodsへ盲目的に流さない。自動輝度、電源ポリシー、OEM制御が値を戻す場合は競合を解消する。外部DDC/CIモニターを除外に該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。

BrightnessまたはMethodsの対応先がないパネルはunsupportedとして除外し、全体成功へ数えない。複数内蔵パネルの輝度取得と制御ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。

ポリシー制御との競合を記録

seq5の一台調整と違い、ここでは全内蔵インスタンスの対応関係、個別目標、失敗件数を運用記録にする。複数内蔵パネルの輝度取得と制御を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。

ポリシー制御との競合を記録の識別軸WmiMonitorBrightness.InstanceNameをキーにCurrentBrightness、Levels、対応するMethodsオブジェクトを一対一で結ぶ
採用する実測対象とした各InstanceNameのCurrentBrightnessがそのパネルの目標値となり、未対応外部画面を操作していない
0件時の扱いBrightnessまたはMethodsの対応先がないパネルはunsupportedとして除外し、全体成功へ数えない
保留にする兆候同じ値を全Methodsへ盲目的に流さない。自動輝度、電源ポリシー、OEM制御が値を戻す場合は競合を解消する

複数内蔵パネルの輝度取得と制御の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「WmiMonitorBrightness.InstanceNameをキーにCurrentBrightness、Levels、対応するMethodsオブジェクトを一対一で結ぶ」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。

PowerShellを使ってシステムのブライトネスレベルを確認・制御する方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「対象とした各InstanceNameのCurrentBrightnessがそのパネルの目標値となり、未対応外部画面を操作していない」、判定不能時は「BrightnessまたはMethodsの対応先がないパネルはunsupportedとして除外し、全体成功へ数えない」、中止時は「同じ値を全Methodsへ盲目的に流さない。自動輝度、電源ポリシー、OEM制御が値を戻す場合は競合を解消する」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。

修正後コードの合格条件:対象マップの全InstanceNameがActiveなBrightnessとMethodsへ一対一で結び付き、目標値がLevelsに含まれる場合だけ計画を作ります。旧値を保持して明示承認後に変更し、全件再取得で一件でも違えば変更済みパネルを逆順に旧輝度へ戻します。

公式情報・参考資料

複数内蔵パネルの輝度取得と制御で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次