3

Я использую Powershell (v4) на Windows7; До вчерашнего дня (2017-04-12) я мог выдать команду «стоп-компьютер» для выключения компьютера.

Сегодня: я не могу этого сделать; Я получаю этот ответ: ('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 - может быть, они как-то ответственны?

Как ни странно, «рестарт-компьютер» работает.

Это известная вещь? Могу ли я как-нибудь вернуть свои разрешения?

Далее следует исследование:

EDIT: если я выполняю команду с флагом «-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» называется «По умолчанию».

В любом случае; ни один из флагов не позволяет мне выключить компьютер. Я получаю небольшое изменение ошибки, когда использую "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

Я также включил трассировку, используя:

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.

2 ответа2

3

Кто-то из Microsoft написал в Powershell Subreddit об этом.

Он объясняет, что это, вероятно, ошибка регрессии из накопительного пакета безопасности и качества для исправлений .NET Framework 4.6 и 4.6.1.

Вы уже нашли предложенный обходной путь для использования -asjob .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .