У меня 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
)
(Тем не менее, обратите внимание на последствия для безопасности изменения этого параметра.)