2台のワークグループコンピューターがあります。これら2台のコンピューター間でPowerShellリモート処理をセットアップしたいと思います。両方のコンピューターのOSはWindows1809です。
いずれかのコンピューターでPowerShellリモート処理が有効になっています。他のコンピューターに直接アクセスして、PowerShellリモート処理を有効にすることはできません。そこで、ホストマシン(つまり、PowerShellリモート処理が有効になっているコンピューターの1つ)でスクリプトを実行して、リモートマシンでリモートでリモート処理を有効にします。 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(ユーザーアカウント制御)によって管理されていることが原因である可能性があります。このKB記事に記載されているように、デフォルトでは、リモート接続では管理トークンが削除されます。
Windows Vista(951016)のユーザーアカウント制御とリモート制限の説明
この場合は、次のレジストリ値を1
(タイプREG_DWORD
)に設定して、OSが制限付きトークンではなく昇格したトークンを作成できるようにします。
ハイブ:HKEY_LOCAL_MACHINE
サブキー:SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
値の名前:LocalAccountTokenFilterPolicy
値のデータ:1
(REG_DWORD
)
(ただし、この設定を変更した場合のセキュリティへの影響に注意してください。)