概要
应用 Microsoft 安全更新指南 CVE-2017-0160 中所述的 2017 年 4 月安全更新后,PowerShell v3.0+ stop-computer 命令失败。 另外,如果应用程序使用 Win32_OperatingSystem 类中的电源管理方法(例如关机或重启),并将 EnablePrivileges 属性设置为 true,则它们可能会观察到相同的失败。 返回了“没有保留权限”错误消息。
更多信息
问题 1 的症状
尝试通过在 PowerShell 3.0 及更高版本上使用 stop-computer 命令来关闭或重启本地或远程系统的客户将看到以下错误消息:
stop-computer : 没有保留权限。
At line:1 char:1(在第 1 行第 1 个字符处)
+ stop-computer
+ ~~~~~~~~~~~~~
+ 类别信息: InvalidOperation: (<计算机名>:String) [Stop-Computer], ManagementE
+ 完全限定的错误 ID: StopComputerException,Microsoft.PowerShell.Commands.StopComputerCommand
问题 1 的解决方法
要解决此问题,请运行以下“shutdown.exe”命令,以在本地或远程系统上执行关机和重启操作:
shutdown.exe [-r] [-s] [-m \\computer]
如需更多信息和命令帮助,请运行:
shutdown.exe -?
问题 2 的症状
使用 Win32_OperatingSystem 类中的电源管理方法(例如关机或重启),并将 EnablePrivileges 特性设置为 true 的客户应用程序可能会观察到“没有保留权限”错误。
-
示例 1 (PowerShell) 返回“没有保留权限”错误:
$computername= "." $win32OS = get-wmiobject win32_operatingsystem -computername $computername $win32OS.psbase.Scope.Options.EnablePrivileges = $true $win32OS.reboot()-
示例 2(C# 代码)返回“没有保留权限”错误:
[STAThread] static void Main(string[] args) { ManagementClass mgmtObject = new ManagementClass("Win32_OperatingSystem"); foreach (ManagementObject iterMgmtObject in mgmtObject.GetInstances()) { iterMgmtObject.Scope.Options.EnablePrivileges = true; iterMgmtObject.InvokeMethod("Reboot", null, null); } }
-
问题 2 的解决方法
-
示例 1 (PowerShell):
$computername= "." $win32OS = get-wmiobject win32_operatingsystem -computername $computername -EnableAllPrivileges $win32OS.reboot() -
示例 2(C# 代码):
using System; using System.Collections.Generic; using System.Linq; using System.Management; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { static void Main(string[] args) { var mgmtScope = new ManagementScope( ManagementPath.DefaultPath, new ConnectionOptions() { EnablePrivileges = true }); var mgmtClass = new ManagementClass(mgmtScope, new ManagementPath("Win32_OperatingSystem"), null); foreach (ManagementObject mgmtInst in mgmtClass.GetInstances()) { var mgmtCallResult = mgmtInst.InvokeMethod("Reboot", null, null); Console.Out.WriteLine("Reboot() Return Value: {0}", mgmtCallResult["ReturnValue"]); } } } }
解决方案
问题 1 的解决方案
要解决此问题,请根据你的系统安装下表中的更新。
操作系统 |
更新 |
Windows Server 2008 |
对于 .NET Framework 2.0,请安装更新 4020511 对于 .NET Framework 4.5.2,请安装更新 4020507 对于 .NET Framework 4.6,请安装更新 4020503 |
Windows 7 和 Windows Server 2008 R2 |
对于 .NET Framework 3.5.1,请安装更新 4020513 对于 .NET Framework 4.5.2,请安装更新 4020507 对于 .NET Framework 4.6 或 4.6.1,请安装更新 4020503 对于 .NET Framework 4.6.2,请安装更新 4020500 |
Windows Server 2012 |
对于 .NET Framework 3.5,请安装更新 4020512 对于 .NET Framework 4.5.2,请安装更新 4020506 对于 .NET Framework 4.6 或 4.6.1,请安装更新 4020501 对于 .NET Framework 4.6.2,请安装更新 4020498 |
Windows 8.1 和 Windows Server 2012 R2 |
对于 .NET Framework 3.5,请安装更新 4020514 对于 .NET Framework 4.5.2,请安装更新 4020505 对于 .NET Framework 4.6 或 4.6.1,请安装更新 4020502 对于 .NET Framework 4.6.2,请安装更新 4020499 |
Windows 10 RTM |
安装更新 4019474 |
Windows 10 版本 1511 |
安装更新 4019473 |
Windows 10 版本 1607 和 Windows Server 2016 |
安装更新 4019472 |
Windows 10 版本 1703 |
安装更新 4016871 |
问题 2 的解决方案
要解决此问题,请根据你的系统安装下表中的更新。
产品版本 |
质量汇总 KB 预览 |
---|---|
Windows 10 更新 1703 (RS2) |
|
.NET Framework 4.7 |
|
Windows 10 更新 1607 |
|
.NET Framework 3.5 |
目录
|
.NET Framework 4.6.2 和 4.7 |
目录
|
Windows 8.1 |
|
.NET Framework 3.5 |
|
.NET Framework 4.5.2 |
|
.NET Framework 4.6、4.6.1、4.6.2、4.7 |
|
Windows Server 2012 |
|
.NET Framework 3.5 |
|
.NET Framework 4.5.2 |
|
.NET Framework 4.6、4.6.1、4.6.2、4.7 |
|
Windows 7 |
|
.NET Framework 3.5.1 |
|
.NET Framework 4.5.2 |
|
.NET Framework 4.6、4.6.1、4.6.2、4.7 |
|
Windows Server 2008 |
|
.NET Framework 2.0 |
|
.NET Framework 4.5.2 |
|
.NET Framework 4.6 |
注意:已计划日后推出适用于 Windows 10 版本 1703 的 .NET Framework 3.5 更新。
适用范围
本文适用于以下产品,如 CVE-2017-0160 的受影响的产品部分所述:
运行 PowerShell 3.0 及更高版本的所有受支持版本的 Windows 上的 Microsoft .NET Framework 2.0、3.5、4.5.2、4.6、4.6.1、4.6.2、4.7。