¿Cómo conservar las credenciales en una sesión remota de Powershell?

13

Tengo un recurso compartido de archivos de Azure y me gustaría usarlo desde mis máquinas virtuales de Azure, después de conservar las credenciales en las máquinas virtuales con cmdkey y montarlas con uso neto. Esto se probó ejecutando estos comandos en una sesión local de Powershell en Windows Server 2012 R2.

Pero necesito agregar este paso a un script de implementación de Azure. Un script de Azure Powershell se ejecuta desde mi computadora portátil, se conecta a la suscripción de Azure y crea las máquinas virtuales desde cero, utilizando muchas variables.

Descubrí el uso de Invoke-Command para pasar las variables del script de Azure Powershell a una sesión remota de Powershell en la máquina virtual recién creada.

$Session = New-PSSession -ConnectionUri $Uri -Credential $DomainCredential

$ScriptBlockContent = { 
Param ($Arg1,$Arg2,$Arg3)
cmdkey /add:$Arg1 /user:$Arg2 /pass:$Arg3}

Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)

Y el error:

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)
CMDKEY: Credentials cannot be saved from this logon session.

Reemplazado con cmdkey / list para verificar la sintaxis, y no hay error.

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent
Currently stored credentials:
* NONE *

Tuve un problema similar (y no pude solucionarlo) con el Módulo de actualización de Windows PowerShell (Invoke-WUInstall), que funciona bien en una sesión local de Powershell en la VM, pero no se actualiza cuando se inicia a través de Powershell remoto.

¿Alguna forma de evitar esto?

Razvan Zoitanu
fuente

Respuestas:

2

Debido a cómo Windows maneja la autenticación, no es posible usar CMDKEY para establecer credenciales a través de una sesión remota de PowerShell, debe hacerse de manera interactiva cuando se usa CMDKEY.

Para citar a Don Jones de un hilo que busca una respuesta similar a la suya:

Esa es una limitación del comando Cmdkey, no es realmente una cosa de PowerShell. Pero está relacionado con la forma en que Remotig maneja las credenciales. La sesión remota en realidad no obtiene una credencial, obtiene un ticket delegado, por lo que no hay token para guardar. Eso es todo por diseño, y no es algo que pueda reconfigurar.

Persistente13
fuente
2

Puede usar PsExec.exe de Sysinternal si no desea usar la Tarea Programada. Normalmente, cuando inicia una sesión de PowerShell, se ejecuta en el servicesproceso (puede confirmar esto ejecutando el query sessioncomando en la computadora remota) en lugar del usuario local que falla cmdkey.

Para superar esto, necesitamos ejecutar cmdkey.exe en el proceso del usuario local, que se puede hacer mediante el uso de PsExec.exe's -iflag

Ejecute el programa para que interactúe con el escritorio de la sesión especificada en el sistema remoto. Si no se especifica ninguna sesión, el proceso se ejecuta en la sesión de la consola.

Ahora, el desafío es obtener la identificación de sesión del usuario local en la máquina remota. Lo logré ejecutando un query sessioncomando que proporciona una lista de sesiones activas en la máquina. Una de las posibles soluciones es:

$processId = Invoke-Command $session -ScriptBlock  {
param($user)
    $sessions = query session $user;
    return $sessions[1].split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)[2];

} -ArgumentList ($user)

Aquí $usercontiene el nombre de usuario del usuario local en la computadora remota.

Una vez que obtenga la identificación de la sesión, simplemente puede ejecutar

PsExec \\<computer_name> -u <local_user_name> -p <password> -h -i $processId cmdkey.exe /generic:testtt /user:userr /pass:pass

Nota:

  1. Puede haber mejores formas de obtener la identificación de sesión de un usuario en la máquina remota.
  2. En este momento, mientras ejecuto PsExec, nuevamente estoy haciendo una conexión con el sistema remoto que se puede evitar (no lo he probado).
  3. El usuario que ejecuta el comando debe tener acceso de administrador en la máquina remota.
Ankit Aggarwal
fuente