Enabling/disabling Windows 10 中的设备来自命令行

Enabling/disabling a device in Windows 10 from command line

我有一个特定的硬件,我想在每次 Windows 重新启动时将其禁用并重新启用。我创建了一个批处理脚本,它应该这样做,然后 运行ning 我的程序:

cd %~dp0
devcon.exe disable "PCI\VEN_1002&DEV_687F"
timeout /t 3
devcon.exe enable "PCI\VEN_1002&DEV_687F"

runMyWindows.exe --totally-not-virus

首先我不确定 devcon.exe 是否适合此应用,因为我根本没有编写 Windows 脚本的经验。

但是,我注意到这些命令并不能完全完成工作,因为我的 runMyWindows.exe 程序无法正常工作,直到我转到 Windows 设备管理器并手动禁用和重新启用此设备。

我在这台机器上只有 1 个用户在 "Administrator" 组中,除了双击 .bat 文件外,我没有以任何特殊方式 运行 使用此脚本,或者在重新启动的情况下,它是启动文件夹中的 运行 (C:\Users\oxxo\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)。

有没有办法在我的批处理脚本中正确执行此操作,该脚本应该在 Windows 启动时自动 运行?

由于 Windows 10 中的安全性 'improvements',当然还有 Windows VistaUser Account Control 的引入,我认为您需要 Run as administrator,而不仅仅是成为管理员组的成员。

一般应该理解为Run as administrator表示Run as the user with the account name Administrator而不是Run as any user who holds membership of the Administrators group

Run as administrator,右键单击批处理文件,然后从上下文菜单中 select Run as administrator

还有其他方式 运行 作为管理员。

  • 您可以使用自提升批处理文件,它通常使用 PowerShellWSH 辅助函数。
  • 您可以使用 Task Scheduler 并选择适当的触发器和帐户信息,(可能使用 SYSTEM 帐户)

此外,您需要确保 DevCon.exe 是:

  • 除了批处理文件,"%~dp0DevCon.exe" Disable "PCI\VEN_1002&DEV_687F*"
  • 在 %PATH% 中定义的位置,DevCon Disable "PCI\VEN_1002&DEV_687F*"
  • 使用其完整路径调用,"C:\Tools\DevCon.exe" Disable "PCI\VEN_1002&DEV_687F*"

在上述所有情况下,请注意您的示例中缺少的星号

大多数阅读此主题的人不会发现其他答案非常有用,因为它主要是关于如何 运行 问题中的脚本具有管理员权限。我将尝试在这里回答隐含的问题:

Enable/disable 通过命令行的设备

我发现使用 devcon.exe (6mb) 最简单,如问题:

set HARDWARE_ID="PCI\VEN_8086&DEV_4229&SUBSYS_11018086&REV_61"
devcon disable %HARDWARE_ID%
timeout /t 3
devcon enable %HARDWARE_ID%

devcon.exe 需要管理员权限。

从哪里获得 devcon

它是 Windows 驱动程序开发工具包的一部分。不幸的是,官方资源要求您下载 1gb 的 SDK。我能够通过遵循此处的一个答案来解决这个问题:https://superuser.com/questions/1002950/quick-method-to-install-devcon-exe

一旦你拥有它,请确保 devcon.exe 在你的 %PATH% 上。我把我的放在 C:\Windows\System32\.

找到您要操作的设备的硬件 ID

使用管理员权限打开命令提示符并执行 devcon hwids *,这将打印所有设备及其相应的 ID。这将产生大量的输出。使用命令提示符搜索功能查找您需要的内容。这是我感兴趣的部分:

PCI\VEN_8086&DEV_4229&SUBSYS_11018086&REV_61&6AB551C&0&00E1
    Name: Intel(R) Wireless WiFi Link 4965AGN
    Hardware IDs:
        PCI\VEN_8086&DEV_4229&SUBSYS_11018086&REV_61
        PCI\VEN_8086&DEV_4229&SUBSYS_11018086
        PCI\VEN_8086&DEV_4229&CC_028000
        PCI\VEN_8086&DEV_4229&CC_0280
    Compatible IDs:
        PCI\VEN_8086&DEV_4229&REV_61
        PCI\VEN_8086&DEV_4229
        PCI\VEN_8086&CC_028000
        PCI\VEN_8086&CC_0280
        PCI\VEN_8086
        PCI\CC_028000
        PCI\CC_0280

选择一个足够具体的 ID 并通过以下操作检查它是否有效:

devcon find "PCI\VEN_8086&DEV_4229&SUBSYS_11018086&REV_61"

如果只找到 1 台设备,而这正是您想要的设备,那很好。请注意,您通常会希望使用引号转义硬件 ID。

奖励:运行在启动或开机时运行 .bat 脚本

在我的例子中,我还需要在计算机关机或睡眠后启动时 运行 这个脚本。我给了上面的脚本合理的权限,并使用 Task Scheduler 来 运行 它在登录和启动时,在它的术语中: https://www.sevenforums.com/tutorials/67503-task-create-run-program-startup-log.html?ltr=T

PnPUtil 也可以完成这项工作,无需下载 SDK 或任何其他相关内容。 自 Vista 起包含在 Windows 中:

https://docs.microsoft.com/de-de/windows-hardware/drivers/devtest/pnputil

例子

禁用设备实例 ID 指定的设备:

pnputil /disable-device "USB\VID_045E&PID_00DB&870CE29&0&1"

启用设备实例 ID 指定的设备:

pnputil /enable-device "USB\VID_045E&PID_00DB&870CE29&0&1"