script - Control remoto de Powershell: la política no permite la delegación de credenciales de usuario
powershell remoto (4)
Ampliando la respuesta anterior de Akira, en gpedit.msc tuve que configurar "Permitir delegaciones de credenciales nuevas con autenticación de servidor solo NTLM" en lugar de "Permitir delegaciones de credenciales nuevas".
Soy nuevo en PowerShell y tengo problemas para usar la delegación de credenciales. Tengo el siguiente script:
$session = New-PSSession myserver -Authentication CredSSP -Credential DOMAIN/Administrator
Invoke-Command -Session $session -ScriptBlock { <Some PowerShell Command> }
Antes de ejecutarlo, hice lo siguiente:
- Ejecute
Enable-PSRemoting
en myserver. - Ejecute el
Enable-WSManCredSSP Server
en myserver. - Ejecute
Restart-Service WinRM
en myserver. - Ejecute
Enable-WSManCredSSP Client –DelegateComputer myserver
en el cliente. - Reiniciado tanto el servidor como el cliente.
Pero una vez que ejecuto el script, aparece el siguiente mensaje de error:
[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
Revisé las políticas como se menciona en el mensaje de error, pero todo parece estar bien. ¿Qué más podría bloquearme?
Finalmente lo puse a funcionar gracias a esta página . Proporciona un script que establece las políticas de delegación de credenciales necesarias configurando directamente las claves de registro apropiadas. Una vez que ejecuté ese script con privilegios de administrador, pude establecer con éxito una conexión CredSSP a myserver:
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++
}
Tuve la necesidad de automatizar completamente mi solución, en particular la sección de la parte de la solución que te permite ingresar al editor de GPO.
1) Habilitar PS remoto
Enable-PSRemoting -force
2) Habilitar 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) Habilitar las credenciales frescas de NTLM a través del Registro:
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
Solo después de esto pude lanzar el script de powershell como el administrador local que pudo ejecutarse en una PSSession y realizar acciones de AD de forma previa.
$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
Tuve que hacer lo siguiente en el servidor:
Enable-WSManCredSSP -Role Server
Tuve que hacer lo siguiente en el cliente:
set-item wsman:localhost/client/trustedhosts -value *
Enable-WSManCredSSP -Role Client –DelegateComputer *
Utilice gpedit.msc
en el cliente para habilitar la delegación de credenciales nuevas a WSMAN / *:
- Expanda
Local Computer Policy
, expandaComputer Configuration
, expandaAdministrative Templates
, expandaSystem
y luego haga clic enCredential Delegation
. - En el panel
Settings
, haga doble clic enAllow Delegating Fresh Credentials with NTLM-only Server Authentication
. - En el cuadro de diálogo
Allow Delegating Fresh Credentials with NTLM-only Server Authentication
, haga lo siguiente: - Haga clic en
Enabled
. - En el área de
Options
, haga clic enShow
. - En Valor, escriba
WSMAN/*
y luego hagaOK
enOK
. Asegúrese de que laConcatenate OS defaults with input above
esté seleccionada, y luego hagaOK
enOK
.
El siguiente comando ahora funciona (después de una solicitud de contraseña):
Invoke-Command { dir //fileserver/devtools } -computer appserver01 -authentication credssp -credential domain/user
Ver los foros de MSDN .
Ver TechNet