web-dev-qa-db-ja.com

Powershellリモート処理-ポリシーはユーザー資格情報の委任を許可しません

私はPowerShellの初心者であり、資格情報の委任の使用に問題があります。次のスクリプトがあります。

$session = New-PSSession myserver -Authentication CredSSP -Credential DOMAIN\Administrator
Invoke-Command -Session $session -ScriptBlock { <Some PowerShell Command> }

実行する前に、次のことを行いました。

  1. 実行Enable-PSRemoting myserverで。
  2. 実行Enable-WSManCredSSP Server myserverで。
  3. 実行Restart-Service WinRM myserverで。
  4. 実行Enable-WSManCredSSP Client –DelegateComputer myserverクライアント上。
  5. サーバーとクライアントの両方を再起動しました。

しかし、スクリプトを実行すると、次のエラーメッセージが表示されます。

[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

エラーメッセージに記載されているようにポリシーをチェックしましたが、すべて問題ないようです。他に何が私をブロックしているのでしょうか?

23
ChrisB

このページ のおかげでようやく機能するようになりました。適切なレジストリキーを直接設定して、必要な資格情報の委任ポリシーを設定するスクリプトを提供します。管理者権限でそのスクリプトを実行すると、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++
}
12
ChrisB

サーバーで以下を実行する必要がありました。

Enable-WSManCredSSP -Role Server

クライアントで次のことを行う必要がありました。

set-item wsman:localhost\client\trustedhosts -value *

Enable-WSManCredSSP -Role Client –DelegateComputer *

クライアントでgpedit.mscを使用して、WSMAN/*への新しい資格情報の委任を有効にします。

  1. Local Computer PolicyComputer ConfigurationAdministrative TemplatesSystemの順に展開し、Credential Delegationをクリックします。
  2. Settingsペインで、Allow Delegating Fresh Credentials with NTLM-only Server Authenticationをダブルクリックします。
  3. [Allow Delegating Fresh Credentials with NTLM-only Server Authentication]ダイアログボックスで、次の手順を実行します。
  4. Enabledをクリックします。
  5. Optionsエリアで、[Show]をクリックします。
  6. [値]に「WSMAN/*」と入力し、[OK]をクリックします。 Concatenate OS defaults with input aboveが選択されていることを確認し、OKをクリックします。

次のコマンドが機能するようになりました(パスワードプロンプトの後):

Invoke-Command { dir \\fileserver\devtools } -computer appserver01 -authentication credssp -credential domain\user

MSDNフォーラム を参照してください。

TechNet を参照してください

22
Akira Yamamoto

上記のAkiraの答えを拡張して、gpedit.mscで、「新しい資格情報の委任を許可する」ではなく、「NTLMのみのサーバー認証で新しい資格情報の委任を許可する」を設定する必要がありました。

5
Badajoz95

私のソリューション、特に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
3
Chris