Назад | Перейти на главную страницу

PowerShell - Invoke-WmiMethod: доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

У меня 2 компьютера рабочей группы. Я хочу настроить удаленное взаимодействие PowerShell между этими двумя компьютерами. На обоих компьютерах установлена ​​операционная система Windows 1809.

На одном из компьютеров включено удаленное взаимодействие Powershell. Другой компьютер недоступен напрямую, чтобы включить удаленное взаимодействие с PowerShell. Итак, я запускаю сценарий на хост-машине (то есть на одном из компьютеров, на котором уже включено удаленное взаимодействие PowerShell), чтобы удаленно включить удаленное взаимодействие на удаленном компьютере. Я использую Invoke-WmiMethod для удаленных операций. Ниже приведен сценарий, который я использую:

param(
    [parameter(Mandatory = $true)]
    [string]$RemoteMachineIPaddress,
    [parameter(Mandatory = $true)]
    [string]$SystemIPaddress
)

try{

$DisplayName = "Allow ICMPv4-In"

$secpasswd = ConvertTo-SecureString "Password" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ("Admin02", $secpasswd)

Invoke-WmiMethod -ComputerName $RemoteMachineIPaddress -Namespace root\cimv2 -Class Win32_Process -Name Create -Credential $Cred -Impersonation 3 -EnableAllPrivileges -ArgumentList "powershell Start-Process powershell -Verb runAs -ArgumentList 'Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force'"
Invoke-WmiMethod -ComputerName $RemoteMachineIPaddress -Namespace root\cimv2 -Class Win32_Process -Name Create -Credential $Cred -Impersonation 3 -EnableAllPrivileges -ArgumentList "powershell Start-Process powershell -Verb runAs -ArgumentList 'Install-PackageProvider -Name Nuget -MinimumVersion 2.8.5.201 -Force'"
Invoke-WmiMethod -ComputerName $RemoteMachineIPaddress -Namespace root\cimv2 -Class Win32_Process -Name Create -Credential $Cred -Impersonation 3 -EnableAllPrivileges -ArgumentList "powershell Start-Process powershell -Verb runAs -ArgumentList 'Start-Service WinRM -Force'"
Invoke-WmiMethod -ComputerName $RemoteMachineIPaddress -Namespace root\cimv2 -Class Win32_Process -Name Create -Credential $Cred -Impersonation 3 -EnableAllPrivileges -ArgumentList "powershell Start-Process powershell -Verb runAs -ArgumentList 'Set-Item WSMan:\localhost\Client\TrustedHosts -Value $SystemIPaddress -Force'"
Invoke-WmiMethod -ComputerName $RemoteMachineIPaddress -Namespace root\cimv2 -Class Win32_Process -Name Create -Credential $Cred -Impersonation 3 -EnableAllPrivileges -ArgumentList "powershell Start-Process powershell -Verb runAs -ArgumentList 'Enable-PSRemoting -Force -SkipNetworkProfileCheck'"
Invoke-WmiMethod -ComputerName $RemoteMachineIPaddress -Namespace root\cimv2 -Class Win32_Process -Name Create -Credential $Cred -Impersonation 3 -EnableAllPrivileges -ArgumentList "powershell Start-Process powershell -Verb runAs -ArgumentList 'Restart-Service winrm'"

return $true
}
catch
{
return $false
}

Когда я запускаю этот скрипт с хост-машины, я получаю ошибку Доступ запрещен.

Invoke-WmiMethod : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

Я запускаю вышеуказанный сценарий в режиме администратора, а также предоставил для этого сценария учетные данные администратора удаленного компьютера.

Вероятно, это связано с тем, что подключения удаленного администратора к локальным учетным записям управляются UAC (контроль учетных записей пользователей). По умолчанию для удаленных подключений административный токен удаляется, как указано в этой статье базы знаний:

Описание контроля учетных записей пользователей и удаленных ограничений в Windows Vista (951016)

В этом случае вы можете установить для следующего параметра реестра значение 1 (тип REG_DWORD), чтобы позволить ОС создавать токен с повышенными правами, а не ограниченный:

Улей: HKEY_LOCAL_MACHINE
Подраздел: SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Имя значения: LocalAccountTokenFilterPolicy
Данные значения: 1 (REG_DWORD)

(Тем не менее, обратите внимание на последствия для безопасности изменения этого параметра.)