私はPowerShellの初心者であり、資格情報の委任の使用に問題があります。次のスクリプトがあります。
$session = New-PSSession myserver -Authentication CredSSP -Credential DOMAIN\Administrator
Invoke-Command -Session $session -ScriptBlock { <Some PowerShell Command> }
実行する前に、次のことを行いました。
Enable-PSRemoting
myserverで。Enable-WSManCredSSP Server
myserverで。Restart-Service WinRM
myserverで。Enable-WSManCredSSP Client –DelegateComputer myserver
クライアント上。しかし、スクリプトを実行すると、次のエラーメッセージが表示されます。
[myserver] Connecting to remote server failed with the following error message : The WinRM client cannot process the request. A computer policy does not allow the delegation of
the user credentials to the target computer. Use gpedit.msc and look at the following policy: Computer Configuration -> Administrative Templates -> System -> Credentials Delega
tion -> Allow Delegating Fresh Credentials. Verify that it is enabled and configured with an SPN appropriate for the target computer. For example, for a target computer name "m
yserver.domain.com", the SPN can be one of the following: WSMAN/myserver.domain.com or WSMAN/*.domain.com. For more information, see the about_Remote_Troubleshooting Help topic.
+ CategoryInfo : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [], PSRemotingTransportException
+ FullyQualifiedErrorId : PSSessionOpenFailed
エラーメッセージに記載されているようにポリシーをチェックしましたが、すべて問題ないようです。他に何が私をブロックしているのでしょうか?
このページ のおかげでようやく機能するようになりました。適切なレジストリキーを直接設定して、必要な資格情報の委任ポリシーを設定するスクリプトを提供します。管理者権限でそのスクリプトを実行すると、myserverへのCredSSP接続を正常に確立できました。
Enable-WSManCredSSP -Role client -DelegateComputer *.mydomain.com
$allowed = @('WSMAN/*.mydomain.com')
$key = 'hklm:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation'
if (!(Test-Path $key)) {
md $key
}
New-ItemProperty -Path $key -Name AllowFreshCredentials -Value 1 -PropertyType Dword -Force
$key = Join-Path $key 'AllowFreshCredentials'
if (!(Test-Path $key)) {
md $key
}
$i = 1
$allowed |% {
# Script does not take into account existing entries in this key
New-ItemProperty -Path $key -Name $i -Value $_ -PropertyType String -Force
$i++
}
サーバーで以下を実行する必要がありました。
Enable-WSManCredSSP -Role Server
クライアントで次のことを行う必要がありました。
set-item wsman:localhost\client\trustedhosts -value *
Enable-WSManCredSSP -Role Client –DelegateComputer *
クライアントでgpedit.msc
を使用して、WSMAN/*への新しい資格情報の委任を有効にします。
Local Computer Policy
、Computer Configuration
、Administrative Templates
、System
の順に展開し、Credential Delegation
をクリックします。Settings
ペインで、Allow Delegating Fresh Credentials with NTLM-only Server Authentication
をダブルクリックします。Allow Delegating Fresh Credentials with NTLM-only Server Authentication
]ダイアログボックスで、次の手順を実行します。Enabled
をクリックします。Options
エリアで、[Show
]をクリックします。WSMAN/*
」と入力し、[OK
]をクリックします。 Concatenate OS defaults with input above
が選択されていることを確認し、OK
をクリックします。次のコマンドが機能するようになりました(パスワードプロンプトの後):
Invoke-Command { dir \\fileserver\devtools } -computer appserver01 -authentication credssp -credential domain\user
MSDNフォーラム を参照してください。
TechNet を参照してください
上記のAkiraの答えを拡張して、gpedit.mscで、「新しい資格情報の委任を許可する」ではなく、「NTLMのみのサーバー認証で新しい資格情報の委任を許可する」を設定する必要がありました。
私のソリューション、特にGPOエディターを使用するソリューションの一部のセクション)を完全に自動化する必要がありました。
1)リモートPSを有効にする
Enable-PSRemoting -force
2)CredSSPを有効にする
Enable-WSManCredSSP -Role Server -Force
Enable-WSManCredSSP -Role Client -DelegateComputer locahost -Force
Enable-WSManCredSSP -Role Client -DelegateComputer $env:COMPUTERNAME -Force
Enable-WSManCredSSP -Role Client -DelegateComputer $domain -Force
Enable-WSManCredSSP -Role Client -DelegateComputer "*.$domain" -Force
Set-Item -Path "wsman:\localhost\service\auth\credSSP" -Value $True -Force
3)登録を通じてNTLMフレッシュクレデンシャルを有効にします。
New-Item -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation -Name AllowFreshCredentialsWhenNTLMOnly -Force
New-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentialsWhenNTLMOnly -Name 1 -Value * -PropertyType String
この後、PSSessionで実行してADアクションを実行できるローカル管理者としてpowershellスクリプトを起動できました。
$secpasswd = ConvertTo-SecureString $adPassword -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ("$domain\Admin", $secpasswd)
$adminSession = New-PSSession -Credential $credential -Authentication Credssp;
$sb = {
param($p1, $p2)
whoami
New-ADUser ....
}
Invoke-Command -Session $adminSession -Script $sb -ArgumentList $domain,$userPassword