ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

虚拟机密码忘了?Windows/Linux全平台重置方法与避坑指南

虚拟机密码忘了?Windows/Linux全平台重置方法与避坑指南 凌晨一点我对着VMware Workstation里那台三个月没开机的Windows Server虚拟机连续输错了三次密码。屏幕上弹出“账户已锁定”的提示时我才后知后觉地意识到当初搭建测试环境时随手设的那串复杂密码早就被我丢进记忆的黑洞了。类似的事这些年经历过不少。给客户演示前发现Linux虚拟机的root密码不对、同事离职后留下一台密码未知的虚拟机、自己搭的实验环境隔了半年再启动……搞虚拟化时间长了总会撞上“虚拟机密码忘了”这种不算大但足够让人头疼的事。这篇文章就把我这些年用过的虚拟机密码重置方法系统梳理一遍覆盖VMware Workstation和VirtualBox里最常见的Windows、Linux虚拟机顺带说清ESXi、Hyper-V、KVM等环境下的操作差异。老规矩先强调一下以下方法只适用于你本人有权限管理的虚拟机动手之前最好确认一下快照和备份情况避免重大数据损失。1. 密码是怎么丢的先分清场景再动手1.1 三种高频丢密码场景我复盘了手头遇到的故障工单丢密码基本逃不出下面三种情况。一是测试环境长期搁置。建虚拟机的时候觉得“反正就测试用密码随便设一个”结果这个环境一放就是几个月等再需要它的时候当初的随便设已经变成了完全想不起来。我处理过最多的就是这种。二是交接不完整。同事离职、团队换人虚拟机目录拷过来了账号密码却没同步到密码本。更尴尬的是有些管理员建用户时用的是自己的姓名缩写加上一串纪念日除了他自己谁也猜不到。三是密码策略联动把账户锁死。比如公司域控要求定期改密虚拟机里的本地账户跟着设置了密码过期一段时间没登录等你再连上去的时候密码早就过了有效期或者有人用远程桌面连虚拟机时输错次数太多账户被Windows锁定策略直接禁用了。不管是哪种处理思路其实一致先判断有没有更省事的恢复路径没有的话再走离线重置。1.2 动手之前必须确认的三件事丢密码的时候人容易慌一慌就想往grub、往WinRE里塞参数。但我的建议是花两分钟先确认三件事这三件事没搞清楚就动手很容易白忙活半小时甚至把系统搞到进不去。第一件事看看有没有快照。VMware Workstation里点“虚拟机”菜单下的“快照”打开“快照管理器”能看到这台虚拟机存在哪些时间点的快照。如果某个快照的创建时间点是在你“还记得密码”的那段时间直接回滚到那个快照是最快的重置方案。代价是快照之后新增的数据和系统改动全都会丢所以只适合测试环境或不重要的演示虚拟机。VirtualBox也有类似的快照功能操作逻辑一样。第二件事磁盘有没有加密。虚拟机里的Windows如果开了BitLocker或者Linux的根分区用了LUKS加密那么后面将要介绍的几乎所有“离线修改”手段都会失效。原因很简单这类工具需要直接读写磁盘里的SAM数据库或shadow文件磁盘本身是被加密的绕不进去。遇到加密盘你先要找BitLocker恢复密钥或者LUKS密码否则任何离线重置都是空谈。第三件事虚拟机是不是挂起状态。挂起Suspend状态下的虚拟机在恢复的时候会跳过BIOS引导直接把你带回关机前的内存现场。此时你切换了启动顺序、挂载了安装ISO都可能不生效因为它根本没走引导流程。正确做法是先把它正常关机或者在“虚拟机-电源”里选择“关闭客户机”如果实在关不掉且不需要保留现场数据就选“放弃挂起状态”。总之要让虚拟机进入彻底断电的关机状态后续操作才有意义。这三件事确认完基本就能判断出该走哪条路了。接下来我们进入主流平台的实操环节。2. VMware Workstation里重置Windows虚拟机密码三条实测路线2.1 为什么会想到替换utilman.exeWindows登录界面右下角有一个“轻松使用”按钮点击后会弹出放大镜、屏幕键盘这些辅助工具真正后台运行的程序是C:\Windows\System32\utilman.exe。同理连按五次Shift会触发粘滞键对应的是sethc.exe。这两个程序都是系统级权限运行的而它们所在的位置恰好是我们可以修改的。思路非常简单粗暴用命令提示符cmd.exe去替换掉utilman.exe重启之后在登录界面点一下“轻松使用”弹出来的不是辅助工具而是一个拥有SYSTEM权限的命令行窗口。有了这个命令行直接用net user命令重置密码整个过程几分钟搞定。这也是我目前最推荐Windows虚拟机密码重置方案的原因——不依赖第三方工具、不需要额外的PE镜像只要手上有一个Windows安装ISO就够了。2.2 安装ISO挂载和utilman替换完整步骤下面这套步骤我在VMware Workstation 12到17上都验证过Windows 7到Windows Server 2022基本通用。第一步把Windows安装ISO挂到虚拟机的光驱上。打开“虚拟机设置”找到CD/DVD那一项选择“使用ISO映像文件”把安装镜像填进去同时勾选“启动时连接”。第二步确认虚拟机是关机状态。这一步经常有人忽略——虚拟机如果是挂起状态ISO虽然挂上了但开机时根本不会从光驱引导。第三步开机的时候快速按F2进入BIOS设置把CD-ROM drive调整到硬盘前面。如果你手速不够快可以在关机状态下找到虚拟机的.vmx文件用记事本打开加一行参数bios.bootDelay 5000这个参数的意思是开机后延迟5秒再引导给自己留出按F2的时间。改完记得保存再启动虚拟机。第四步从ISO引导后进入Windows安装界面。在“现在安装”那个蓝色界面里按Shift F10可以直接打开命令提示符也可以点“修复计算机”-“疑难解答”-“命令提示符”殊途同归。第五步在命令提示符里找到系统所在盘符。这里有个新手容易踩的坑用安装介质引导后原来的C盘可能不再显示为C盘它会因为盘符分配规则变成D盘甚至E盘。保险起见先执行wmic logicaldisk get name看到所有盘符之后挨个用dir看一眼是不是系统盘判断标准是根目录下有没有Windows、Users、Program Files这几个文件夹。第六步确认系统盘后依次执行命令。假设系统盘是D盘D: cd \Windows\System32 ren utilman.exe utilman.exe.bak copy cmd.exe utilman.exe把原来的utilman改名备份再把cmd复制成utilman。这一步执行完关掉命令提示符直接从光驱弹出ISO。做法是在虚拟机设置里取消挂载ISO或者直接关机再修改设置。第七步开机正常引导到登录界面点击右下角的“轻松使用”图标。这时候弹出来的就是一个cmd窗口验证一下当前用户net user然后重置密码net user Administrator 你的新密码如果管理员账户是被策略禁用的需要先激活net user Administrator /active:yes第八步重启登录进去之后记得把文件还原不然以后每次点“轻松使用”都会弹出一个命令行看起来像系统中毒一样cd \Windows\System32 del utilman.exe ren utilman.exe.bak utilman.exe提示新密码如果太简单net user会提示密码不符合策略要求。不想折腾复杂度的话可以临时设一个包含大小写字母、数字和符号的强密码登录后再改成顺手的即可。2.3 备选方案PE盘加NTPWEdit离线操作SAM如果手头恰好有Windows PE启动盘微PE、优启通这类都行也可以走NTPWEdit路线。NTPWEdit是一个离线修改Windows SAM数据库的小工具不需要替换任何系统文件对于追求最小干预的人来说更稳妥。操作流程是把PE的ISO挂载到虚拟机光驱开机从光驱引导进入PE桌面运行NTPWEdit点击“打开”选择系统中的C:\Windows\System32\config\SAM文件。工具会列出所有本地账户选中你要重置密码的用户点“清除密码”或者“修改密码”最后保存退出重启虚拟机。优缺点是明显的。好处是不改动utilman这类系统文件不会出现忘记还原导致后患的情况坏处是得自己准备PE镜像而且PE里内置工具五花八门下载时最好认准靠谱来源。2.4 运气最好的一种快照回滚如果这台虚拟机在密码还没丢的时候打过快照那么回滚快照就是最省事的方式。在“快照管理器”里选中那个时间点点“转到”然后确认。几分钟后虚拟机就回到密码已知的状态了。代价是回滚之后的改动全部丢失。所以我一直有个习惯重要的Windows虚拟机改完密码或者做完系统更新立刻打一个快照命名成“密码已更新-日期”这种格式。这个习惯帮我省了太多事后面也会专门展开说。3. Linux虚拟机密码重置grub参数是最短路径3.1 老发行版百试百灵的init/bin/bashLinux虚拟机的密码重置思路和Windows完全不同不需要额外介质直接利用引导加载器动手就行。最早期的做法是在grub引导菜单里给内核传一个init/bin/bash参数让内核跳过所有服务直接启动到bash。以CentOS 6、Ubuntu 14这类老系统为例重启虚拟机在grub菜单界面选中最上面的内核行按e进入编辑模式找到以linux或者linux16开头的那一行在末尾追加一段init/bin/bash按Ctrl X或者F10启动。系统会跳过登录直接进入bash提示符执行挂载读写操作。这一步不能省因为进到这里根文件系统通常还是只读状态直接改密码会报错mount -o remount,rw /修改密码passwd root如果忘的是普通用户的密码也可以在这里直接改passwd 用户名重启虚拟机正常引导登录。这个方案简单清晰但有两个问题。一是init/bin/bash启动时执行脚本的顺序和正常启动不同在某些精简系统上可能连网络都不起来不过我们只是改本地密码不需要网络。二是部分带SELinux的RHEL系系统在init/bin/bash之后会因为安全上下文问题导致系统闪退或登录异常所以新版RHEL我一般推荐下面这个rd.break方案。3.2 systemd时代的标准答案rd.breakCentOS/RHEL 7及以后的版本包括大量基于它二次开发的分支系统官方推荐的重置密码路径是rd.break。这个参数的作用是在initramfs阶段停下来给管理员一个shell此时真实根目录被挂载在/sysroot下还没有进入我们熟悉的systemd初始化流程。操作步骤重启虚拟机在grub菜单按e编辑找到以linux16或linux开头的那一行在行尾追加rd.break按Ctrl X启动会进入一个switch_root提示符界面把真实根目录重新挂载为可读写mount -o remount,rw /sysroot切换进真实根目录chroot /sysroot修改密码passwd root如果系统启用了SELinux建议执行下面这条重新生成安全上下文否则重启后可能出现无法登录的情况touch /.autorelabel退出chroot并重启exit reboot这个方案看似比init/bin/bash多两步但兼容性最好。RHEL 7/8/9、CentOS 7/8/9、Rocky Linux、AlmaLinux我都实测过走rd.break基本不会出岔子。3.3 Ubuntu桌面版和服务器版的区别Ubuntu系的做法略有不同。Ubuntu 18.04及以后的版本在grub编辑界面找到linux开头的那一行把其中ro quiet splash改成rw quiet splash init/bin/bash注意前面多了个rw意思是内核直接以读写方式挂载根文件系统进入bash后不需要再执行mount -o remount,rw /。然后按Ctrl X启动直接就能看到root shell执行passwd修改密码即可。另外Ubuntu桌面版还有个更方便的入口。开机在grub菜单中选择“Advanced options for Ubuntu”-“recovery mode”然后在恢复菜单里选“root”会掉到一个维护模式Shell。这个模式根分区默认是只读挂载同样需要先mount -o remount,rw /再执行passwd。我个人的习惯是手头如果是Ubuntu优先试rw init/bin/bash的组合一次不行再进recovery mode通常很快。3.4 麒麟系统也是这个套路热搜词里有“麒麟系统重置密码”这里多说几句。麒麟系统的桌面版和服务器版本质上都是Linux的发行版服务器版跟RHEL系非常接近所以密码重置方式沿用rd.break或者init/bin/bash都可以。银河麒麟服务器版跟CentOS 7的grub菜单结构几乎一样按e找到linux行追加rd.break然后按上面3.2节的步骤走就行。一个细节如果跑在飞腾、鲲鹏这类ARM架构的物理机或虚拟机上启动流程走的是UEFIgrub菜单的显示方式可能有点差异。有些机器开机时需要按Esc或多次按Shift才能呼出引导菜单和grub界面不像x86平台那样直接可见。处理方法是在虚拟机里留意开机时的提示或者在虚拟机BIOS设置里把启动等待时间调长一点。3.5 顺带一提macOS虚拟机的密码重置如果用的是VMware Fusion或者UTM跑的macOS虚拟机密码忘了也有招。将虚拟机关机后再开机启动过程中按住Command R进入恢复模式然后打开“终端”执行resetpassword就能进入重置密码界面。Apple Silicon平台上恢复模式的进入方式略有不同虚拟机环境里可能需要先关闭SIP才能操作。因为用macOS虚拟机的朋友相对少这里不展开细说。4. VirtualBox、ESXi、Hyper-V和KVM下的操作差异4.1 VirtualBox按键和挂载点不一样VirtualBox里的Windows密码重置逻辑和VMware完全一样区别只在入口操作上。VirtualBox默认的启动快捷键是开机时按F12呼出启动菜单选择光驱按F2进入固件设置。如果发现虚拟机直接进系统不给你按键的机会可以在“设置-系统-主板”里勾选“启用EFI”或调整“启动顺序”也可以把光驱移动到硬盘前面。Linux虚拟机的grub编辑方式跟前面完全相同。唯一要留意的是VirtualBox的窗口焦点问题——按键要能被虚拟机和虚拟机里的grub捕获鼠标得先点进虚拟机窗口内部否则按了半天没反应你急grub也急。4.2 ESXi环境在vSphere Client里挂ISOESXi虚拟机虽然跑在物理宿主机上但密码重置的本质没变。在vSphere Web Client里找到目标虚拟机右键“编辑设置”挂载一个Windows安装ISO或者PE镜像到CD/DVD驱动器然后在“虚拟机选项”里找到“引导选项”勾选“下次引导时强制进入BIOS设置”。这样虚拟机强制重启的时候会先进入BIOS你就可以把光驱设为首选引导项了。ESXi下Linux虚拟机的grub操作跟Workstation一模一样毕竟虚拟硬件层面大同小异。主要区别是vSphere里没有“挂起状态”这个概念对应的问题如果虚拟机当前是挂起状态改成强制进入BIOS后开机时依然会直接恢复现场所以也得先让虚拟机彻底关机。4.3 Hyper-V注意安全启动那一项Hyper-V挂载ISO的位置在“设置-SCSI控制器-添加DVD驱动器”选好镜像后再进入“固件”调整启动顺序把光驱挪到硬盘前面。这里有个比较坑的细节默认情况下Hyper-V给第二代虚拟机Gen 2开启的是UEFI引导并且勾选了“安全启动”。如果挂载的PE镜像或某些Linux发行版ISO没有有效的安全启动签名虚拟机可能无法从光驱引导。解决方法是在“设置-安全”里临时关闭“安全启动”把密码重置完再改回来。4.4 KVM和Proxmoxvirsh edit也能救急KVM系的虚拟化平台包括Proxmox VE操作方式跟前面几个平台大差不差。用virt-manager打开虚拟机详情在“添加硬件”里选“存储设备”设备类型选“CDROM设备”把下载好的ISO挂上去然后在“引导顺序”里把光驱拖到最前面。如果是纯命令行环境可以用virsh edit 虚拟机名在os配置段里调整boot devcdrom/的优先级。KVM下Linux虚拟机内核参数的修改还是走grub编辑跟前面几节没有区别。这里想提醒的是KVM平台上Windows虚拟机的utilman替换同样受BitLocker限制如果客户机开了加密卷离线改SAM依然是死路一条。我把这些平台的差异汇总成一张表方便对照平台挂载ISO的主要入口进入固件/启动菜单方式备注VMware Workstation虚拟机设置-光驱开机按F2可加bios.bootDelay最简单教程最多VirtualBox设置-存储-光驱F12启动菜单F2进固件注意窗口焦点ESXi / vCenter编辑设置-挂载CD/DVD引导选项-强制进入BIOS虚拟机需彻底关机Hyper-V设置-SCSI控制器-DVD固件调整启动顺序Gen 2需临时关安全启动KVM / Proxmoxvirt-manager添加CDROM引导顺序调整或virsh edit命令行也能完成5. 实测中最容易翻车的几个环节5.1 挂起状态、快照链和虚拟磁盘依赖前面已经提过挂起状态的问题但这里还要再说一次因为确实很多人折在这一步。虚拟机是挂起状态时你挂ISO、改启动顺序、加grub参数统统可能不生效。正确操作是在VMware Workstation里右键虚拟机-电源-“放弃挂起状态”或者确保它彻底关机。放弃挂起状态会丢内存里的未保存数据但对测试环境来说通常无所谓。快照链的问题也值得留意。如果一台虚拟机有多级快照回滚到旧快照意味着放弃之后所有的磁盘改动这个操作不可逆。除非确定当前密码错误的状态不涉及重要数据否则别轻易回滚。另外当你把原虚拟机的vmdk添加到另一台虚拟机进行修复时要确保原虚拟机处于关机状态否则磁盘文件可能被锁定添加时会报“文件正在使用”的错误。这个我在急救的时候也踩过后来养成了先关机再挂从盘的习惯。5.2 磁盘加密会让所有离线方案失效BitLocker是Windows离线重置的拦路虎。如果你在虚拟机里启用过BitLocker那么从WinRE里访问系统盘时会发现盘符根本读不出来或者执行文件替换时报“拒绝访问”。这是因为BitLocker保护下的系统分区没有解锁密钥就无法读取。解决路径只有一条先找到BitLocker恢复密钥在恢复界面里解锁再继续重置操作。如果密钥也没了那就不是改密码的问题而是数据恢复的问题了。Linux的LUKS加密同理。rd.break也好init/bin/bash也罢都发生在解密之前面对一个加密的根分区你没有设备映射路径可用。所以再次强调动手之前先确认加密状态。5.3 键盘映射和启动超时会让你怀疑人生一些朋友在虚拟机里操作grub时常常遇到两个“玄学”问题。第一个是按键没反应。明明按了Shift想呼出grub菜单菜单没出来系统直接进了。解决办法是在VMware Workstation里按住Shift的同时快速点击虚拟机窗口内部让按键焦点进入虚拟机。Windows引导时还有个好用的招在grub菜单出现之前反复按Esc能强制显示引导菜单。很多UEFI引导的虚拟机里Esc比Shift好用得多。第二个是grub倒计时太短。有些系统把grub超时时间设成了0或1秒你根本来不及按e。处理方法是在虚拟机开机时反复按Esc或Shift让grub停下或者提前在系统里修改grub配置把超时时间改长。对于密码已经忘掉的虚拟机这个方法只适用于还能进系统的情况所以还是建议平时就把GRUB_TIMEOUT设置成5秒以上。5.4 替换文件后系统启动异常的自救手段万一utilman替换出问题比如手滑把cmd.exe复制错位置、删了不该删的文件导致Windows启动异常还有一条兜底的自救路径把出问题的vmdk磁盘挂到另一台正常可用的Windows虚拟机上作为从盘。操作步骤是关闭出问题的虚拟机打开另一台正常的Windows虚拟机在虚拟机设置里添加一块现有磁盘选择出问题机器的vmdk文件启动正常虚拟机。此时从盘会自动分配盘符你可以进到\Windows\System32目录把utilman文件恢复原状然后移除这块从盘再启动原虚拟机。这个方法本质上就是虚拟机版的“拆硬盘到别的机器上救数据”非常实用建议收藏。Linux虚拟机如果grub改坏了也可以用同样的思路把vmdk挂到另一台Linux虚拟机上进入系统后挂载对应分区把grub配置改回来或者直接chroot进去重新生成initramfs。6. 密码重置之后的收尾与防忘机制6.1 重置成功后的三件事密码重置成功只算完成了一半后面这三件事我每次都会做缺一不可。第一件事立即打一个新快照命名为类似“密码已重置-日期”的格式。这样做的好处是如果以后又忘了密码直接回滚到这个已知密码的基线状态省掉再次折腾的功夫。对测试环境的虚拟机来说这个习惯等于给密码上了一道保险。第二件事还原所有临时改动。Windows的utilman.exe是否恢复、虚拟机的启动顺序是否改回硬盘优先、挂载的安装ISO是否已经移除、Hyper-V的安全启动是否重新打开这些全部检查一遍。我见过有人用完utilman替换法之后忘记还原文件结果三个月后同事点“轻松使用”弹出一个cmd窗口还以为虚拟机被人入侵了。第三件事把新密码记录到密码管理工具里。团队环境可以统一用KeePassXC或者Bitwarden这类工具个人环境哪怕记到Excel里也比不记强。密码本身的价值就在于“只有自己知道”但前提是自己也得能找回来。6.2 应用系统密码重置和虚拟机系统密码重置要分开排查需求的时候发现好多人是被应用软件“逼”到重置虚拟机密码的这里单独提醒一句如果你的目标是恢复Artifactory、Elasticsearch这类自带用户体系的应用后台密码别直接把虚拟机系统密码改掉。这类软件的登录凭据通常有自己独立的存储和加密机制改完系统密码并不会同步修改应用里的认证数据反而可能因为系统层面的账户状态变动让应用的服务进程启动异常。正确做法是查应用自身的密码重置机制。比如Elasticsearch 7.x配置了安全特性后可以用bin/elasticsearch-users userpasswd 用户名按提示输入新密码。Artifactory也有自己的管理员恢复入口官方文档里有专门的“Forgot admin password”流程。这些应用级密码重置操作本质上和虚拟机层面无关你在物理服务器上一样要这么处理。6.3 团队环境下的虚拟机密码防忘管理最后分享一点团队协作的经验。我建议每一个长期维护的虚拟机都要在登记清单里记录以下字段虚拟机名称和用途操作系统和版本内网IP地址登录账号和密码最近一次变密时间快照数量及最近快照时间负责人和备注这个清单可以放在公司内部的Wiki、飞书文档或者共享表格里有权限的人都能看到。每次改完密码、打完快照都顺手更新一下。还有一个挺实用的小技巧给重要虚拟机设置周期性登录提醒。比如每月第一周手动登录一次输入一遍密码。这个操作花不了半分钟但它能保证你永远跟自己的虚拟机保持在“认识”状态而不是等到要用的那一天才发现密码早已生疏。做了这么多年虚拟化运维我最大的体会是密码这种东西宁可多花两分钟写进密码本也别在凌晨三点对着锁死的虚拟机后悔。虚拟机的好处是容错率高有不计其数的办法可以恢复但每次恢复都要付出时间成本和数据风险。如果你现在刚好也有一台密码悬在脑后的虚拟机不妨趁这篇教程还在手边先确认一下快照、加密和挂起状态然后挑最适合的路子动手解决。搞定之后记得打个快照把密码记下来然后踏实睡觉。
返回列表