web-dev-qa-db-fra.com

Configurer Windows Creators Update Night Light via le registre

Comment la nouvelle fonctionnalité Night Light de Windows 10 (Pro) Creators Update peut-elle être configurée via le registre?

J'aimerais configurer automatiquement les nouvelles installations/mises à jour lorsque j'utilise l'outil de gestion de la configuration de mon choix (Chef). L'inspection du système via Sysinternals Process Monitor montre qu'une clé binaire Data est mise à jour en profondeur dans HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current, mais c'est un gros blob REG_BINARY et peu utile.

Toute aide sur un autre registre, PowerShell ou un autre moyen simple pour l'automatisation de configurer la fonction Night Light serait très appréciée!

11
David F. Severski

Avec beaucoup d'expérimentations, j'ai réussi à plus ou moins définir le format de cette valeur de registre (voir ci-dessous pour plus de détails).

J'ai créé ce 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
}

Pour l'utiliser, enregistrez-le sous un fichier .ps1 et suivez les instructions de la section Enabling Scripts de le wiki de la balise PowerShell . Vous pouvez ensuite importer le contenu du script en procédant à une source de points:

. ./bluelightmanagement.ps1

Et utilisez ensuite la fonction semblable à une applet de commande fournie:

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

the results

L'application Paramètres met même à jour tout (sauf le curseur de couleur) immédiatement si la page de réduction de la lumière bleue est ouverte lorsque vous exécutez la commande.

Le format

  • 4 octets constants - apparemment une signature commune à toutes les valeurs CloudStore
  • Heure de la dernière modification du paramètre sous la forme d'une valeur FILETIME de 64 bits (8 octets, little endian)
  • 8 octets plus constants
  • Les octets 2 puis 1 si la fonction de réduction de la lumière bleue est activée, a disparu si elle est désactivée
  • 3 octets plus constants
  • L'heure de début heure (1 octet)
  • 1 octet constant
  • Les minutes de l'heure de début (1 octet)
  • 4 octets constants
  • L'heure de la fin (1 octet)
  • 1 octet constant
  • Les minutes de l'heure de fin (1 octet)
  • 3 octets constants
  • La température de couleur nocturne en Kelvin, après quelques calculs binaires étranges (2 octets)
  • 7 octets constants

La température de couleur est stockée sous forme de deux octets en little endian. La valeur haute est la partie entière du résultat de la division de la température par 64. L'octet de valeur faible est le reste multiplié par deux, puis additionné à 128. Pour calculer la température à partir des octets, multipliez l'octet supérieur par 64. et ajoutez ce que vous obtenez lorsque vous divisez par deux la différence entre l'octet inférieur et 128.

11
Ben N