Skonfiguruj Windows Creators Update Night Light poprzez rejestr

13

W jaki sposób można skonfigurować nową funkcję Night Light w aktualizacji Windows 10 (Pro) dla twórców za pośrednictwem rejestru?

Chciałbym automatycznie skonfigurować nowe / zaktualizowane instalacje, gdy korzystam z mojego wybranego narzędzia do zarządzania konfiguracją (Chef). Kontrola systemu za pomocą Monitora procesów Sysinternals pokazuje, że Dataklucz binarny jest głęboko aktualizowany HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current, ale jest to duży BLOB REG_BINARY i niezbyt przydatny.

Pomoc w innym rejestrze, programie PowerShell lub innym przyjaznym dla automatyzacji sposobie skonfigurowania funkcji Night Light będzie bardzo mile widziana!

David F. Severski
źródło
użyj RegfromApp do lepszego śledzenia. generuje plik .reg. może może go zdekodować
magicandre1981 16.04.17
Dzięki za sugestię @ magicandre198. Process Monitor podaje mi dokładnie zmieniany klucz i wartość. Problem polega na tym, że klucz jest binarny i nie ma dostępnej dokumentacji dekodującej dotyczącej tego, jak ten klucz danych jest zbudowany. Biorąc pod uwagę omawianą ścieżkę, może to nie być sekcja przeznaczona do bezpośredniej modyfikacji (być może lokalizacja ustawień pamięci podręcznej). Mam nadzieję, że ktoś ma zdanie na temat zarządzania nową funkcją Night Light, ponieważ wydaje się, że do tej pory nie ma zbyt wielu informacji na jej temat.
David F. Severski
jak powiedziałem, użyj Regfromapp, generuje pliki .reg dla każdej zmiany.
magicandre1981
1
Możemy rozmawiać tutaj o różnych celach. :) Wiem, że klucz i treść klucza jest dostosowywana. To tylko niezręczna kropelka bez dokumentacji. Znalazłem github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight, który trochę hakuje, aby zapewnić interfejs PS dla tej funkcji, ale nie jest jasne, jak łączyć różne ustawienia razem. Naprawdę szukam dokumentacji (i interfejsu) na temat tego, jak ten ciąg binarny jest złożony.
David F. Severski

Odpowiedzi:

12

Po kilku eksperymentach udało mi się mniej więcej opracować format tej wartości rejestru (szczegóły poniżej).

Zrobiłem ten skrypt 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
}

Aby go użyć, zapisz go jako .ps1plik i postępuj zgodnie z instrukcjami w sekcji Włączanie skryptów wiki tagu PowerShell . Następnie możesz zaimportować zawartość skryptu za pomocą dot-sourcingu:

. ./bluelightmanagement.ps1

A następnie użyj dostarczonej funkcji cmdlet:

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

wyniki

Aplikacja Ustawienia aktualizuje nawet wszystko (z wyjątkiem suwaka koloru) natychmiast, jeśli po uruchomieniu polecenia jest otwarta strona redukcji niebieskiego światła.

Format

  • 4 stałe bajty - pozornie podpis wspólny dla wszystkich CloudStorewartości
  • Czas ostatniej modyfikacji ustawienia jako wartości 64-bitowej FILETIME(8 bajtów, mały endian)
  • 8 więcej stałych bajtów
  • Bajty 2wtedy 1, gdy funkcja redukcji niebieskie światło jest włączone, po prostu zniknąć, jeśli jest wyłączony
  • 3 więcej stałych bajtów
  • Godzina czasu rozpoczęcia (1 bajt)
  • 1 stały bajt
  • Minuty czasu rozpoczęcia (1 bajt)
  • 4 stałe bajty
  • Godzina czasu zakończenia (1 bajt)
  • 1 stały bajt
  • Minuty czasu zakończenia (1 bajt)
  • 3 stałe bajty
  • Nocna temperatura barwowa w stopniach Kelvina po dziwnej matematyce binarnej (2 bajty)
  • 7 stałych bajtów

Temperatura koloru jest przechowywana jako dwa bajty w małym endianie. Jeden o wysokiej wartości jest liczbą całkowitą wyniku dzielenia temperatury przez 64. Bajt o niskiej wartości to reszta pomnożona przez dwa, a następnie dodana do 128. Aby obliczyć temperaturę z bajtów, należy pomnożyć wysoki bajt przez 64 i dodaj to, co otrzymasz, dzieląc przez dwa, różnicę między niskim bajtem a 128.

Ben N.
źródło
Próbuję napisać skrypt, który będzie włączał i wyłączał lampkę nocną. Jeśli się nie mylę, bajty 20 i 21 powinny wskazywać, czy funkcja jest włączona (zgodnie z twoim opisem przynajmniej od 4 + 8 + 8 = 20), ale kiedy patrzę na wpis rejestru za pomocą regedit, nie zobacz bajty 21 zmiany, nie widzę żadnych zmian w tym zakresie. Upewniłem się, że odświeżam okno programu regedit za pomocą F5, a nawet otworzyłem je ponownie po przełączeniu funkcji nocnego światła z interfejsu użytkownika. Czy masz pojęcie o tym, co się dzieje?
Gaboik1,
1
Za pomocą tego narzędzia z NirSoft nirsoft.net/articles/find_modified_time_registry_key.html odkryłem również , że określony klucz rejestru w ogóle nie jest modyfikowany, gdy aktywuję i dezaktywuję funkcję lampki nocnej. Być może Microsoft zmienił to w ostatniej aktualizacji?
Gaboik1
1
@ Gaboik1 Ta wartość rejestru jest dość dziwna, ponieważ jej układ bardzo się zmienia; format, który opisałem, jest tylko taki, który działa, niekoniecznie jedyny. Nie znam sposobu na konsekwentne odczytywanie danych z tej wartości, ale testowałem na Windows 10 1709 i używanie tego skryptu do ustawiania ustawień nadal działa.
Ben N
Pisząc to w .net, stwierdziłem, że faktycznie używam harmonogramu (w przeciwieństwie do twojego kodu, który wydaje się robić do wschodu / zachodu słońca) Musiałem dodać bajty 0xC2,0x0A, 0x00 tuż przed CA 14 0E. Następnie uruchomi się i ustawi na godziny. W przeciwnym razie zadziałało. 1709.
Mgamerz
1
Na dzień dzisiejszy ostatnia aktualizacja to już nie działa. Zmodyfikowany klucz rejestru to \Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings\Dataniestety format binarny nie jest taki sam.
Julien__
2

Kilka godzin eksperymentów i voila:
Jak włączyć / wyłączyć Night Light w Win10 1903

Klucz rejestru to :

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

Nazwa wartości : dane

Aby włączyć Night Light :

  1. Dodaj bajty „10” i „00” do danych odpowiednio w indeksach 24 i 25, aby zwiększyć długość wszystkich danych (nie zmieniaj istniejących wartości, po prostu dodaj dwa kolejne bajty)
  2. Przyrost wartości w indeksach 11 lub 12 o 1 (na przykład: jeśli był to FF 01, to teraz musi to być odpowiednio 00 02) Właściwie wydaje się, że już czas i zapisano go w 8 bajtach w małym formacie endian, więc będziesz potrzebować także indeksy 13, 14, 15, 16, 17 i 18, jeśli chcesz to zrobić precyzyjnie.

Aby wyłączyć Night Light :

  1. Usuń bajty „10” i „00” z danych odpowiednio w indeksach 24 i 25, aby zmniejszyć długość wszystkich danych
  2. Przyrost wartości 11 lub 12 indeksów o 1 (na przykład: jeśli był to FF 01, to teraz musi to być odpowiednio 00 02)

Musiałem tylko włączyć / wyłączyć Night Light dla mojego programu, więc niestety wszystkie inne opcje nadal wymagają badań. Wydaje się jednak, że kluczową opcją dla wszystkich innych poprawek do pracy (takich jak zmiana temperatury i harmonogramu) jest odpowiednie zwiększenie czasu. Te mody należy wykonać w innej wartości Data w sąsiednim kluczu rejestru windows.data.bluelightreduction.settings.

hgrev
źródło
Czy zdarza ci się mieć skrypt, który włącza / wyłącza to przypadkiem?
metamorfoza
Nie. napisałem mały program w C.
hgrev
nadal byłby użyteczny (przynajmniej dla mnie), gdybyś mógł opublikować link. Pracuję w C / C ++
metamorfoza
chcesz kod lub plik exe?
hgrev
1
Oto kod źródłowy i plik wykonywalny: github.com/inamozov/DisplayTest
hgrev