Configurar Windows Creators Update Night Light a través del registro

13

¿Cómo se puede configurar la nueva función Night Light en Windows 10 (Pro) Creators Update a través del registro?

Me gustaría configurar automáticamente las instalaciones nuevas / actualizadas al usar mi herramienta de administración de configuración de elección (Chef). La inspección del sistema a través de Sysinternals Process Monitor muestra una Dataclave binaria que se actualiza profundamente HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current, pero es un gran blob REG_BINARY y no es muy útil.

¡La ayuda en un registro diferente, PowerShell u otra forma amigable de automatización para configurar la función Night Light sería muy apreciada!

David F. Severski
fuente
use RegfromApp para rastrearlo mejor. Genera el archivo .reg. tal vez pueda decodificarlo
magicandre1981
Gracias por la sugerencia @ magicandre198. Process Monitor me da la clave exacta y el valor que se está cambiando. El problema es que la clave es binaria y no hay documentación de decodificación disponible sobre cómo se construye esa clave de datos. Dada la ruta funky en cuestión, esta puede no ser una sección destinada a modificación directa (quizás una ubicación de configuración en caché). Espero que alguien tenga una línea sobre la administración de la nueva función Night Light, ya que hasta ahora no parece haber mucha información al respecto.
David F. Severski
como dije, use Regfromapp, genera archivos .reg para cada cambio.
magicandre1981
1
Podemos estar hablando de propósitos cruzados aquí. :) Conozco la clave y el contenido de la clave que se está ajustando. Es solo una gota incómoda sin documentación. He encontrado github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight que hace un poco de pirateo para proporcionar una interfaz PS a la función, pero no está claro cómo combinar las diversas configuraciones. Realmente estoy buscando documentación (y una interfaz) sobre cómo se combina esta cadena binaria.
David F. Severski

Respuestas:

12

Con un montón de experimentación, logré calcular más o menos el formato de ese valor del Registro (ver más abajo para más detalles).

Hice este script de 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
}

Para usarlo, guárdelo como un .ps1archivo y siga las instrucciones en la sección Habilitación de scripts de la wiki de etiquetas de PowerShell . Luego puede importar el contenido de la secuencia de comandos mediante el abastecimiento de puntos:

. ./bluelightmanagement.ps1

Y luego use la función tipo cmdlet que proporciona:

Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000

Los resultados

La aplicación Configuración incluso actualiza todo (excepto el control deslizante de color) inmediatamente si tiene abierta la página de reducción de luz azul cuando ejecuta el comando.

El formato

  • 4 bytes constantes: aparentemente una firma común a todos los CloudStorevalores
  • El tiempo de la última modificación de la configuración como un FILETIMEvalor de 64 bits (8 bytes, little endian)
  • 8 bytes más constantes
  • Los bytes, 2entonces, 1si la función de reducción de luz azul está habilitada, solo desaparecerá si está deshabilitada
  • 3 bytes más constantes
  • La hora de inicio (1 byte)
  • 1 byte constante
  • Los minutos de la hora de inicio (1 byte)
  • 4 bytes constantes
  • La hora del final (1 byte)
  • 1 byte constante
  • Los minutos del tiempo final (1 byte)
  • 3 bytes constantes
  • La temperatura de color nocturna en Kelvin, después de algunas matemáticas binarias extrañas (2 bytes)
  • 7 bytes constantes

La temperatura de color se almacena como dos bytes en little endian. El valor alto es la parte entera del resultado de dividir la temperatura entre 64. El byte de valor bajo es el resto multiplicado por dos, luego sumado a 128. Para calcular la temperatura de los bytes, multiplique el byte alto por 64 y agrega lo que obtienes cuando divides entre dos la diferencia entre el byte bajo y 128.

Ben N
fuente
Estoy tratando de escribir un guión para encender y apagar la luz de la noche. Si no me equivoco, los bytes 20 y 21 deberían indicar si la función está activada (según su descripción al menos desde 4 + 8 + 8 = 20) pero cuando miro la entrada del registro usando regedit, no lo hago ver el cambio de bytes 21, no veo ningún cambio en absoluto para el caso. Me aseguré de actualizar la ventana regedit con F5 e incluso la volví a abrir después de haber activado la función de luz nocturna desde la interfaz de usuario. ¿Tienes una idea de lo que está pasando?
Gaboik1
1
También descubrí, usando esta utilidad de NirSoft nirsoft.net/articles/find_modified_time_registry_key.html , que la clave de registro que especificó no se modifica en absoluto cuando activo y desactivo la función de luz nocturna. ¿Quizás Microsoft lo cambió en la última actualización?
Gaboik1
1
@ Gaboik1 Este valor del Registro es un poco extraño en que su diseño cambia mucho; El formato que describí es solo uno que funciona, no necesariamente el único. No conozco una forma de leer constantemente los datos de este valor, pero probé en Windows 10 1709 y todavía utilizo este script para establecer la configuración.
Ben N
Al escribir esto en .net, descubrí que en realidad usaba el horario (en comparación con su código, que parece hacerlo al amanecer / atardecer) Tuve que agregar bytes 0xC2,0x0A, 0x00 justo antes de CA 14 0E. Luego se dispararía y lo establecería en horas. De lo contrario funcionó. En 1709.
Mgamerz
@Mgamerz puede confirmar que esto es correcto y funciona en 1809. Se ha realizado una edición en la respuesta.
metamorfosis el
2

Varias horas de experimentos y listo:
cómo activar / desactivar Night Light en Win10 1903

La clave de registro es :

HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.bluelightreductionstate\windows.data.bluelightreduction.bluelightreductionstate\

Nombre del valor : datos

Para habilitar Night Light :

  1. Agregue bytes "10" y "00" a los datos en los índices 24 y 25, respectivamente, para que aumente la longitud de todos los datos (no cambie los valores existentes, solo agregue dos bytes más)
  2. Incremente el valor en 11 o 12 índices en 1 (por ejemplo: si era FF 01 que ahora tiene que ser 00 02 respectivamente) En realidad, parece que es hora de hacerlo y está escrito en 8 bytes en formato little endian, por lo que necesitará también 13, 14, 15, 16, 17 y 18 índices si quieres hacerlo con precisión.

Para deshabilitar la luz nocturna :

  1. Elimine los bytes "10" y "00" de los datos en los índices 24 y 25 respectivamente, de modo que toda la longitud de los datos disminuya
  2. Incremente el valor en 11 o 12 índices en 1 (por ejemplo: si era FF 01 que ahora tiene que ser 00 02 respectivamente)

Solo necesitaba encender / apagar Night Light para mi programa, por lo que desafortunadamente todas las demás opciones aún necesitan investigación. Pero parece que la opción clave para que todos los otros ajustes funcionen (como cambiar la temperatura y el horario) es incrementar el tiempo adecuadamente. Estas modificaciones deben realizarse en otro valor de datos en la clave de registro vecina windows.data.bluelightreduction.settings.

hgrev
fuente
¿Por casualidad tienes un script para habilitar-deshabilitar esto?
metamorfosis
No. escribí un pequeño programa en C.
hgrev
aún sería útil (al menos para mí) si pudieras publicar un enlace. Trabajo en C / C ++
metamorfosis el
¿Quieres un código o archivo exe?
hgrev
O bien si bien por mí. : _)
metamorfosis