10

Как настроить новую функцию 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 , но это большой объект REG_BINARY и не очень полезно.

Помощь в другом реестре, PowerShell или другом дружественном для автоматизации способе настройки функции Night Light была бы очень полезна!

1 ответ1

9

Проведя кучу экспериментов, мне удалось более или менее определить формат значения реестра (подробности см. Ниже).

Я сделал этот скрипт 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .