Configurar o Windows Creators Update Night Light via Registro

13

Como o novo recurso Night Light na Atualização de criadores do Windows 10 (Pro) pode ser configurado através do registro?

Eu gostaria de configurar automaticamente instalações novas / atualizadas ao usar minha ferramenta de gerenciamento de configuração de escolha (Chef). A inspeção do sistema via Sysinternals Process Monitor mostra uma Datachave binária sendo atualizada profundamente HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current, mas esse é um grande blob REG_BINARY e não é muito útil.

A ajuda em um registro diferente, no PowerShell ou em outra maneira amigável de automação para configurar o recurso Night Light seria muito apreciada!

David F. Severski
fonte
use o RegfromApp para rastrear melhor. ele gera o arquivo .reg. talvez ele possa decodificá-lo
magicandre1981
Obrigado pela sugestão @ magicandre198. O Process Monitor fornece a chave e o valor exatos que estão sendo alterados. O problema é que a chave é binária e não há documentação de decodificação disponível sobre como essa chave de dados é criada. Dado o caminho descolado em questão, essa pode não ser uma seção destinada à modificação direta (talvez um local de configurações em cache). Espero que alguém tenha uma linha sobre o gerenciamento do novo recurso Night Light, pois não parece haver muita informação sobre o assunto até agora.
David F. Severski
como eu disse, use o Regfromapp, ele gera arquivos .reg para cada alteração.
magicandre1981
11
Podemos estar falando de propósitos diferentes aqui. :) Conheço a chave e o conteúdo da chave que está sendo ajustada. É apenas um blob estranho, sem documentação. Encontrei github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight que faz um pouco de hackers para fornecer uma interface PS ao recurso, mas não está claro como combinar as várias configurações. Estou realmente procurando por documentação (e uma interface) sobre como essa string binária é montada.
David F. Severski

Respostas:

12

Com várias experiências, consegui calcular mais ou menos o formato desse valor do Registro (veja abaixo os detalhes).

Eu criei este script do 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
}

Para usá-lo, salve-o como um .ps1arquivo e siga as instruções na seção Habilitando scripts do wiki de tags do PowerShell . Você pode importar o conteúdo do script através da fonte de pontos:

. ./bluelightmanagement.ps1

E use a função semelhante ao cmdlet que ela fornece:

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

os resultados

O aplicativo Configurações até atualiza tudo (exceto o controle deslizante de cores) imediatamente se você tiver a página de redução de luz azul aberta ao executar o comando.

O formato

  • 4 bytes constantes - aparentemente uma assinatura comum a todos os CloudStorevalores
  • O horário da última modificação da configuração como um FILETIMEvalor de 64 bits (8 bytes, little endian)
  • 8 bytes mais constantes
  • Os bytes 2, 1se o recurso de redução de luz azul estiver ativado, desaparecerão se estiver desativado
  • 3 bytes mais constantes
  • A hora da hora de início (1 byte)
  • 1 byte constante
  • Minutos da hora de início (1 byte)
  • 4 bytes constantes
  • Hora da hora final (1 byte)
  • 1 byte constante
  • Minutos da hora de término (1 byte)
  • 3 bytes constantes
  • A temperatura da cor durante a noite em Kelvin, depois de um cálculo binário estranho (2 bytes)
  • 7 bytes constantes

A temperatura da cor é armazenada como dois bytes em little endian. O valor alto é a parte inteira do resultado da divisão da temperatura por 64. O byte de valor baixo é o restante multiplicado por dois e depois adicionado a 128. Para calcular a temperatura dos bytes, multiplique o byte alto por 64 e adicione o que você obtém ao dividir por dois a diferença entre o byte baixo e 128.

Ben N
fonte
Estou tentando escrever um script para ativar e desativar a luz noturna. Se não me engano, os bytes 20 e 21 devem indicar se o recurso está ativado (de acordo com a sua descrição pelo menos desde 4 + 8 + 8 = 20), mas quando olho a entrada do registro usando o regedit, não veja a alteração dos bytes 21, não vejo nenhuma alteração nesse sentido. Fiz questão de atualizar a janela regedit com o F5 e até a reabri depois de alternar o recurso de luz noturna da interface do usuário. Você tem uma ideia do que está acontecendo?
precisa saber é o seguinte
11
Também descobri, usando este utilitário do NirSoft nirsoft.net/articles/find_modified_time_registry_key.html , que a chave do registro que você especificou não está sendo modificada quando eu ativo e desativo o recurso de luz noturna. Talvez a Microsoft tenha alterado na última atualização?
precisa saber é o seguinte
11
@ Gaboik1 Esse valor do Registro é meio estranho, pois seu layout muda muito; o formato que descrevi é apenas um que funciona, não necessariamente o único. Não conheço uma maneira de ler consistentemente os dados com esse valor, mas testei no Windows 10 1709 e o uso desse script para definir as configurações ainda funciona.
Ben N
Ao escrever isso em .net, descobri que realmente utilizava a programação (em comparação com seu código, o que parece acontecer ao nascer / pôr do sol), tive que adicionar os bytes 0xC2,0x0A, 0x00 imediatamente antes do CA 14 0E. Em seguida, ele seria acionado e definido como horas com base. Caso contrário, funcionou. Em 1709.
Mgamerz
@Mameramerz Pode confirmar se está correto e funciona em 1809. Colocou uma edição na resposta.
metamorfose
2

Várias horas de experimentos e pronto:
Como ativar / desativar a luz noturna no Win10 1903

A chave do registro é :

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

Nome do valor : Dados

Para ativar a luz noturna :

  1. Adicione bytes "10" e "00" aos dados nos índices 24 e 25, respectivamente, para aumentar todo o comprimento dos dados (não altere os valores existentes, basta adicionar mais dois bytes)
  2. Incremente o valor em 11 ou 12 índices por 1 (por exemplo: se era FF 01 do que agora precisa ser 00 02, respectivamente) Na verdade, parece que está na hora e está escrito em 8 bytes em formato endian pequeno, então você precisará também 13, 14, 15, 16, 17 e 18 índices, se você quiser fazer isso com precisão.

Para desativar a luz noturna :

  1. Remova os bytes "10" e "00" dos Dados nos índices 24 e 25 respectivamente, para que todo o comprimento dos dados diminua
  2. Incremente o valor em 11 ou 12 índices em 1 (por exemplo: se fosse 01 FF, agora precisa ser 00 02, respectivamente)

Eu só precisava ativar / desativar o Night Light para o meu programa. Infelizmente, todas as outras opções ainda precisam ser pesquisadas. Mas parece que a principal opção para todos os outros ajustes para o trabalho (como alterar a temperatura e o cronograma) é aumentar adequadamente o tempo. Esses mods precisam ser executados em outro valor Data na chave de registro vizinha windows.data.bluelightreduction.settings.

hgrev
fonte
Você tem um script para ativar ou desativar isso por acaso?
metamorfose
não. eu escrevi um pequeno programa em C.
hgrev 02/04
ainda seria útil (pelo menos para mim) se você pudesse postar um link. Eu trabalho em C / C ++
metamorfose
você quer um código ou arquivo exe?
hgrev 19/04
Ou se estiver bem por mim. : _)
metamorfose