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

3964
David F. Severski

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

9
используйте [RegfromApp] (http://www.nirsoft.net/utils/reg_file_from_application.html), чтобы лучше отследить его. он генерирует файл .reg. может быть, это может расшифровать его magicandre1981 7 лет назад 0
Спасибо за предложение @ magicandre198. Process Monitor дает мне точный ключ и значение, которое изменяется. Проблема в том, что ключ является двоичным, и нет никакой доступной документации по расшифровке того, как этот ключ данных построен. Учитывая интересный путь, о котором идет речь, это может быть не тот раздел, который предназначен для прямого изменения (возможно, кешированное расположение настроек). Я надеюсь, что у кого-то есть руководство по управлению новой функцией Night Light, так как пока, похоже, не так много информации о ней. David F. Severski 7 лет назад 0
Как я уже сказал, используйте Regfromapp, он генерирует файлы .reg для каждого изменения. magicandre1981 7 лет назад 0
Мы можем говорить здесь в разных целях. :) Я знаю, что ключ и содержимое ключа настраиваются. Это просто неловкий блоб без документации. Я нашел https://github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight, который делает небольшой взлом, чтобы предоставить PS-интерфейс для функции, но не ясно, как объединить различные настройки вместе. Я действительно ищу документацию (и интерфейс) о том, как эта двоичная строка соединена. David F. Severski 7 лет назад 1

1 ответ на вопрос

8
Ben N

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

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

the results

Приложение «Настройки» даже сразу обновляет все (кроме ползунка цвета), если при запуске команды открыта страница уменьшения синего света.

Формат

  • 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 6 лет назад 0
Я также обнаружил, используя эту утилиту от NirSoft http://www.nirsoft.net/articles/find_modified_time_registry_key.html, что указанный вами ключ реестра вообще не изменяется, когда я активирую и деактивирую функцию ночного освещения. Возможно, Microsoft изменила его в последнем обновлении? Gaboik1 6 лет назад 1
@ Gaboik1 Это значение реестра немного странно, так как его расположение сильно меняется; формат, который я описал, только один, который работает, не обязательно единственный. Я не знаю, как последовательно считывать данные из этого значения, но я протестировал на Windows 10 1709 и с помощью этого скрипта для установки параметров все еще работает. Ben N 6 лет назад 1
Записав это в .net, я обнаружил, что на самом деле использует расписание (против вашего кода, который, кажется, делает на рассвете / закате), мне пришлось добавить байты 0xC2,0x0A, 0x00 как раз перед CA 14 0E. Тогда это вызвало бы и установило бы это на основе часов. В противном случае это сработало. На 1709. Mgamerz 6 лет назад 0