绕过“发现新硬件向导” /设置Windows自动安装驱动程序


9

十年的大部分时间里,我的主板终于死了,所以我买了一个二手系统。我将旧的硬盘驱动器和声卡放入新系统中,并连接了旧的键盘和鼠标(其余组件(CPU,RAM,主板,视频卡)均来自新系统)。

我事先知道,要启动Windows并为新硬件安装驱动程序是一个挑战(特别是因为基础组件是新的),但是我什至无法尝试完成安装驱动程序的工作,例如视频卡,因为键盘和鼠标不起作用(在BIOS屏幕上,在DOS模式下,在Windows 7中,在XP的启动菜单等中,它们都可以工作,而在Windows XP本身中不起作用)。

每当我尝试以正常或安全模式启动XP时,都会弹出一堆气球,显示检测到的所有新硬件,以及一个用于处理器的“ 新硬件发现向导 ”(显然,它必须为最低级别的组件安装驱动程序上)。不幸的是,我不能单击“下一步”,因为键盘和鼠标仍无法工作,因为尚未安装主板驱动程序(用于PS / 2或USB端口)。我什至尝试了串行鼠标,但无济于事-再次,它确实可以在DOS,7等环境下工作,但对XP却无效,因为它没有安装串行端口驱动程序。

我尝试在Windows 7下安装SOFTWARE和SYSTEM配置单元,以便手动设置要忽略的“未签名驱动程序警告”(使用我发现引用的两个驱动程序签名策略设置)。那行不通;我仍然得到向导。

它们甚至不是花哨的,专有的,第三方的或未签名的驱动程序。它们是Windows附带的驱动程序-因为倾向于使用CPU,RAM,IDE控制器等驱动程序。键盘和鼠标驱动程序是那时的通用驱动程序(但是就像我说的那样,它们是无关紧要的,因为尚未安装它们所连接的端口的驱动程序)。

显然,在过去几年中的某个时间点,更改了设置,以使Windows在检测到新硬件时始终提示我。(它还配置为在异常关闭时显示Shutdown Event Tracker,因此我必须将其关闭,以便甚至可以看到桌面。)

哦,我尝试删除所有PNF文件,以便重新生成它们,但这也无济于事。

有谁知道如何重置Windows,以便至少在尝试出现故障之前提示我自动为新硬件安装驱动程序?相反,有谁知道关闭自动驱动程序安装的确切信息(并通过向导提示)?

非常感谢。


请明确说明,否则可能会在答案中出现,我不是在谈论下面的对话框,而是在下面的对话框。

替代文字

替代文字


哦,要避免出现以下任何建议,请使用设备管理器禁用,卸载,修复等。所有设备都不可行,因为键盘和鼠标(或任何其他输入设备)是否是“如果安装/工作正常,那么我将如何准确执行任何操作(例如使用设备管理器)?

Answers:


10

我终于在星期五在新的旧系统上运行了Windows XP!oo!(只花了5½个月。)

我将陈述修复此问题所需的具体步骤,以防其他人遇到类似的问题,尽管不幸的是,由于越来越多的沮丧和不耐烦,我最终还是采取了焦土方法,一次执行了多个步骤。但是,我确实保留了我使用的工作文件,并列出了所做的更改,因此,我将列出一些可以尝试的方法,或者至少应该有所帮助。

(对于高级用户来说,这显然是高级的东西;尽管即使高级用户也可能将其搞得很糟,因此是初始备份步骤。)


要解决此问题,请将包含Windows现有安装的硬盘驱动器放入新系统,并且Windows不会自动安装硬件驱动程序,并提示用户安装未签名的驱动程序,即使是应该签名的驱动程序也是如此。此外,由于Windows尚未安装键盘或鼠标(或其他输入设备)的驱动程序,因此用户无法接受对话框。


这是tl; rd版本:

  1. 备份注册表配置单元。
  2. 禁用所有程序,驱动程序和服务。
  3. 设置内容(例如任务栏),以便您可以看到所有内容(不隐藏任何信息)。
  4. 自动运行.BAT文件,可以轻松进行更改和执行在线(in-OS)任务。
  5. 使用宏/脚本应用程序可以自动执行按键和按钮单击操作,因为您无法自己完成操作。
  6. 确保所有系统文件都存在。
  7. 手动删除有问题且不再存在的硬件。

    • 引导至(纯)DOS或其他操作系统,然后将注册表配置单元的备份副本复制到另一个位置。这包括%systemroot%\System32\CONFIG\*%userprofile%\NTUSER.DAT

    • 确保正确设置了BOOT.INI和SystemBootDevice[HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet00 * \ Control]中的驱动器/分区设置,因为您的系统驱动器现在可能位于与以前不同的驱动器/分区上(在我的情况下, (r)磁盘以前为0,但由于新驱动器而现在为1)。

    • 挂载适当的注册表配置单元,并禁用所有多余的自动运行程序,尤其是那些会抛出窗口和使您的视图变得模糊的东西,因为您将无法最小化它们或单击其他窗口/对话框到前面(您可以必须简化以解决此类问题)。您不必删除自动运行的条目,可以禁用它们,以便在Windows运行并希望再次自动运行它们时,它们仍然存在(特别是对于具有大量命令的条目)行参数):

      • 对于Run键,您可以简单地在#命令开始处输入一个字符或其他内容。这样,Windows将无法运行它,因为它不是有效文件,并且将忽略它。

      • start对于任何无关的驱动程序和服务(尤其是那些不再存在的硬件),请安装SYSTEM配置单元并将参数设置为Disabled(dword:4)。

      • 通过在命令的开头添加a 来禁用…\ Control \ Session Manager中的PageDefrag等(尽管请放开,因为如果您最终必须通过重置按钮重新启动,则需要检查/修复驱动器)。BootExecute#autocheck

      • 无需删除Startup文件夹中的任何快捷方式,只需将它们移到其他位置即可。  

    • Windows设置为通过安装软件和NTUSER注册表配置和设置,无论司机签名的安装驱动程序\Software\Microsoft\Driver Signing,并\Software\Microsoft\Non-Driver Signing以BIN:00。

    • 您将要看到任务栏和通知区域,因此通过安装NTUSER并编辑\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2以设置第9个字节以使位0关闭且位1处于打开状态,可以打开最顶部并关闭自动隐藏功能(0x7A将显示最大信息)。另外,禁用任何其他任务栏合并/操作程序,例如PCMag的TrayManager(也许在他们开始出售其实用程序之前就已经知道了)。
    • 挂载SOFTWARE配置单元,并添加一个自动运行项以在启动时运行.BAT文件(无缘无故,我称之为mine C:\t\j.BAT)。现在,您无需任何直接输入即可轻松让Windows执行任务。当然,它需要重新启动到另一个操作系统,修改批处理文件,然后再次启动Windows进行更改,但这比没有在Windows中执行任何操作要好。;-)(您可以注释掉某些内容,而不仅仅是删除它们。)在批处理文件的末尾添加命令以重新启动Windows,例如shutdown -t 10 -r。别忘了,否则您将不得不按下重置按钮!

    • 在批处理文件(例如j.bat)中,执行某些操作,例如导入任何.REG文件(您可以像在批处理文件中一样在另一个OS中离线编辑这些文件)。让批处理文件运行设备管理器,并最大化窗口(使用Nircmd之类的工具),以使自己有机会查看硬件的当前状态。(尝试使用QRes之类的命令行工具将分辨率设置为视频驱动程序可以达到的最大分辨率(此时可能是通用VGA适配器),例如1024x768。)您还可以重新注册.DLL文件以进行修复一些问题,尤其是与Windows Update相关的问题。

    • 您不希望批处理文件快速而疯狂地运行,因此,您将希望获得一个命令行工具,该工具可以暂停给定的秒数以暂停脚本执行—不,该pause命令不好,因为它需要按一个键才能继续。(我使用了几年前编写的程序,但是Internet上有很多可用的程序,或者只是使用常见的hack。)

    • 获取宏录制器/脚本应用程序,例如HotkeyMasterWinMacroMacroMakerAutoHotkeyAutoIt!等等,并将其配置为执行所需的键盘或鼠标操作(通过这种方式,您可以在Windows中“执行”操作,而实际上没有可用的任何输入设备)。您将需要对其进行配置,以通过标题和/或类和/或控件来检测某些窗口或对话框,并相应地执行某些鼠标单击或按键操作。例如,您可以让它自动检测驱动程序确认对话框并触发单击NextContinue纽扣。(请确保将宏应用设置为在启动时运行,而不是在.BAT文件中运行,以确保在Windows检测到硬件并开始提示驱动程序时它们已在运行;或者,在Windows的开头运行它们。使用start命令避免该批处理文件被阻止,因为它们不会退出。)
    • 确保所有必需的系统文件都已就位。运行(通过批处理文件)sfc /scannow。确保将Windows光盘放入驱动器中-假设Windows甚至安装了CD / DVD驱动程序。您还可以尝试在离线时手动复制所有丢失的文件。例如,我从上次XP备份中复制了所有文件,并指定覆盖现有文件。这样,所有丢失的文件都会还原(尤其是在以下目录中:

      • C:\ Windows
      • C:\ Windows \ INF
      • C:\ Windows \ Driver缓存
      • C:\ Windows \ ServicePackFiles
      • C:\ Windows \ System32
      • C:\ Windows \ System32 \ dllcache
      • C:\ Windows \ System32 \ Drivers

      • (我还偶然恢复了以下与硬件安装无关的目录,直到它终于再次开始工作。巧合?我不知道。)

      • C:\ Windows \ Assembly
      • C:\ Windows \ Microsoft.NET
      • C:\ Windows \ WinSxS
      • C:\ Windows \ Help
      • C:\ Windows \ System32 \ WBEM

      • (您实际上可能想删除或重命名C:\ Windows \ System32 \ CatRoot *)

    • 删除C:\ Windows \ INF中的所有.PNF文件。Windows下次需要安装驱动程序时,Windows将从现有的.INF文件中重建它们(此时仍然是每次引导)。这类似于在页面无法正确显示时清除浏览器缓存,以确保您获取并使用了文件的最新副本。

    • 作为最后的选择,获取并使用Microsoft工具DEVCON删除某些设备,以便Windows可以尝试从头开始安装硬件。但是,首先,您需要运行命令(通过批处理文件)DEVCON findall * > C:\t\devcon.log以转储所有硬件及其对应ID的列表。这样,您可以编译要删除的硬件的正确的自定义列表。要删除的重要设备包括:

      • “ * ACPI *”
      • “ USB \ ROOT_HUB *”
      • “ SERENUM \ MOUSE *”
      • VEN_8086
      • “ HID *”
      • “ * TUNMP *”
      • “ PCI \ VEN_1102 *”
      • “ PCI \ VEN_1033 *”
      • “ PCI \ VEN_1011 *”
      • “ PCI \ VEN_1186 *”
      • “ PCI \ VEN_11AB *”
      • “ PCI \ VEN_1274 *”
      • “ PCI \ VEN_5333 *”

      • (这些是与主板相关的主要设备,例如处理器,端口,总线,输入设备,网卡,硬盘驱动器和光盘驱动器。)


正如你所看到的,它的(这并不奇怪)一个巨大的痛苦,如果你花掉你的系统驱动器到一个新的系统(读主板),并希望避免不必重新安装,以让Windows重新运行。没有输入方法会很困难,但并非不可能。这需要花费大量时间,精力,耐心,工具,对细节的关注和谨慎,但是它有可能的,并且会带来回报(推迟进行完全重新安装,从而使谁知道随着时间的流逝将进行数千次自定义) )值得。

幸运的是,由于我还没有准备好重新安装,我终于设法使其工作。现在,我不仅可以再次使用Outlook Express(并下载并清除帐户中堆积的5,000封左右的电子邮件),而且可以在安装好的旧版VS2003副本中再次进行一些编程。(并不是说我不习惯Windows 7;实际上有一段时间,我回到XP中感觉很奇怪,但是我又回到了家,就像搬进了一年的宿舍,然后又搬回了您的宿舍。家里的卧室。)


1

我将在此处分享我的答案,脚本已正确显示在MSFN网站中:http ://www.msfn.org/board/topic/49514-disable-found-new-hardware-wizard/?do=findComment&comment=1132792

我制作了一个AutoIt3脚本https://www.autoitscript.com/site/autoit/downloads/,该脚本将继续运行所有“新硬件向导”窗口,这些窗口接受未签名的驱动程序,取消WinXP CD提示并跳过多个选项(连接到Internet等) ,以便检测并安装鼠标和键盘。应将编译后的自动脚本EXE复制到“开始”(在“开始菜单”中)文件夹以自动执行。脚本字符串必须适应本地Windows语言。可能还有一些Alt-LETTER组合。我的示例在SPANISH WinXP中工作。希望它对其他人有帮助,在使鼠标和键盘起作用之后,必须删除脚本(或将其移动到其他文件夹):

$asistente= "Asistente para hardware nuevo encontrado" ;"Found New Hardware Wizard"
$instalacion= "Instalación de hardware"
$archivos= "Archivos necesarios"
$cambio= "Cambio de configuración del sistema"

while 1
sleep(200)

if WinExists( $cambio) then
   WinActivate( $cambio)
   sleep(200)
   Send("!n")        ; (press Alt-n)
endif

if WinExists( $instalacion) then
   WinActivate( $instalacion)
   sleep(200)
   $text=WinGetText( $instalacion)
   if StringInStr( $text, "El software que está instalando para este hardware") then ;"The software..."
     Send("!c")
    endIf
;  MsgBox($MB_OK, "Autoit Status", $text & stringinstr( $text, "está"), 2 )  ;  sleep(2000)
endif

if WinExists($archivos) then
   WinActivate($archivos)
   sleep(200)
   $text=WinGetText( $archivos)
   if StringInStr( $text, "Se necesita el archivo") then
       ControlClick( "Archivos necesarios", "", "[ID:2]" )
    endIf
endif

if WinExists( $asistente) then
   WinActivate( $asistente)
   sleep( 200)
   $text=WinGetText( $asistente)

   if StringInStr( $text, "Desea que Windows se conecte a Windows Update") then ;"Can Windows connect to Windows Update to search for software?"
;     ControlCommand( $asistente, "", "[ID:8104]", "Check", "")
     sleep(150)
;     ControlClick( $asistente, "", "[ID:12324]")
     Send("!n")
     sleep(100)
     Send("!t")
     sleep(250)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "Este asistente le ayudará a instalar software para:") then ;"This wizard"
     sleep(150)
     Send("!t")
     sleep(250)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "No se puede instalar este hardware") then ;"Cannot Install this Hardware"
     ControlCommand( $asistente, "", "[ID:1030]", "UnCheck", "")
     sleep(200)
     ;ControlClick( $asistente, "", "[ID:12325]")
      Send("{ENTER}")
     sleep(200)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "desea que haga el asistente?") then ;"What do you want the wizard to do?"
   ControlCommand( $asistente, "", "[ID:1049]", "Check", "")
   sleep(200)
   ControlClick( $asistente, "", "[ID:12324]")
   sleep(200)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "Se recomienda que se conecte a Internet para que el asistente") then
   ControlCommand( $asistente, "", "[ID:1065]", "Check", "")
   sleep(200)
   ControlClick( $asistente, "", "[ID:12324]")
   sleep(200)
   endif

   $text=WinGetText( $asistente)
   if StringInStr( $text, "Finalizar para cerrar") then ;"Click Finish to close the wizard."
   ControlClick( $asistente, "", "[ID:12325]")
   sleep(250)
   endif
endif

wend 

不要在没有正确格式化的情况下简单地复制粘贴您的答案,修复格式很容易,因此此答案在这里看起来不错。
cascer1 2013年

抱歉,cascer1,我自己编写了该代码,格式化对我来说还不错,除了最后缺少一些IF缩进。
isidroco

我不记得是否早在2011年就开始使用AutoIt(在我的情况下为AutoHotkey),否则我肯定会使用它。👍
Synetech

0

仅当系统驱动程序路径中没有匹配的驱动程序时,向导才会弹出。根据technet的介绍,您必须脱机修改HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ DevicePath来添加包含驱动程序infs的文件夹,以便在弹出向导之前自动搜索它们。

如果不起作用,则重新安装所有集成的驱动程序可能会更简单。


看起来很有希望,但不幸的是设置已经正确(%SystemRoot%\inf)。实际上,中的条目CurrentVersion\Setup也不错(如DriverCachePathInstallation Sources)。我甚至确信,在文件中INFDriverCache以及DLLCache全部呈现并且占了。Windows 应该能够找到并安装驱动程序(至少对于基本组件而言,即使视频卡或比Windows更新的东西也没有),因此它没有驱动程序。我似乎无法获得Windows检测并安装端口或输入设备的驱动程序
Synetech 2011年

也许您还没有检查他们的订单?阅读。看来您遇到了类似的问题。我相信您可以通过安装配置单元并重新排序DevicePath条目来修复它,并使Windows首先找到键盘和鼠标。(三年后反馈;))
Jet

0

对于此问题,我在启动时添加了Teamviewer,并通过它安装了缺少的硬件(/ w键盘和鼠标)。


2
这将需要先安装它,再使用它,或者使用键盘和鼠标来安装它。无论哪种方式,远程访问可以是一个好主意,但不会在这样的情况下帮助。
Synetech

@Synetech,无法通过脚本自动安装吗?
Pacerier,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.