通过注册表配置 Windows Creators Update Night Light

Dav*_*ski 15 windows windows-registry powershell chef windows-10

如何通过注册表配置 Windows 10 (Pro) Creators Update 中的新夜灯功能?

我想在使用我选择的配置管理工具 (Chef) 时自动配置新的/更新的安装。通过 Sysinternals Process Monitor 进行的系统检查显示一个二进制Data密钥在HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current.

非常感谢有关配置夜灯功能的不同注册表、PowerShell 或其他自动化友好方式的帮助!

Ben*_*n N 14

通过一系列实验,我设法或多或少地确定了该注册表值的格式(有关详细信息,请参见下文)。

我制作了这个 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
}
Run Code Online (Sandbox Code Playgroud)

要使用它,请将其另存为.ps1文件并按照PowerShell 标记 wiki的启用脚本部分中说明进行操作。然后,您可以通过点源导入脚本的内容:

. ./bluelightmanagement.ps1
Run Code Online (Sandbox Code Playgroud)

然后使用它提供的类似 cmdlet 的功能:

Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000
Run Code Online (Sandbox Code Playgroud)

结果

如果您在运行命令时打开了蓝光减少页面,则设置应用程序甚至会立即更新所有内容(颜色滑块除外)。

格式

  • 4 个常量字节 - 似乎是所有CloudStore值共有的签名
  • 设置的最后修改时间为 64 位FILETIME值(8 字节,小端)
  • 8 个以上的常量字节
  • 如果启用了蓝光减少功能,则字节2然后1如果禁用它就消失了
  • 3 个以上的常量字节
  • 开始时间的小时(1 个字节)
  • 1 个常量字节
  • 开始时间的分钟(1 字节)
  • 4 个常量字节
  • 结束时间的小时(1 个字节)
  • 1 个常量字节
  • 结束时间的分钟(1 字节)
  • 3 个常量字节
  • 开尔文夜间色温,经过一些奇怪的二进制数学运算(2 字节)
  • 7 个常量字节

色温以小端存储为两个字节。高位是温度除以64得到的整数部分。低位是余数乘以2,再加128。要从字节计算温度,高字节乘以64并添加将低字节和 128 之间的差除以二时得到的结果。

  • 为什么 Windows 不提供一个漂亮的 CLI 界面来更改设置??? (3认同)
  • 我还发现,使用 NirSoft http://www.nirsoft.net/articles/find_modified_time_registry_key.html 中的此实用程序,当我激活和停用夜灯功能时,您指定的注册表项根本没有被修改。也许微软在上次更新中改变了它? (2认同)
  • @Gaboik1这个注册表值有点奇怪,因为它的布局变化很大;我描述的格式只是一种有效的格式,不一定是唯一的一种。我不知道有什么方法可以一致地从此值中读取数据,但我在 Windows 10 1709 上进行了测试,并且使用此脚本来设置设置仍然有效。 (2认同)