stop-computer: Privilégio não mantido

3

Estou executando o Powershell (v4) em uma caixa do Windows7; Consegui até ontem (2017-04-12) emitir um comando 'stop-computer' para desligar meu computador.

Hoje: não posso fazê-lo; Eu recebo esta resposta: ('zaphod' é o nome do host):

 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

Isso acontece quando eu inicio o Powershell com permissões não administrativas; ou se eu usar 'Executar como administrador' (e ele estiver sendo executado como Administrador; desde que eu recebo o popup "Controle de conta de usuário" quando faço isso).

Houve algumas atualizações automáticas do Windows feitas na minha máquina hoje - talvez elas sejam de alguma forma responsáveis?

Estranhamente; 'restart-computer' faz funcionar.

Isso é uma coisa conhecida? Posso recuperar minhas permissões de alguma forma?

Mais pesquisas seguem:

EDITAR : se eu emitir o comando com o sinalizador '-asjob', ele funciona :

stop-computer -asjob # this works !

Eu emiti o seguinte comando para obter ajuda:

get-help Stop-Computer -full

O sinalizador "Autenticação" é definido da seguinte forma:

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.
   [...]

Então, confusamente, a autenticação 'default' é aparentemente 'Packet'; mas o sinalizador para mudar para 'Autenticação do Windows' é chamado 'Padrão'.

Em qualquer caso; Nenhum dos sinalizadores me permite desligar o computador. Eu recebo uma pequena variação do erro quando uso "None":

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

Também liguei o rastreio usando:

Set-PSDebug -Trace 2

Agora eu entendo isso; mas eu não sei o que fazer com isso:

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.
    
por monojohnny 13.04.2017 / 10:59

2 respostas

3

Alguém da Microsoft publicou no Subredito do PowerShell sobre isso.

Ele explica que provavelmente é um erro de regressão do Conjunto de segurança e qualidade para o patch do .NET Framework 4.6 e 4.6.1 .

Você já encontrou a solução alternativa sugerida para usar -asjob .

    
por 19.04.2017 / 00:09
1

Resolvido, de acordo com Erro" Privilege not held "com o comando" stop-computer "do PowerShell: Solução alternativa após as atualizações de segurança de abril de 2017 de CVE-2017-0160

Basta instalar a atualização necessária para sua versão do sistema operacional.

    
por 09.05.2017 / 22:59