Configurer la veilleuse de mise à jour de Windows Creators via le registre

13

Comment configurer la nouvelle fonctionnalité Night Light dans Windows 10 (Pro) Creators Update via le registre?

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

Une aide sur un autre registre, PowerShell ou toute autre manière conviviale d'automatisation pour configurer la fonction Veilleuse serait très appréciée!

David F. Severski
la source
utilisez RegfromApp pour mieux le tracer. il génère le fichier .reg. peut-être qu'il peut le décoder
magicandre1981
Merci pour la suggestion @ magicandre198. Process Monitor me donne la clé exacte et la valeur en cours de modification. Le problème est que la clé est binaire et qu'il n'y a pas de documentation de décodage disponible pour la façon dont cette clé de données est construite. Compte tenu du chemin funky en question, il ne s'agit peut-être pas d'une section destinée à une modification directe (peut-être un emplacement de paramètres mis en cache). J'espère que quelqu'un a une ligne sur la gestion de la nouvelle fonctionnalité Night Light car il ne semble pas y avoir beaucoup d'informations à ce sujet jusqu'à présent.
David F. Severski
comme je l'ai dit, utilisez Regfromapp, il génère des fichiers .reg pour chaque changement.
magicandre1981
1
Nous parlons peut-être à contre-courant ici. :) Je connais la clé et le contenu de la clé en cours de réglage. C'est juste un blob maladroit sans documentation. J'ai trouvé github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight qui fait un peu de piratage pour fournir une interface PS à la fonctionnalité, mais il n'est pas clair comment combiner les différents paramètres ensemble. Je cherche vraiment de la documentation (et une interface) sur la façon dont cette chaîne binaire est composée.
David F. Severski

Réponses:

12

Avec un tas d'expérimentation, j'ai réussi à plus ou moins travailler sur le format de cette valeur de Registre (voir ci-dessous pour les détails à ce sujet).

J'ai fait 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 forme de .ps1fichier et suivez les instructions de la section Activation des scripts du wiki de balise PowerShell . Vous pouvez ensuite importer le contenu du script par dot-sourcing:

. ./bluelightmanagement.ps1

Et puis utilisez la fonction de type applet de commande qu'elle fournit:

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

Les resultats

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

Le format

  • 4 octets constants - apparemment une signature commune à toutes les CloudStorevaleurs
  • Heure de dernière modification du paramètre en tant que FILETIMEvaleur 64 bits (8 octets, petit endian)
  • 8 octets plus constants
  • Les octets, 2puis 1si la fonction de réduction de la lumière bleue est activée, juste disparue si elle est désactivée
  • 3 octets plus constants
  • L'heure de l'heure de début (1 octet)
  • 1 octet constant
  • Les minutes de l'heure de début (1 octet)
  • 4 octets constants
  • L'heure de l'heure de 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 sur deux octets en petit-boutien. La valeur élevée est la partie entière du résultat de la division de la température par 64. L'octet de faible valeur est le reste multiplié par deux, puis ajouté à 128. Pour calculer la température à partir des octets, multipliez l'octet élevé par 64 et ajoutez ce que vous obtenez lorsque vous divisez par deux la différence entre l'octet de poids faible et 128.

Ben N
la source
J'essaie d'écrire un script pour allumer et éteindre uniquement la veilleuse. Si je ne me trompe pas, les octets 20 et 21 devraient indiquer si la fonctionnalité est activée (selon votre description au moins depuis 4 + 8 + 8 = 20) mais quand je regarde l'entrée de registre en utilisant regedit, je ne le fais pas voir les octets 21 changer, je ne vois aucun changement du tout. Je me suis assuré d'actualiser la fenêtre regedit avec F5 et même de la rouvrir après avoir basculé la fonction de veilleuse de l'interface utilisateur. Avez-vous une idée de ce qui se passe?
Gaboik1
1
J'ai également constaté, à l'aide de cet utilitaire de NirSoft nirsoft.net/articles/find_modified_time_registry_key.html , que la clé de registre que vous avez spécifiée n'est pas du tout modifiée lorsque j'active et désactive la fonction de veilleuse. Peut-être que Microsoft l'a changé dans la dernière mise à jour?
Gaboik1
1
@ Gaboik1 Cette valeur de Registre est assez étrange dans la mesure où sa disposition change beaucoup; le format que j'ai décrit est juste celui qui fonctionne, pas nécessairement le seul. Je ne connais pas de moyen de lire systématiquement les données de cette valeur, mais j'ai testé sur Windows 10 1709 et l'utilisation de ce script pour définir les paramètres fonctionne toujours.
Ben N
En écrivant cela en .net, j'ai trouvé que j'utilisais réellement le programme (par rapport à votre code, ce qui semble le faire au lever / coucher du soleil). J'ai dû ajouter des octets 0xC2,0x0A, 0x00 juste avant CA 14 0E. Ensuite, il se déclencherait et le définirait sur la base des heures. Sinon ça a marché. Le 1709.
Mgamerz
@Mgamerz Peut confirmer que cela est correct et fonctionne en 1809. J'ai placé une modification sur la réponse.
métamorphose le
2

Plusieurs heures d'expériences et le tour est joué:
comment activer / désactiver la veilleuse dans Win10 1903

La clé de registre est :

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

Nom de la valeur : données

Pour activer la veilleuse :

  1. Ajoutez des octets "10" et "00" aux données sur 24 et 25 index respectivement afin que toute la longueur des données augmente (ne modifiez pas les valeurs existantes, ajoutez simplement deux octets supplémentaires)
  2. Incrémentez la valeur dans 11 ou 12 index de 1 (par exemple: si c'était FF 01 alors maintenant il doit être 00 02 respectivement) aussi 13, 14, 15, 16, 17 et 18 index si vous voulez le faire avec précision.

Pour désactiver la veilleuse :

  1. Supprimez les octets "10" et "00" des données sur les index 24 et 25 respectivement afin que toute la longueur des données diminue
  2. Incrémenter la valeur dans 11 ou 12 index de 1 (par exemple: si c'était FF 01 alors maintenant, il doit être 00 02 respectivement)

Je n'avais qu'à activer / désactiver la veilleuse pour mon programme, donc malheureusement toutes les autres options doivent encore être recherchées. Mais il semble que l'option clé pour que tous les autres réglages fonctionnent (comme la modification de la température et du calendrier) consiste à augmenter correctement le temps. Ces mods doivent être effectués dans une autre valeur de données dans la clé de registre voisine windows.data.bluelightreduction.settings.

hgrev
la source
Avez-vous un script pour activer-désactiver cela par hasard?
métamorphose
non. j'ai écrit un petit programme en C.
hgrev
serait toujours utile (du moins pour moi) si vous pouviez poster un lien. Je travaille en C / C ++
métamorphose le
voulez-vous un code ou un fichier exe?
hgrev
Soit si ça me va. : _)
métamorphose