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


У вас случайно есть скрипт для включения-отключения этого случайно?
— метаморфоза

нет. я написал небольшую программу на C.
— hgrev

было бы полезно (по крайней мере для меня), если бы вы могли опубликовать ссылку. Я работаю в C / C ++
— метаморфоза

Вы хотите код или EXE-файл?
— hgrev

Либо, если я в порядке. : _)
— метаморфоза
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.