Настроить обновление для создателей Windows Night Light через реестр

13

Как настроить новую функцию 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 была бы очень полезна!

Дэвид Ф. Северский
источник
используйте RegfromApp, чтобы лучше отследить. он генерирует файл .reg. может быть, это может расшифровать его
magicandre1981
Спасибо за предложение @ magicandre198. Process Monitor дает мне точный ключ и значение, которое изменяется. Проблема в том, что ключ является двоичным, и нет никакой доступной документации по расшифровке того, как этот ключ данных построен. Учитывая интересный путь, о котором идет речь, это может не быть раздел, предназначенный для прямого изменения (возможно, в кешированном каталоге настроек). Я надеюсь, что у кого-то есть руководство по управлению новой функцией Night Light, так как пока не так много информации о ней.
Дэвид Ф. Северский
Как я уже сказал, используйте Regfromapp, он генерирует файлы .reg для каждого изменения.
magicandre1981
1
Мы можем говорить здесь в разных целях. :) Я знаю, что ключ и содержимое ключа настраиваются. Это просто неловкий блоб без документации. Я нашел github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight, который немного взломал, чтобы предоставить PS-интерфейс для этой функции, но не ясно, как объединить различные настройки вместе. Я действительно ищу документацию (и интерфейс) о том, как эта двоичная строка составлена.
Дэвид Ф. Северский

Ответы:

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 . Затем вы можете импортировать содержимое скрипта с помощью точечного поиска:

. ./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.

Бен Н
источник
Я пытаюсь написать сценарий, чтобы включить и выключить только ночной свет. Если я не ошибаюсь, байты 20 и 21 должны указывать, включена ли эта функция (согласно вашему описанию, по крайней мере, с 4 + 8 + 8 = 20), но когда я смотрю на запись реестра с помощью regedit, я не см. изменение байтов 21, я не вижу никаких изменений в этом отношении. Я удостоверился, что обновил окно regedit с помощью F5 и даже снова открыл его после того, как я включил функцию ночного освещения из пользовательского интерфейса. У вас есть представление о том, что происходит?
Gaboik1
1
С помощью этой утилиты из NirSoft nirsoft.net/articles/find_modified_time_registry_key.html я также обнаружил, что указанный вами ключ реестра вообще не изменяется при активации и деактивации функции ночного освещения. Возможно, Microsoft изменила его в последнем обновлении?
Gaboik1
1
@ Gaboik1 Это значение реестра немного странно, так как его расположение сильно меняется; формат, который я описал, только один, который работает, не обязательно единственный. Я не знаю способа последовательного считывания данных из этого значения, но я протестировал на Windows 10 1709 и с помощью этого сценария для настройки параметров все еще работает.
Бен Н
Записав это в .net, я обнаружил, что на самом деле использует расписание (против вашего кода, который, кажется, делает на рассвете / закате), мне пришлось добавить байты 0xC2,0x0A, 0x00 непосредственно перед CA 14 0E. Тогда это вызвало бы и установило бы это на основе часов. В противном случае это сработало. 1709.
Mgamerz
@Mgamerz Может подтвердить, что это правильно, и работает в 1809 году. Поместите изменения в ответ.
метаморфоза
2

Несколько часов экспериментов и вуаля:
как включить / выключить 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.

hgrev
источник
У вас случайно есть скрипт для включения-отключения этого случайно?
метаморфоза
нет. я написал небольшую программу на C.
hgrev
было бы полезно (по крайней мере для меня), если бы вы могли опубликовать ссылку. Я работаю в C / C ++
метаморфоза
Вы хотите код или EXE-файл?
hgrev
Либо, если я в порядке. : _)
метаморфоза