Настроить обновление для создателей 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:

  1. Добавьте байты "10" и "00" к данным по 24 и 25 индексам соответственно, чтобы увеличить всю длину данных (не меняйте существующие значения, просто добавьте еще два байта)
  2. Увеличьте значение в 11 или 12 индексах на 1 (например: если это был FF 01, то теперь он должен быть 00 02 соответственно). На самом деле, кажется, пришло время, и он записан в 8 байтах в формате с прямым порядком байтов, поэтому вам понадобится также 13, 14, 15, 16, 17 и 18 индексов, если вы хотите сделать это точно.

Чтобы отключить Night Light:

  1. Удалите байты "10" и "00" из данных по 24 и 25 индексам соответственно, чтобы вся длина данных уменьшалась
  2. Увеличьте значение в 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
Другие вопросы по тегам