阻止 Windows 7 在 USB 3.0 集线器上启用省电功能

scr*_*lli 14 usb windows-7 power-management

我在台式计算机上安装了 USB 3.0 集线器。

我用它来连接外部 USB 3.0 磁盘以进行备份,但我遇到了一个问题:Windows 7 默认情况下为所述集线器启用省电功能,这会导致磁盘在密集 I/O 操作期间断开连接(例如我在 8 时的计划备份)下午)。

我可以通过执行以下操作禁用此设置:
转到设备管理器 > 右键单击​​集线器 > 属性 > 电源管理 > 取消选中允许计算机关闭此设备以节省电源

太糟糕了,每次我重新启动计算机时,都会再次选中该框。有没有办法永久禁用此设置?

编辑:我用上面设置的实际英文名称编辑了我的问题(以前不是很清楚)。

编辑彼得菲茨杰拉德回答准确地描述了我到目前为止所做的事情。每次我重新启动复选框时,都会再次标记,我正在寻找一种永久禁用它的方法。

编辑:阅读Synetech回答后,我能够找到更改设置时更改的注册表项,即:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\FLUSB\ROOT_HUB_FL30\5&f0b5d82&1\Device Parameters\WDF\IdleInWorkingState (DWORD)
Run Code Online (Sandbox Code Playgroud)

每当我取消设置复选框时,管理控制台都会更改此键,以及当我通过进程系统停用和重新激活设备时。太糟糕了,授权中的任何设置都被神秘地忽略了,即使拒绝每个人的所有特权,密钥也总是设置为 1。

我尝试在线搜索,并找到了此 Microsoft 指南。尝试设置他们描述的每个键都没有帮助,似乎这些键被忽略了。我什至试图从在线找到的现有.INF 中复制正确的密钥路径(将/WDF哪些密钥放在父项下,哪些键放在父项下),就像这样,但我什么也没得到。

其他有用的信息:

  • 在 下HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\FLUSB\ROOT_HUB_FL30\,我也有这两个声音:5&f0b5d82&05&21f33a01&0,这似乎反映了上面的键的配置。IdleInWorkingState不过,唯一的变化是上面描述的那个。
  • 当我手动编辑寄存器时,设备管理器中复选框的值不会改变,它必须缓存在某处。

Syn*_*ech 6

电源要求

我在台式计算机上安装了 USB 3.0 集线器。我用它来连接外部 USB 3.0 磁盘以进行备份,但我遇到了一个问题:Windows 7 默认为所述集线器启用省电功能,这会导致磁盘在大量 I/O 操作期间断开连接

您确定驱动器正在关闭以进行电源管理,而不仅仅是因为它试图消耗过多的电量吗?您可以通过设备管理器检查 USB 集线器的功耗(图 1 和图 2)。验证集线器可为每个端口提供的电源是否足以用于外部驱动器。如果没有,您可以使用 USB Y 型适配器(图 3 和图 4)从两个端口获取电源。(大功率外置驱动器通常带有专门用于此目的的 Y 型适配器,因此请仔细检查复选框和手册。)

追踪疾病

我可以通过执行以下操作禁用此设置:转到设备管理器 > 右键单击​​集线器 > 属性 > 电源管理 > 取消选中允许计算机关闭此设备以节省电源

太糟糕了,每次我重新启动计算机时,都会再次选中该框。有没有办法永久禁用此设置?

如果禁用该设置确实解决了手头的问题,那么现在的问题是让它坚持而不是恢复。一种选择是使用Process Monitor 之类的东西,并将过滤器设置为相关的注册表项 ( HcDisableSelectiveSuspend) 以查看哪些程序对其进行了更改,以便关闭该选项(应将其设置1禁用电源管理)。

这将是理想的方法,因为它可以追踪设置恢复的实际原因。不幸的是,只能找到原因;实际上修复它可能并不容易,甚至不可能。例如,Windows 可能会在关机时自动恢复它,或者更有可能在启动期间检测到硬件时将其设置为默认值。

定义“设备”;检查 USB 端口

顺便说一下,您是否将驱动器插入不同的 USB 端口?至于Windows正在而言,“已知装置”是一个配对设备+端口,因此,如果您之前已经将一台设备到端口A,并让Windows安装驱动程序,那么你以后插上节省设备进港B, Windows 会将其视为新设备并(重新)为其安装驱动程序以及默认设置. 因此,当您将其插入新端口时,您必须重新设置所有设置。之后,Windows 应该记住新旧端口的设置。您可能希望将驱动器一次插入每个 USB 端口并对其进行配置,这样无论您将它们插入哪个端口,都可以确保将来它们都已配置完毕。(驱动器号也是如此,但由于可移动卷的驱动器号的短暂性质,这些往往不太可靠。

治疗症状

阻止 Windows 恢复设置的一种方法是简单地拒绝对设置的访问。这需要使用注册表编辑器,如果您不小心,这可能会带来风险,因此在进行更改之前采取通常的备份预防措施并仔细检查(尤其是在删除任何内容时 - 无论如何您都不应该在这里做)。

  1. 首先,您需要找到相关的设备 ID:

    1. 设备管理器中打开集线器USB Root Hub Properties对话框(图 1),然后切换到Power Management选项卡
    2. 更改的值Allow to turn off复选框(没关系什么,只是改变它),但点击OK(图5)
    3. 运行 Process Manager 并设置过滤器(图 6):
      1. Ctrl+L
      2. 设置为Path, contains, DisableSelectiveSuspend,Include
      3. 点击 Add
      4. Operation, contains, setvalue,设置另一个过滤器Include
      5. Add
      6. 点击 OK
    4. 清除当前捕获 ( Ctrl+ X) 并启动 ( Ctrl+ E) 如果它尚未运行
    5. 切换回设备管理器对话框并单击OK
    6. 切换回进程监视器并停止捕获 ( Ctrl+ E)
    7. 记下GUID后面的四位设备 ID (图 7);在这个例子中,0055

      HKLM\System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}\0055\HcDisableSelectiveSuspend
      
      Run Code Online (Sandbox Code Playgroud)
  2. 单击 Process Monitor 中的行,按Ctrl+J打开 Regedit 并直接导航到该键(如果不起作用,则打开 Regedit 并手动导航到该键)

  3. 将设置配置为您希望的最后一次设置(取消选中“电源管理”选项卡中的框并单击OK

  4. 现在锁定该设置并阻止对密钥的访问(图 8):

    1. 右键单击 Regedit 左窗格中的键
    2. 选择权限
    3. 点击 Advanced
    4. 联合国-检查Inherit from parent框,然后点击CopyOK
    5. 返回常规(非高级)权限对话框,单击顶部列表中列出的每个组和用户,对于每个组和用户,取消Full Control选中底部列表中的框

现在没有人,不是你,甚至系统本身都不能修改设置(但他们仍然可以读取它),所以在将它设置为只读之前,它应该始终保持你设置的内容。(如果需要,您可以通过在“高级安全设置”对话框中删除特定于项目的权限并重新选中该Inherit from parent框来恢复写访问权限。

当然,之后您需要重新启动以确保设置保持不变。

最后一招

如果驱动器仍在关闭,请尝试按照上述方法将其设置HKLM\System\CurrentControlSet\Services\usb\DisableSelectiveSuspend1只读。这个设置在普通系统中不存在,也没有HcDisableSelectiveSuspend 那样被记录(唯一的引用是在社区页面上),但 Windows 似乎之前确实查询过这个值HcDisableSelectiveSuspend(图 7),所以值得一试。

夏洛克·福尔摩斯

此时,如果您愿意,您可以返回并诊断潜在问题,而不仅仅是治疗症状。您可以使用上面的过滤器在启动期间(选项?启用引导日志记录)和关闭期间(稍微复杂一点)对注册表项进行进程监视器日志写入访问,以准确找出正在更改它的内容。然后你可以交叉手指,希望有一种方法可以防止它。


插图

图 1:设备管理器中 USB 集线器的屏幕截图

设备管理器中 USB 集线器的屏幕截图

图 2:USB 集线器上的功耗屏幕截图

USB 集线器上的功耗屏幕截图

图 3:USB Y 型适配器的照片

USB Y 型适配器的照片

图 4:USB Y 型适配器使用示意图

USB Y 型适配器使用示意图

图 5:USB 集线器电源管理选项卡的屏幕截图

USB 集线器的电源管理选项卡的屏幕截图

图 6:必要的进程监视器过滤器

所需进程监视器过滤器的屏幕截图

图 7:进程监视器结果中相关注册表项的屏幕截图

Process Monitor 结果中相关注册表项的屏幕截图

图 8:将注册表项设置为只读的流程图

将注册表项设置为只读的流程图


scr*_*lli 3

由于其他解决方案均无效,因此我使用以下解决方法解决了问题:

用于禁用该设置的 Powershell 脚本

编辑在互联网上找到的脚本,我构建了这个:

C:\powerMgmt.ps1

$hubs = Get-WmiObject Win32_USBHub
$powerMgmt = Get-WmiObject MSPower_DeviceEnable -Namespace root\wmi | where {$_.InstanceName.Contains($hubs.PNPDeviceID)}

foreach ($p in $powerMgmt)
{
    $p.Enable = $False
    $p.psbase.Put()
}
Run Code Online (Sandbox Code Playgroud)

在启动时以提升的权限执行

上述脚本需要提升权限,因此我在 Windows 7 的任务计划程序中创建了一个任务,以便在使用我的用户登录时运行以下脚本(以管理员用户身份):

C:\powerMgmt.cmd

powershell -file C:\powerMgmt.ps1
Run Code Online (Sandbox Code Playgroud)

整个事情有点像黑客;它并不优雅,也不能帮助我理解问题,但它解决了问题。