powershell credentials remote-access sharpssh

Obtiene el objeto de credenciales de usuario actual en Powershell sin preguntar



credentials remote-access (3)

Tengo un script de Powershell que se ejecutará a través de una herramienta de automatización contra varios servidores. Funciona bien en máquinas con Windows, ya que las llamadas remotas utilizan la cuenta de servicio de la herramienta sin necesidad de solicitar ni exponer ninguna credencial en el código. Esta secuencia de comandos también se ejecuta contra máquinas Linux a través de SSH utilizando el paquete SharpSSH. SharpSSH no utiliza automáticamente las credenciales del usuario de Powershell, pero requiere un nombre de usuario y contraseña, un archivo de clave RSA o un objeto PSCredential. No puedo solicitar credenciales con Get-Credential porque se está ejecutando a través de la herramienta de automatización. No quiero exponer el nombre de usuario y la contraseña en el código o tener una clave RSA ahí. Me gustaría construir un objeto PSCredential del usuario actual de Powershell (la cuenta de servicio). Probar [System.Net.CredentialCache] :: DefaultNetworkCredentials muestra un espacio en blanco, y [System.Security.Principal.WindowsIdentity] :: GetCurrent () no proporciona el objeto o la información que necesito.

¿Alguien tiene un método para crear un objeto PSCredential del usuario actual? ¿O tal vez una alternativa completamente diferente para este problema?

¡Muchas gracias!


¿Qué hay de cifrar la contraseña utilizando la clave de cifrado de la cuenta de servicio?

Un ejemplo rápido:

Ejecute PowerShell como la cuenta de servicio, ejecute lo siguiente y guarde el resultado en un archivo de texto (o incrústelo en la llamada a la tarea programada):

$String = ''<PASSWORD>'' ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $String -AsPlainText -Force)

Use lo siguiente en su tarea programada para descifrar y utilizar la contraseña:

$EncryptedString = ''<ENCRYPTED PASSWORD FROM ABOVE>'' [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString)))

Eso debería hacer el truco. Sin embargo, no puede reutilizar la contraseña encriptada en una computadora diferente, o si por alguna razón destruye su tienda de claves local :)


Dado que puede obtener la contraseña en texto plano de un objeto de credencial, dudo que pueda obtenerlo sin preguntar.


La API de Windows no expondrá la información que necesita, por lo que Powershell no puede acceder a ellos. Es una característica intencional del subsistema de seguridad. La única forma de que esto funcione es que las máquinas Linux confíen en la máquina que llama, como unirlas a un Directorio Activo (o cualquier configuración de Kerberos en realidad).

Aparte de eso, necesitarías almacenar y pasar esta información de alguna manera.

Puede almacenar la clave RSA en el almacén de claves del usuario y extraerla en tiempo de ejecución (utilizando .NET Crypto / Keystore libs), por lo que no está almacenando la clave con el código. De esta forma, la clave en sí misma estaría protegida por el sistema operativo y disponible solo cuando el usuario llamante fuera autenticado. Tendrías que instalar una cosa más, pero puede ser la única forma de lograr lo que estás buscando.