停止计算机:不具备权限

停止计算机:不具备权限

我在 Windows7 机器上运行 Powershell (v4);直到昨天(2017-04-12)我才能够发出“stop-computer”命令来关闭我的电脑。

今天:我无法这样做;我收到此回复:(“zaphod”是主机名):

 PS C:\Windows\system32> stop-computer
 stop-computer : Privilege not held.
 At line:1 char:1
 + stop-computer
 + ~~~~~~~~~~~~~
     + CategoryInfo          : InvalidOperation: (zaphod:String) [Stop-Computer], ManagementException
     + FullyQualifiedErrorId : StopComputerException,Microsoft.PowerShell.Commands.StopComputerCommand

当我以非管理员权限启动 Powershell 时会发生这种情况;或者如果我使用“以管理员身份运行”(并且它以管理员身份运行;因为当我执行此操作时会出现“用户帐户控制”弹出窗口)。

今天我的机器自动进行了一些 Windows 更新 - 也许这些更新在某种程度上起了作用?

奇怪的是;‘重启计算机’工作。

这是已知的事情吗?我能以某种方式恢复我的权限吗?

进一步的研究如下:

编辑:如果我使用“-asjob”标志发出命令 - 它工作:

stop-computer -asjob # this works !

我发出了以下命令来获取帮助:

get-help Stop-Computer -full

‘身份验证’标志定义如下:

Authentication <AuthenticationLevel>
   Specifies the authentication level that is used for the  WMI connection. (Stop-Computer uses WMI.) The default
   value is Packet.

   Valid values are:

   Unchanged:       The authentication level is the same as the previous command.
   Default:         Windows Authentication.
   None:            No COM authentication.
   Connect:         Connect-level COM authentication.
   Call:            Call-level COM authentication.
   Packet:          Packet-level COM authentication.
   PacketIntegrity: Packet Integrity-level COM authentication.
   PacketPrivacy:   Packet Privacy-level COM authentication.
   [...]

因此令人困惑的是,“默认”身份验证显然是“数据包”;但切换到“Windows 身份验证”的标志称为“默认”。

无论如何,没有一个标志允许我关闭计算机。当我使用“无”时,我得到了稍微不同的错误:

stop-computer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
At line:1 char:1
+ stop-computer -Authentication None
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Stop-Computer], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.StopComputerCommand

我还使用以下方法开启了跟踪:

Set-PSDebug -Trace 2

现在我明白了;但我不知道该怎么做:

DEBUG:    1+  >>>> stop-computer
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:   19+                                         if ( &  >>>> { Set-StrictMode -Version 1; $_.PSMessageDetails } )
{
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:   19+                                         if ( & {  >>>> Set-StrictMode -Version 1; $_.PSMessageDetails } )
{
DEBUG:   19+                                         if ( & { Set-StrictMode -Version 1;  >>>> $_.PSMessageDetails } )
{
DEBUG:    1+ &  >>>> { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails }
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:    1+ & {  >>>> Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails }
DEBUG:    1+ & { Set-StrictMode -Version 1;  >>>> $this.Exception.InnerException.PSMessageDetails }
DEBUG:    1+ & { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails  >>>> }
DEBUG:   19+                                         if ( & { Set-StrictMode -Version 1; $_.PSMessageDetails  >>>> } )
{
DEBUG:   26+                                         $errorCategoryMsg = &  >>>> { Set-StrictMode -Version 1;
$_.ErrorCategory_Message }
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:   26+                                         $errorCategoryMsg = & {  >>>> Set-StrictMode -Version 1;
$_.ErrorCategory_Message }
DEBUG:   26+                                         $errorCategoryMsg = & { Set-StrictMode -Version 1;  >>>>
$_.ErrorCategory_Message }
DEBUG:   26+                                         $errorCategoryMsg = & { Set-StrictMode -Version 1;
$_.ErrorCategory_Message  >>>> }
DEBUG:   42+                                         $originInfo = &  >>>> { Set-StrictMode -Version 1; $_.OriginInfo }
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:   42+                                         $originInfo = & {  >>>> Set-StrictMode -Version 1; $_.OriginInfo }
DEBUG:   42+                                         $originInfo = & { Set-StrictMode -Version 1;  >>>> $_.OriginInfo }
DEBUG:   42+                                         $originInfo = & { Set-StrictMode -Version 1; $_.OriginInfo  >>>> }
stop-computer : Privilege not held.

答案1

微软的某人在Powershell 子版块对这个。

他解释说,这可能是.NET Framework 4.6 和 4.6.1 补丁的安全和质量汇总

您已经找到了建议使用的解决方法-asjob

答案2

相关内容