Configurare la luce notturna di Windows Creators Update tramite il registro


13

Come si può configurare la nuova funzione Night Light in Windows 10 (Pro) Creators Update tramite il registro?

Vorrei configurare automaticamente le installazioni nuove / aggiornate quando utilizzo il mio strumento di gestione della configurazione preferito (Chef). L'ispezione del sistema tramite Sysinternals Process Monitor mostra una Datachiave binaria che viene aggiornata in profondità HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current, ma è un grande BLOB REG_BINARY e non molto utile.

Sarebbe molto apprezzato l'aiuto su un diverso registro, PowerShell o un altro modo di automazione per configurare la funzione Night Light!


usa RegfromApp per rintracciarlo meglio. genera il file .reg. forse può decodificarlo
magicandre1981,

Grazie per il suggerimento @ magicandre198. Process Monitor mi dà la chiave esatta e il valore che viene modificato. Il problema è che la chiave è binaria e non è disponibile alcuna documentazione di decodifica per come viene costruita quella chiave di dati. Dato il percorso funky in questione, questa potrebbe non essere una sezione destinata alla modifica diretta (forse una posizione delle impostazioni memorizzata nella cache). Spero che qualcuno abbia una linea sulla gestione della nuova funzione Night Light in quanto finora non sembrano esserci molte informazioni al riguardo.
David F. Severski,

come ho detto, usa Regfromapp, genera file .reg per ogni modifica.
magicandre1981,

1
Potremmo parlare a scopi incrociati qui. :) Conosco la chiave e il contenuto della chiave in fase di regolazione. È solo un blob imbarazzante senza documentazione. Ho trovato github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight che fa un po 'di hacking per fornire un'interfaccia PS alla funzione, ma non è chiaro come combinare insieme le varie impostazioni. Sto davvero cercando documentazione (e un'interfaccia) su come questa stringa binaria è messa insieme.
David F. Severski,

Risposte:


12

Con un sacco di sperimentazione, sono riuscito a elaborare più o meno il formato di quel valore del Registro di sistema (vedi sotto per i dettagli al riguardo).

Ho realizzato questo script 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
}

Per usarlo, salvalo come .ps1file e segui le istruzioni nella sezione Abilitazione degli script del tag wiki PowerShell . È quindi possibile importare il contenuto dello script tramite dot-sourcing:

. ./bluelightmanagement.ps1

Quindi utilizza la funzione simile a un cmdlet che fornisce:

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

i risultati

L'app Impostazioni aggiorna anche tutto (tranne il cursore del colore) immediatamente se hai aperto la pagina di riduzione della luce blu quando esegui il comando.

Il formato

  • 4 byte costanti - apparentemente una firma comune a tutti i CloudStorevalori
  • L'ora dell'ultima modifica dell'impostazione come valore a 64 bit FILETIME(8 byte, little endian)
  • 8 byte più costanti
  • I byte 2quindi 1se la funzione di riduzione della luce blu è abilitata, se non è attiva è sparita
  • 3 byte più costanti
  • L'ora di inizio (1 byte)
  • 1 byte costante
  • I minuti dell'ora di inizio (1 byte)
  • 4 byte costanti
  • Ora dell'ora di fine (1 byte)
  • 1 byte costante
  • I minuti dell'ora di fine (1 byte)
  • 3 byte costanti
  • La temperatura del colore notturna in Kelvin, dopo qualche strano calcolo binario (2 byte)
  • 7 byte costanti

La temperatura del colore viene memorizzata come due byte in little endian. Quello ad alto valore è la parte intera del risultato della divisione della temperatura per 64. Il byte di valore basso è il resto moltiplicato per due, quindi aggiunto a 128. Per calcolare la temperatura dai byte, moltiplicare il byte alto per 64 e aggiungi ciò che ottieni quando dividi per due la differenza tra il byte basso e 128.


Sto cercando di scrivere una sceneggiatura per attivare e disattivare solo la luce notturna. Se non sbaglio, i byte 20 e 21 dovrebbero indicare se la funzione è attiva (secondo la tua descrizione almeno da 4 + 8 + 8 = 20) ma quando guardo la voce di registro usando regedit, non vedere i byte 21 cambiare, non vedo alcun cambiamento per quella materia. Mi sono assicurato di aggiornare la finestra di regedit con F5 e l'ho persino riaperta dopo aver attivato la funzione di illuminazione notturna dall'interfaccia utente. Hai un'idea di cosa sta succedendo?
Gaboik1,

1
Ho anche scoperto, utilizzando questa utility di NirSoft nirsoft.net/articles/find_modified_time_registry_key.html , che la chiave di registro specificata non viene affatto modificata quando attivo e disattivo la funzione di illuminazione notturna. Forse Microsoft l'ha cambiato nell'ultimo aggiornamento?
Gaboik1,

1
@ Gaboik1 Questo valore del Registro di sistema è strano in quanto il suo layout cambia molto; il formato che ho descritto è solo uno che funziona, non necessariamente l'unico. Non conosco un modo per leggere costantemente i dati da questo valore, ma ho testato su Windows 10 1709 e l'utilizzo di questo script per impostare le impostazioni funziona ancora.
Ben N

Scrivendo questo in .net, ho scoperto di utilizzare effettivamente la pianificazione (rispetto al codice, che sembra fare all'alba / al tramonto) Ho dovuto aggiungere byte 0xC2,0x0A, 0x00 poco prima di CA 14 0E. Quindi si innescherebbe e lo imposterà in base alle ore. Altrimenti ha funzionato. Il 1709.
Mgamerz,

@Mgamerz Può confermare che è corretto e funziona nel 1809. Ho inserito una modifica nella risposta.
metamorfosi

2

Diverse ore di esperimenti e voilà:
come accendere / spegnere la luce notturna in Win10 1903

La chiave di registro è :

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

Nome valore : dati

Per abilitare la luce notturna :

  1. Aggiungi byte "10" e "00" ai dati rispettivamente su 24 e 25 indici in modo da aumentare la lunghezza di tutti i dati (non modificare i valori esistenti, basta aggiungere altri due byte)
  2. Incrementa il valore in 11 o 12 indici di 1 (ad esempio: se era FF 01 di adesso deve essere 00 02 rispettivamente) In realtà sembra che sia arrivato il momento ed è scritto in 8 byte in formato little endian, quindi avrai bisogno di anche 13, 14, 15, 16, 17 e 18 indici se si desidera farlo con precisione.

Per disabilitare la luce notturna :

  1. Rimuovere i byte "10" e "00" dai dati rispettivamente sugli indici 24 e 25, in modo che tutta la lunghezza dei dati diminuisca
  2. Incrementa il valore in 11 o 12 indici di 1 (ad esempio: se era FF 01 di adesso deve essere 00 02 rispettivamente)

Avevo solo bisogno di accendere / spegnere Night Light per il mio programma, quindi purtroppo tutte le altre opzioni hanno ancora bisogno di ricerca. Ma sembra che l'opzione chiave per tutte le altre modifiche per funzionare (come cambiare la temperatura e il programma) sia aumentare correttamente il tempo. Queste mod devono essere eseguite in un altro valore Data nella chiave di registro adiacente windows.data.bluelightreduction.settings.


Ti capita di avere uno script per abilitare-disabilitare questo per caso?
metamorfosi il

no. ho scritto un piccolo programma in C.
hgrev il

sarebbe comunque utile (almeno per me) se potessi pubblicare un link. Lavoro in C / C ++
metamorfosi il

vuoi un codice o un file exe?
hgrev,

O se va bene per me. : _)
metamorfosi il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.