Настроить обновление для создателей Windows Night Light через реестр
Как настроить новую функцию Night Light в Windows 10 (Pro) Creators Update через реестр?
Я хотел бы автоматически настраивать новые / обновленные установки при использовании моего инструмента управления конфигурацией (Chef). Проверка системы через Sysinternals Process Monitor показывает двоичный файл Data
ключ обновляется глубоко в HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current
, но это большой BLOB-объект REG_BINARY и не очень полезный.
Помощь в другом реестре, PowerShell или другом дружественном для автоматизации способе настройки функции Night Light была бы очень полезна!
4 ответа
Проведя кучу экспериментов, мне удалось более или менее определить формат этого значения реестра (подробности см. Ниже).
Я сделал этот скрипт 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. Затем вы можете импортировать содержимое скрипта с помощью точечного поиска:
. ./bluelightmanagement.ps1
А затем используйте функцию, похожую на командлет, которую она предоставляет:
Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000
Приложение "Настройки" даже сразу обновляет все (кроме ползунка цвета), если при запуске команды открыта страница уменьшения синего света.
Формат
- 4 постоянных байта - казалось бы, общая для всех подпись
CloudStore
ценности - Время последнего изменения параметра как 64-разрядного
FILETIME
значение (8 байтов, младший порядок) - Еще 8 постоянных байтов
- Байты
2
затем1
если функция уменьшения синего света включена, просто пропала, если она отключена - Еще 3 постоянных байта
- Время начала часа (1 байт)
- 1 постоянный байт
- Время начала минуты (1 байт)
- 4 постоянных байта
- Час окончания времени (1 байт)
- 1 постоянный байт
- Минуты времени окончания (1 байт)
- 3 постоянных байта
- Ночная цветовая температура в Кельвинах после некоторой странной двоичной математики (2 байта)
- 7 постоянных байтов
Цветовая температура хранится в виде двух байтов с прямым порядком байтов. Старшее значение - это целая часть результата деления температуры на 64. Байт младшего значения - это остаток, умноженный на два, затем добавленный к 128. Чтобы вычислить температуру из байтов, умножьте старший байт на 64. и добавьте то, что вы получите, когда разделите на два разницу между младшим байтом и 128.
Для тех, кто все еще ищет это в 2023 году, я смог выяснить формат, используемый в значении ключа реестра в Windows 11. Для моих целей я хотел включать/выключать его из командной строки. Для этого мне удалось написать сценарий Node.js:
class Nightlight {
// ...
async toggle(): Promise<void> {
let newData: number[]
const enabled = await this.enabled()
const rawData = await this.getData()
const data = hexToBytes(rawData.value)
if (enabled) {
newData = new Array(41).fill(0)
newData.splice(0, 22, ...data.slice(0, 22))
newData.splice(23, 43 - 25, ...data.slice(25, 43))
newData[18] = 0x13
} else {
newData = new Array(43).fill(0)
newData.splice(0, 22, ...data.slice(0, 22))
newData.splice(25, 41 - 23, ...data.slice(23, 41))
newData[18] = 0x15
newData[23] = 0x10
newData[24] = 0x00
}
for (let i = 10; i < 15; i++) {
if (newData[i] !== 0xff) {
newData[i]++
break
}
}
}
Репо находится здесь: https://github.com/nathanbabcock/nightlight-cli .
Чтобы уточнить, разница между этим и принятым ответом заключается в том, что верхний ответ предназначен для изменения настройки «ночника по расписанию», хотя это ручное включение/выключение.
Несколько часов экспериментов и вуаля:
Как включить / выключить Night Light в Win10 1903
Ключ реестра:
HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.bluelightreductionstate\windows.data.bluelightreduction.bluelightreductionstate\
Имя значения: данные
Чтобы включить Night Light:
- Добавьте байты "10" и "00" к данным по 24 и 25 индексам соответственно, чтобы увеличить всю длину данных (не меняйте существующие значения, просто добавьте еще два байта)
- Увеличьте значение в 11 или 12 индексах на 1 (например: если это был FF 01, то теперь он должен быть 00 02 соответственно). На самом деле, кажется, пришло время, и он записан в 8 байтах в формате с прямым порядком байтов, поэтому вам понадобится также 13, 14, 15, 16, 17 и 18 индексов, если вы хотите сделать это точно.
Чтобы отключить Night Light:
- Удалите байты "10" и "00" из данных по 24 и 25 индексам соответственно, чтобы вся длина данных уменьшалась
- Увеличьте значение в 11 или 12 индексах на 1 (например: если это был FF 01, то теперь он должен быть 00 02 соответственно)
Мне нужно было только включить / выключить Night Light для моей программы, так что, к сожалению, все остальные варианты еще нуждаются в исследовании. Но, похоже, что ключевым параметром для всех других настроек (таких как изменение температуры и графика) является правильное увеличение времени. Эти моды нужно сделать в другом значении Data в соседнем ключе реестра windows.data.bluelightreduction.settings.
Обновление для Windows 10 2004.
Создан в основном для установки времени с точностью до минут. 19:57 — это три минуты до «Тагешау» в Германии.
Как использовать: отредактируйте этот прокомментированный файл реестра, указав время начала и окончания. Активируйте ночник в панели управления, так как не знаю, хватит ли этого рег-файла. Импортируйте его. Вы можете изменить силу на панели управления. Если вы не измените настройку времени, она будет придерживаться установленных вами значений, показывая ее как «активировано до 06:57» на панели управления на главном дисплее.
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings]
; 4 bytes whatever, CloudStore Signature ?
"Data"=hex:43,42,01,00,\
; Might still be 64 Bit filetime, last time the setting was changed in the control panel
0a,02,01,00,2a,06,c1,98,\
; 11 bytes whatever
99,fb,05,2a,2b,0e,1f,43,42,01,00,\
; Acivated flag. It is is missing (i.e. ce,14, is here) is is off!
02,01,\
; 3 bytes whatever
ca,14,0e,\
; Starting Hour, 0x13 = 19
13,\
; A constant
2e,\
; Starting Minute, 0x39 = 57
39,\
; 4 bytes whatever
00,ca,1e,0e,\
; Ending Hour, 0x06 = 6 Uhr
06,\
; A constant
2e,\
; Ending Minute
39,\
; 3 bytes constant
00,cf,28,\
; Strength, here "33".
9e,4a,\
; 10 bytes whatever (why so many trailing zeroes?)
ca,32,00,ca,3c,00,00,00,00,00