Function Repair-RemoteSafeModeBoot {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)]
[string]$ComputerName
)
if (-not (Test-Connection -ComputerName $ComputerName -Quiet -Count 1 -ErrorAction 'Stop')) {
throw "Could not ping $ComputerName; no attempt made to fix it"
}
$os = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_OperatingSystem' -ErrorAction 'Stop'
Write-Verbose "Computer $ComputerName last rebooted at $($os.ConvertToDateTime($os.LastBootUpTime))"
$cs = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_ComputerSystem' -ErrorAction 'Stop'
Write-Verbose "Computer $ComputerName bootup state is $($cs.BootupState)"
if ($cs.BootupState -eq 'Normal boot') {
Write-Warning "$ComputerName is not in safe mode; no attempt to fix it was made"
return # we don't want to proceed if the remote device is already in normal mode as we may do more harm than good (unlikely to have any impact tbh; but why risk it)
}
if ($cs.BootupState -ne 'Fail-safe with network boot') {
Write-Warning "$ComputerName has boot up state $($cs.BooupState). I've never tested with these states, so can't say what will happen. Please read up on this & if acceptable to proceed amend this script to enable it for your scenario."
return # probably safe to remove this & continue; but I don't want to be responsible for that decision... Comment this statement out at your own risk
}
# run a command on the remote computer to take it out of safe mode: https://superuser.com/a/706664/156700
$rv = Invoke-WmiMethod –ComputerName $ComputerName -Class 'win32_process' -Name 'create' -ArgumentList 'bcdedit /deletevalue {default} safeboot' -ErrorAction 'Stop' | Select-Object -ExpandProperty ReturnValue
if ($rv -ne 0) {
throw "Attempted to run bcdedit, but received return value $rv implying that the command was unsuccessful"
}
Start-Sleep -Seconds 5 # probably not required; but added to be safe. It's not like 5 seconds is much to ask if you're in this scenario.
#restart the remote computer
$rv = $os.Reboot() | Select-Object -ExpandProperty ReturnValue
if ($rv -ne 0) {
throw "Attempted to reboot the remote device, but received return value $rv, implying that the command was unsuccessful"
}
Write-Information "$ComputerName updated to normal mode & restarted. Wait a few minutes whilst the reboot occurs then try to log in. If you still have issues try rerunning this command with the -Verbose flag enabled to check whether the boot time or mode have changed."
}
Repair-RemoteSafeModeBoot -ComputerName 'MyServer' -Verbose # where MyServer is the name of the remote server in safe mode
如果您在远程计算机上具有管理员权限,那么这是可能的。
您需要编辑 boot.ini 文件(通常位于 C: 驱动器的根目录)
在本地计算机上打开命令提示符
类型:
引导 ini 文件将打开,通常看起来像这样:
在最后一行的末尾,您需要添加
最后一行将显示类似
保存更改,然后从命令行强制重新启动,它应该重新启动到网络安全模式。完成后记得将 boot.ini 文件改回来!
要将 Windows 7 重新启动到网络安全模式,请运行 msconfig.exe。在启动选项卡上,您可以选择“安全启动”,并且有一个用于联网的复选框。
我不确定远程桌面是否会在安全模式下运行。我使用 TightVNC。要让 TightVNC 服务以安全模式启动,请将其注册表项复制到 safeboot\network:
其他 VNC 服务可能也可以以相同的方式激活。
工作站机器不太可能。您需要一些可以让您控制机器本身的东西,以便告诉 Windows 如何启动。
您将在服务器硬件上获得更多运气,因为许多供应商都内置了远程连接到控制台的选项。
但是,如果您可以选择以交互方式连接到计算机上的 Windows,则可以使用 MSCONFIG 在 boot.ini 中设置 /SAFEBOOT 开关,然后重新启动计算机。执行 Start -> Run 并输入 MSCONFIG,然后在 boot.ini 选项卡上检查 Boot Options 下的 /SAFEBOOT 并选择要启动的安全模式(在这种情况下为 NETWORK)。
LogMeIn 有一个安全模式重启选项。
这正是惠普集成熄灯选项的用途。编辑 boot.ini 文件不会有太大帮助,因为您将无法登录机器,因为 RDP 服务不会运行。如果那是 HP 服务器,尽管您可以通过 https 门户直接连接到它的控制台,并且还可以访问虚拟“电源按钮”。
不是问题的答案,但希望对尝试此操作时遇到问题的任何人有用。我发现尽管在网络安全模式下重新启动,但包括
Remote Desktop Services
和Server
(即提供 SMB 访问boot.ini
)在内的各种服务无法启动,通过 MMC > 服务启动时出现错误代码 1084。下面的 powershell 使用 WMI(似乎仍然有效)使远程计算机退出安全模式并重新启动它。
注意:您可以只运行下面的 3 行;上面的函数只是作为一个方便的包装器。我没有测试过上面的 cmdlet;虽然我在没有包装器的情况下使用了这种方法,所以可以说所有单独的部分都有效。
注意:我只在 Windows Server 2008 R2 上尝试过。YMMV。
上面关于编辑 boot.ini 的答案很好——除了……你不能更改 boot.ini 文件……如果你一步一步按照“马克”的指示去做——你碰上了砖墙因为 boot.ini 是只读的。
编辑:是的....我测试了它以管理员身份登录。
如果你草草选择修改为
BOOT.ini
带网络的安全模式重启,然后重启,你会发现根本无法远程登录。您可能能够查看引导文件\\machinename\C$\boot.ini
,但由于它是只读的,因此无法对其进行修改。您也将无法“右键单击并取消选中‘只读’”,因为您根本无法导航到该C$
目录。我现在必须亲自登录到这个虚拟工作站才能更换boot.ini
背部。我再也不会犯这样的错误了!boot.ini 文件发生了什么?
视窗 7 更多
在早期版本的 Windows 中,boot.ini 是一个系统文件,其中包含有关计算机上安装的 Windows 操作系统的信息。此信息在您打开计算机时的启动过程中显示。它在多重引导配置中或对于需要自定义 Windows 启动方式的高级用户或管理员最有用。
在此版本的 Windows 中,boot.ini 文件已替换为引导配置数据 (BCD)。该文件比 boot.ini 更通用,它可以适用于使用基本输入/输出系统 (BIOS) 以外的方式启动计算机的计算机平台。
如果您需要对 BCD 进行更改,例如从显示的操作系统列表中删除条目,请使用命令行工具 Bcdedit,这是一种适用于管理员和 IT 专业人员的高级工具。有关 Bcdedit 的技术信息,请访问面向 IT 专业人员的 Microsoft 网站。
如果您的计算机是多重引导配置,您仍然可以使用控制面板中的系统更改默认打开的 Windows 操作系统以及显示操作系统列表的时间。
2.在左侧窗格中,单击高级系统设置。需要管理员权限 如果系统提示您输入管理员密码或确认,请键入密码或提供确认。
3.单击高级选项卡,然后在启动和恢复下单击设置。
4.在系统启动下,选择默认操作系统和显示操作系统列表的时间量,单击确定,然后再次单击确定。
http://windows.microsoft.com/en-ca/windows/what-happened-boot-ini-file#1TC=windows-7
如果你犯了这个错误,你可能会通过文件资源管理器导航到 boot.ini 文件,所以 \hostname\C$\boot.ini,你也有可能删除“/safeboot” :network”并保存。
如果您可以将更改保存到 boot.ini 文件,则以管理员身份运行命令提示符并尝试运行此命令以重新启动:shutdown /r /m \hostname /t 00
希望有了这个你会重新开始工作!