Konfigurieren Sie Windows Creators Update Night Light über die Registrierung

13

Wie kann die neue Nachtlichtfunktion in Windows 10 (Pro) Creators Update über die Registrierung konfiguriert werden?

Ich möchte neue / aktualisierte Installationen automatisch konfigurieren, wenn ich das Konfigurationsmanagement-Tool Ihrer Wahl (Chef) verwende. Die Systeminspektion über Sysinternals Process Monitor zeigt, dass ein Binärschlüssel Datatief im Inneren aktualisiert wird HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current, aber das ist ein großer REG_BINARY-Blob und nicht sehr nützlich.

Hilfe zu einer anderen Registrierung, PowerShell oder einer anderen automatisierungsfreundlichen Methode zum Konfigurieren der Nachtlichtfunktion wäre sehr dankbar!

David F. Severski
quelle
Verwenden Sie RegfromApp , um es besser zu verfolgen. Es generiert die REG-Datei. Vielleicht kann es es entschlüsseln
magicandre1981
Danke für den Vorschlag @ magicandre198. Der Prozessmonitor gibt mir den genauen Schlüssel und Wert, der geändert wird. Das Problem ist, dass der Schlüssel ein Binärschlüssel ist und keine Dekodierungsdokumentation für die Erstellung dieses Datenschlüssels verfügbar ist. In Anbetracht des fraglichen Funky-Pfads ist dies möglicherweise kein Abschnitt, der direkt geändert werden kann (möglicherweise ein zwischengespeicherter Speicherort für Einstellungen). Ich hoffe, jemand hat eine Linie zur Verwaltung der neuen Nachtlichtfunktion, da es bisher nicht viele Informationen darüber zu geben scheint.
David F. Severski
Wie gesagt, verwenden Sie Regfromapp, es generiert .reg-Dateien für jede Änderung.
magicandre1981
1
Wir sprechen hier möglicherweise zu unterschiedlichen Zwecken. :) Ich kenne den Schlüssel und den Inhalt des Schlüssels, der angepasst wird. Es ist nur ein unangenehmer Fleck ohne Dokumentation. Ich habe github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight gefunden, das ein bisschen hackt, um eine PS-Schnittstelle für die Funktion bereitzustellen, aber es ist nicht klar, wie die verschiedenen Einstellungen miteinander kombiniert werden sollen. Ich suche wirklich nach Dokumentation (und einer Schnittstelle) darüber, wie diese Binärzeichenfolge zusammengesetzt wird.
David F. Severski

Antworten:

12

Mit ein paar Experimenten gelang es mir, das Format dieses Registrierungswerts mehr oder weniger herauszufinden (Einzelheiten dazu siehe unten).

Ich habe dieses PowerShell-Skript erstellt:

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
}

Um es zu verwenden, speichern Sie es als .ps1Datei und befolgen Sie die Anweisungen im Abschnitt Aktivieren von Skripten des PowerShell-Tag-Wikis . Anschließend können Sie den Inhalt des Skripts durch Dot-Sourcing importieren:

. ./bluelightmanagement.ps1

Verwenden Sie dann die darin enthaltene Cmdlet-ähnliche Funktion:

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

die Ergebnisse

Die Einstellungen-App aktualisiert sogar alles (außer dem Farbregler) sofort, wenn beim Ausführen des Befehls die Seite zur Reduzierung des blauen Lichts geöffnet ist.

Das Format

  • 4 konstante Bytes - scheinbar eine Signatur, die allen CloudStoreWerten gemeinsam ist
  • Die zuletzt geänderte Zeit der Einstellung als 64-Bit- FILETIMEWert (8 Byte, Little Endian)
  • 8 weitere konstante Bytes
  • Die Bytes sind 2dann, 1wenn die Blaulichtreduzierungsfunktion aktiviert ist, weg, wenn sie deaktiviert ist
  • 3 weitere konstante Bytes
  • Die Stunde der Startzeit (1 Byte)
  • 1 konstantes Byte
  • Die Minuten der Startzeit (1 Byte)
  • 4 konstante Bytes
  • Die Stunde der Endzeit (1 Byte)
  • 1 konstantes Byte
  • Die Minuten der Endzeit (1 Byte)
  • 3 konstante Bytes
  • Die nächtliche Farbtemperatur in Kelvin nach einigen seltsamen binären Berechnungen (2 Bytes)
  • 7 konstante Bytes

Die Farbtemperatur wird als zwei Bytes in Little Endian gespeichert. Der Wert mit dem hohen Wert ist der ganzzahlige Teil des Ergebnisses der Division der Temperatur durch 64. Das Byte mit dem niedrigen Wert ist der Rest, der mit zwei multipliziert und dann zu 128 addiert wird. Um die Temperatur aus den Bytes zu berechnen, multiplizieren Sie das hohe Byte mit 64 und addieren Sie, was Sie erhalten, wenn Sie die Differenz zwischen dem niedrigen Byte und 128 durch zwei teilen.

Ben N.
quelle
Ich versuche, ein Skript zu schreiben, um nur das Nachtlicht ein- und auszuschalten. Wenn ich mich nicht irre, sollten die Bytes 20 und 21 anzeigen, ob die Funktion aktiviert ist (gemäß Ihrer Beschreibung mindestens seit 4 + 8 + 8 = 20), aber wenn ich den Registrierungseintrag mit regedit betrachte, tue ich dies nicht siehe Bytes 21 ändern, ich sehe überhaupt keine Änderung für diese Angelegenheit. Ich habe sichergestellt, dass ich das regedit-Fenster mit F5 aktualisiere und es sogar wieder öffne, nachdem ich die Nachtlichtfunktion über die Benutzeroberfläche umgeschaltet habe. Haben Sie eine Vorstellung davon, was los ist?
Gaboik1
1
Mit diesem Dienstprogramm von NirSoft nirsoft.net/articles/find_modified_time_registry_key.html habe ich außerdem festgestellt, dass der von Ihnen angegebene Registrierungsschlüssel beim Aktivieren und Deaktivieren der Nachtlichtfunktion überhaupt nicht geändert wird. Vielleicht hat Microsoft es im letzten Update geändert?
Gaboik1
1
@ Gaboik1 Dieser Registrierungswert ist insofern seltsam, als sich sein Layout stark ändert. Das von mir beschriebene Format ist nur eines, das funktioniert, nicht unbedingt das einzige. Ich kenne keine Möglichkeit, die Daten konsistent aus diesem Wert herauszulesen, aber ich habe unter Windows 10 1709 getestet und die Verwendung dieses Skripts zum Festlegen der Einstellungen funktioniert immer noch.
Ben N
Als ich dies in .net schrieb, stellte ich fest, dass der Zeitplan tatsächlich verwendet wurde (im Vergleich zu Ihrem Code, der bei Sonnenaufgang / Sonnenuntergang zu funktionieren scheint). Ich musste die Bytes 0xC2,0x0A, 0x00 kurz vor CA 14 0E hinzufügen. Dann würde es auslösen und auf Stunden basierend setzen. Ansonsten hat es funktioniert. Am 1709.
Mgamerz
@Mgamerz Kann bestätigen, dass dies korrekt ist und funktioniert im Jahr 1809. Habe die Antwort bearbeitet.
Metamorphose
2

Mehrere Stunden Experimente und Voila:
So schalten Sie das Nachtlicht in Win10 1903 ein / aus

Der Registrierungsschlüssel lautet :

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

Wertname : Daten

So aktivieren Sie das Nachtlicht :

  1. Fügen Sie den Daten in 24 und 25 Indizes die Bytes "10" und "00" hinzu, damit die gesamte Datenlänge zunimmt (ändern Sie keine vorhandenen Werte, fügen Sie einfach zwei weitere Bytes hinzu).
  2. Erhöhen Sie den Wert in 11 oder 12 Indizes um 1 (zum Beispiel: Wenn es FF 01 war, muss es jetzt 00 02 sein). Eigentlich scheint es hier Zeit zu sein und es ist in 8 Bytes im Little-Endian-Format geschrieben, also brauchen Sie es auch 13, 14, 15, 16, 17 und 18 Indizes, wenn Sie es genau machen wollen.

So deaktivieren Sie das Nachtlicht :

  1. Entfernen Sie die Bytes "10" und "00" aus den Daten für 24 bzw. 25 Indizes, damit die gesamte Datenlänge abnimmt
  2. Erhöhen Sie den Wert in 11 oder 12 Indizes um 1 (zum Beispiel: Wenn es FF 01 war, muss es jetzt 00 02 sein)

Ich musste für mein Programm nur das Nachtlicht ein- und ausschalten, daher müssen leider noch alle anderen Optionen untersucht werden. Es scheint jedoch, dass die Schlüsseloption für alle anderen Änderungen (wie das Ändern der Temperatur und des Zeitplans) darin besteht, die Zeit richtig zu erhöhen. Diese Mods müssen in einem anderen Datenwert im benachbarten Registrierungsschlüssel windows.data.bluelightreduction.settings durchgeführt werden.

hgrev
quelle
Haben Sie zufällig ein Skript, um dies zufällig zu aktivieren / deaktivieren?
Metamorphose
Nein. Ich schrieb ein kleines Programm in C.
Hgrev
wäre immer noch nützlich (zumindest für mich), wenn du einen Link posten könntest. Ich arbeite in C / C ++
Metamorphose