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

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

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

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

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

答案1

经过大量实验,我设法或多或少地找出了该注册表值的格式,并编写了一个 PowerShell 脚本来设置它。

在 21H2 上测试

并且可能适用于最早 2019 年更新的版本。

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 = (0x43, 0x42, 0x01, 0x00, 0x0A, 0x02, 0x01, 0x00, 0x2A, 0x06)
    $epochTime = [System.DateTimeOffset]::new((date)).ToUnixTimeSeconds()
    $data += $epochTime -band 0x7F -bor 0x80
    $data += ($epochTime -shr 7) -band 0x7F -bor 0x80
    $data += ($epochTime -shr 14) -band 0x7F -bor 0x80
    $data += ($epochTime -shr 21) -band 0x7F -bor 0x80
    $data += $epochTime -shr 28
    $data += (0x2A, 0x2B, 0x0E, 0x1D, 0x43, 0x42, 0x01, 0x00)
    If ($Enabled) {$data += (0x02, 0x01)}
    $data += (0xCA, 0x14, 0x0E)
    $data += $StartHour
    $data += 0x2E
    $data += $StartMinutes
    $data += (0x00, 0xCA, 0x1E, 0x0E)
    $data += $EndHour
    $data += 0x2E
    $data += $EndMinutes
    $data += (0x00, 0xCF, 0x28)
    $data += ($NightColorTemperature -band 0x3F) * 2 + 0x80
    $data += ($NightColorTemperature -shr 6)
    $data += (0xCA, 0x32, 0x00, 0xCA, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00)
    Set-ItemProperty -Path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings' -Name 'Data' -Value ([byte[]]$data) -Type Binary
}

格式(或者更确切地说A工作格式,因为“设置”应用可以创建多个略有不同的布局):

  • 10 个常量字节
  • 最后修改的 Unix 时间戳(以秒为单位),被损坏并分布在 5 个字节中,可能是可变长度的编码:
    • 一个字节,其位 0-6 是时间戳的位 0-6,但其最高位 7 始终被设置
    • 一个字节,其 0-6 位是时间戳的 7-13 位,但其最高位始终被设置
    • 同样,对于另外两组 7 位
    • 最后一个字节为时间戳 28-31 位,最高位未设置
  • 8 个常量字节
  • 仅当启用计划时:常量字节0x020x01
  • 3 个常量字节
  • 开始时间
  • 常量字节0x2E(可能是字段分隔符或类型)
  • 开始时间
  • 4 个常量字节
  • 末日时刻
  • 0x2E再次出现常量字节
  • 3 个常量字节
  • 夜间色温(开尔文),两个混乱的字节:
    • 一个字节,其低位 0 始终未设置,位 1-6 为温度的位 0-5,最高位 7 始终设置
    • 一个字节用于表示温度的第 6 位及以上,最高位未设置
  • 10 个常量字节

已在 1703/1709 上测试

并且可能最晚可在 2018 年更新后运行。

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 += (0xC2, 0x0A, 0x00) # Some users have reported this line necessary on 1709, was not needed originally
    $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
    # Alternate proposed version (see edit history), possibly version-specific?: $tempLo = ($NightColorTemperature - ($tempHi * 64)) * 4
    $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
}

使用它

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

. ./bluelightmanagement.ps1

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

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

结果

如果您在运行命令时打开了蓝光减少页面,则“设置”应用甚至会立即更新所有内容(强度/颜色滑块除外)。要让滑块看到更改,您需要重新打开“设置”应用。

答案2

对于 2023 年仍在寻找此信息的人来说,我能够弄清楚 Windows 11 上注册表项值中使用的格式。出于我的目的,我想从命令行打开/关闭它。我可以编写一个 Node.js 脚本来执行此操作:

class Nightlight {
  // ...

  async toggle(): Promise<void> {
    let newData: number[]
    const enabled = await this.enabled()
    const rawData = await this.getData()
    const data = hexToBytes(rawData.value)

    if (enabled) {
      newData = new Array(41).fill(0)
      newData.splice(0, 22, ...data.slice(0, 22))
      newData.splice(23, 43 - 25, ...data.slice(25, 43))
      newData[18] = 0x13
    } else {
      newData = new Array(43).fill(0)
      newData.splice(0, 22, ...data.slice(0, 22))
      newData.splice(25, 41 - 23, ...data.slice(23, 41))
      newData[18] = 0x15
      newData[23] = 0x10
      newData[24] = 0x00
    }

    for (let i = 10; i < 15; i++) {
      if (newData[i] !== 0xff) {
        newData[i]++
        break
      }
    }
  }

回购在这里:https://github.com/nathanbabcock/nightlight-cli

需要澄清的是,这与接受的答案之间的区别在于,最佳答案用于更改“预定夜灯”设置,而这是一个手动开/关切换。

答案3

经过几个小时的实验,结果如下:
如何在 Win10 1903 中打开/关闭夜灯

注册表项是

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

值名称: 数据

启用夜灯

  1. 分别将字节“10”和“00”添加到 24 和 25 索引上的数据,以便所有数据长度增加(不要更改现有值,只需添加两个字节)
  2. 将 11 或 12 个索引中的值增加 1(例如:如果它是 FF 01,那么现在它分别需要为 00 02)实际上似乎是时候了,它以小端格式用 8 个字节写入,所以如果您想精确地做到这一点,您还需要 13、14、15、16、17 和 18 个索引。

禁用夜灯

  1. 分别从 24 和 25 索引上的数据中删除字节“10”和“00”,因此所有数据长度都会减少
  2. 将 11 或 12 个索引中的值增加 1(例如:如果它是 FF 01,那么现在它需要分别为 00 02)

我只需要为我的程序打开/关闭夜灯,所以不幸的是,所有其他选项仍需要研究。但似乎所有其他调整(如更改温度和时间表)的关键选项是正确增加时间。这些修改需要在相邻注册表项 windows.data.bluelightreduction.settings 中的另一个数据值中完成。

答案4

针对 Windows 10 2004 进行更新。

主要是为了精确设定时间而创建的。19:57 比德国的“Tagesschau”早三分钟。

使用方法:编辑这个注释过的注册表文件,将其改为您的开始和结束时间。在控制面板中激活夜灯,因为我不知道这个注册表文件是否足够。导入它。您可以在控制面板中更改强度,只要您不更改时间设置,它就会坚持您设置的值,并在主显示控制面板中显示为“激活至 06:57”。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings]
; 4 bytes whatever, CloudStore Signature ?
"Data"=hex:43,42,01,00,\
; Might still be 64 Bit filetime, last time the setting was changed in the control panel
  0a,02,01,00,2a,06,c1,98,\
; 11 bytes whatever
  99,fb,05,2a,2b,0e,1f,43,42,01,00,\
; Acivated flag. It is is missing (i.e. ce,14, is here) is is off!
  02,01,\
; 3 bytes whatever
  ca,14,0e,\
; Starting Hour, 0x13 = 19
  13,\
; A constant
  2e,\
; Starting Minute, 0x39 = 57
  39,\
; 4 bytes whatever
  00,ca,1e,0e,\
; Ending Hour, 0x06 = 6 Uhr
  06,\
; A constant
  2e,\
; Ending Minute
  39,\
; 3 bytes constant
  00,cf,28,\
; Strength, here "33".
  9e,4a,\
; 10 bytes whatever (why so many trailing zeroes?)
  ca,32,00,ca,3c,00,00,00,00,00

相关内容