摘要
套用安全性更新導覽 CVE-2017-0160 中所述的 2017 年 4 月安全性更新之後,PowerShell v3.0+ stop-computer 命令發生失敗。 此外,如果應用程式透過 Win32_OperatingSystem 類別使用電源管理方法,例如關機或重新開機,以及將 EnablePrivileges 屬性設定為 true,可能會發生相同的失敗。 系統傳回「沒有權限」錯誤訊息。
其他相關資訊
問題 1 的徵狀
客戶若使用 PowerShell v3.0 或更新版本的 stop-computer 命令,嘗試從本機或遠端關閉或重新啟動系統,會看到以下錯誤訊息:
stop-computer : Privilege not held.
At line:1 char:1
+ stop-computer
+ ~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (<COMPUTERNAME>:String) [Stop-Computer], ManagementE
+ FullyQualifiedErrorId : 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 Update 1703 (RS2) |
|
.NET Framework 4.7 |
|
Windows 10 Update 1607 |
|
.NET Framework 3.5 |
Catalog
|
.NET Framework 4.6.2 和 4.7 |
Catalog
|
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 版本。