レジストリを介してWindows Creators Update Night Lightを構成する


13

Windows 10(Pro)Creators Updateの新しい夜間照明機能は、レジストリを使用してどのように構成できますか?

選択した構成管理ツール(Chef)を使用するときに、新規/更新されたインストールを自動構成したいのですが。Sysinternals Process Monitorによるシステム検査では、バイナリDataキーがの深部で更新されていることが示されていますがHKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current、これは大きなREG_BINARY BLOBであり、あまり役に立ちません。

さまざまなレジストリ、PowerShell、または自動化に適した、Night Light機能を構成する方法を支援していただければ幸いです。


RegfromAppを使用して、より適切にトレースします。.regファイルを生成します。多分それはそれを解読することができます
magicandre1981

提案@ magicandre198をありがとう。Process Monitorを使用すると、変更される正確なキーと値がわかります。問題は、キーがバイナリキーであり、そのデータキーの構築方法に関する利用可能なデコードドキュメントがないことです。問題のファンキーなパスを考えると、これは直接変更を意図したセクションではない可能性があります(おそらくキャッシュされた設定の場所)。これまで多くの情報がないように思われるので、誰かが新しい夜間照明機能の管理について意見を述べることを望んでいます。
David F. Severski 2017

私が言ったように、Regfromappを使用すると、すべての変更に対して.regファイルが生成されます。
magicandre1981

1
ここでは多目的で話しているかもしれません。:)私はキーと調整されているキーの内容を知っています。ドキュメントがない、扱いにくいブロブです。私はgithub.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLightを見つけましたこれは、機能にPSインターフェイスを提供するために少しハッキングを行いますが、さまざまな設定を組み合わせる方法は明確ではありません。このバイナリ文字列をどのように組み合わせるかに関するドキュメント(およびインターフェイス)を本当に探しています。
David F. Severski 2017

回答:


12

たくさんの実験を重ねて、多かれ少なかれそのレジストリ値のフォーマットを解決することができました(詳細については以下を参照してください)。

次のPowerShellスクリプトを作成しました。

Function Set-BlueLightReductionSettings {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$StartHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$StartMinutes,
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$EndHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$EndMinutes,
        [Parameter(Mandatory=$true)] [bool]$Enabled,
        [Parameter(Mandatory=$true)] [ValidateRange(1200, 6500)] [int]$NightColorTemperature
    )
    $data = (2, 0, 0, 0)
    $data += [BitConverter]::GetBytes((Get-Date).ToFileTime())
    $data += (0, 0, 0, 0, 0x43, 0x42, 1, 0)
    If ($Enabled) {$data += (2, 1)}
    $data += (0xCA, 0x14, 0x0E)
    $data += $StartHour
    $data += 0x2E
    $data += $StartMinutes
    $data += (0, 0xCA, 0x1E, 0x0E)
    $data += $EndHour
    $data += 0x2E
    $data += $EndMinutes
    $data += (0, 0xCF, 0x28)
    $tempHi = [Math]::Floor($NightColorTemperature / 64)
    $tempLo = (($NightColorTemperature - ($tempHi * 64)) * 2) + 128
    $data += ($tempLo, $tempHi)
    $data += (0xCA, 0x32, 0, 0xCA, 0x3C, 0, 0)
    Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current' -Name 'Data' -Value ([byte[]]$data) -Type Binary
}

これを使用するには、.ps1ファイルとして保存し、PowerShellタグWikiスクリプトの有効化」セクションの指示に従います。次に、ドットソーシングによってスクリプトのコンテンツをインポートできます。

. ./bluelightmanagement.ps1

次に、それが提供するコマンドレットのような関数を使用します。

Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000

結果

コマンドを実行したときに青色光削減ページが開いている場合、設定アプリはすべて(カラースライダーを除く)を即座に更新します。

フォーマット

  • 4つの定数バイト-すべてのCloudStore値に共通の署名のようです
  • 64ビットFILETIME値としての設定の最終変更時刻(8バイト、リトルエンディアン)
  • さらに8つの定数バイト
  • 青色光低減機能が有効になっている場合はバイト21無効になっている場合はそのまま
  • さらに3バイトの定数バイト
  • 開始時刻の時間(1バイト)
  • 1つの定数バイト
  • 開始時間の分(1バイト)
  • 4つの定数バイト
  • 終了時刻の時間(1バイト)
  • 1つの定数バイト
  • 終了時刻の分(1バイト)
  • 3つの定数バイト
  • 奇妙なバイナリ演算後のケルビンの夜間の色温度(2バイト)
  • 7定数バイト

色温度は、リトルエンディアンの2バイトとして格納されます。高値の1は、温度を64で除算した結果の整数部分です。低値のバイトは、2を乗算した後、128に加算されます。バイトから温度を計算するには、高バイトを64で乗算しますそして、下位バイトと128の差を2で割ったときに得られるものを追加します。


常夜灯のオンとオフだけを切り替えるスクリプトを作成しようとしています。私が間違っていない場合、バイト20と21は機能がオンになっているかどうかを示すはずです(少なくとも4 + 8 + 8 = 20以降の説明によると)が、regeditを使用してレジストリエントリを見るときは、バイト21の変更を参照してください。その点については、まったく変更がありません。regeditウィンドウをF5で更新し、UIから常夜灯機能を切り替えた後でウィンドウを再度開いたことを確認しました。何が起こっているのかわかりますか?
Gaboik1 2018年

1
また、NirSoft nirsoft.net/articles/find_modified_time_registry_key.htmlからこのユーティリティを使用して、指定したレジストリキーが常夜灯機能をアクティブ化および非アクティブ化するときにまったく変更されないこともわかりました。おそらく、Microsoftは前回のアップデートでそれを変更したのでしょうか?
Gaboik1

1
@ Gaboik1このレジストリ値は、レイアウトが大幅に変更されるという点で奇妙なものです。私が説明した形式は機能するものの1つであり、必ずしも唯一のものではありません。この値からデータを一貫して読み取る方法がわかりませんが、Windows 10 1709でテストし、このスクリプトを使用して設定を行っても機能します。
Ben N

これを.netに書き込んで、実際にスケジュールを使用していることがわかりました(コードに対して、sunrise / sunsetのように見える)。CA14 0Eの直前にバイト0xC2,0x0A、0x00を追加する必要がありました。次に、トリガーして時間ベースに設定します。そうでなければそれは働いた。1709年
Mgamerz、2018

@Mgamerzこれが正しいことを確認でき、1809年に機能します。回答を編集しました。
変態

2

数時間の実験と
出来上がり:Win10 1903で夜間照明をオン/オフにする方法

レジストリキーは次のとおりです

HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.bluelightreductionstate\windows.data.bluelightreduction.bluelightreductionstate\

値の名前:データ

常夜灯を有効にするには

  1. 24と25のインデックスのデータにそれぞれバイト「10」と「00」を追加して、すべてのデータ長が増加するようにします(既存の値を変更せず、2バイト追加するだけです)。
  2. 11または12インデックスの値を1ずつインクリメントします(たとえば、現在の値がFF 01の場合は、それぞれ00 02である必要があります)実際にはここにいるようで、8バイトでリトルエンディアン形式で書き込まれているため、必要になります。正確にしたい場合は、13、14、15、16、17、18インデックスも使用できます。

常夜灯を無効にするには

  1. 24インデックスと25インデックスのデータからそれぞれバイト「10」と「00」を削除して、すべてのデータ長を減らします。
  2. 11または12インデックスの値を1ずつインクリメントします(たとえば、現在の値がFF 01の場合は、それぞれ00 02にする必要があります)。

私は自分のプログラムの夜間照明をオン/オフにするだけでよいので、残念ながら他のすべてのオプションはまだ調査が必要です。しかし、他のすべての微調整(温度やスケジュールの変更など)の重要なオプションは、時間を適切に増分することです。これらのmodは、隣接するレジストリキーwindows.data.bluelightreduction.settingsの別のデータ値で実行する必要があります。


たまたま、これを有効または無効にするスクリプトがありますか?
変態

番号。Cで小さなプログラムを書いた
hgrev

リンクを投稿していただければ、(少なくとも私にとっては)なお有用です。私はC / C ++で働いています
変態

コードまたはexeファイルが必要ですか?
hgrev

私が大丈夫か。:_)
変態
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.