specific script run remoto remote pssession how computer commands powershell powershell-remoting

script - Usar credenciales de PowerShell sin que se solicite una contraseña



session specific commands in powershell (7)

¿Por qué no intentas algo muy simple?

use psexec con el comando ''shutdown / r / f / t 0'' y una lista de PC desde CMD.

Me gustaría reiniciar una computadora remota que pertenece a un dominio. Tengo una cuenta de administrador pero no sé cómo usarlo desde PowerShell.

Sé que hay un cmdlet Restart-Computer y que puedo pasar las credenciales, pero si mi dominio es, por ejemplo, mydomain , mi nombre de usuario es myuser y mi contraseña es mypassword ¿ mypassword es la sintaxis correcta para usarla?

Necesito programar el reinicio para no tener que escribir la contraseña.


Aquí hay dos maneras en que puede hacer esto, si está programando el reinicio.

Primero, podría crear una tarea en una máquina usando credenciales que tengan los derechos necesarios para conectarse y reiniciar otra máquina. Esto hace que el planificador sea responsable de almacenar de manera segura las credenciales. El comando de reinicio (soy un tipo Powershell, pero esto es más limpio.) Es:

SHUTDOWN /r /f /m //ComputerName

La línea de comando para crear una tarea programada en la máquina local, para reiniciar remotamente otra, sería:

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f /m //ComputerName" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU "domain/username" /RP "password"

Prefiero la segunda manera, donde usa sus credenciales actuales para crear una tarea programada que se ejecuta con la cuenta del sistema en una máquina remota.

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU SYSTEM /S ComputerName

Esto también funciona a través de la GUI, simplemente ingrese SYSTEM como nombre de usuario, dejando los campos de contraseña en blanco.


El problema con Get-Credential es que siempre solicitará una contraseña. Sin embargo, hay una forma de evitar esto, pero implica almacenar la contraseña como una cadena segura en el sistema de archivos.

El siguiente artículo explica cómo funciona esto:

Usar PSCredentials sin un aviso

En resumen, usted crea un archivo para almacenar su contraseña (como una cadena encriptada). La siguiente línea solicitará una contraseña y luego la almacenará en c:/mysecurestring.txt como una cadena encriptada. Sólo necesitas hacer esto una vez:

read-host -assecurestring | convertfrom-securestring | out-file C:/mysecurestring.txt

Donde quiera que vea un argumento -Credential en un comando de PowerShell, significa que puede pasar un PSCredential . Entonces en tu caso:

$username = "domain01/admin01" $password = Get-Content ''C:/mysecurestring.txt'' | ConvertTo-SecureString $cred = new-object -typename System.Management.Automation.PSCredential ` -argumentlist $username, $password $serverNameOrIp = "192.168.1.1" Restart-Computer -ComputerName $serverNameOrIp ` -Authentication default ` -Credential $cred <any other parameters relevant to you>

Es posible que necesite un valor de cambio de -Authentication diferente porque no conozco su entorno.


En cuanto al almacenamiento de credenciales, utilizo dos funciones (que normalmente están en un módulo que se carga desde mi perfil):

#===================================================================== # Get-MyCredential #===================================================================== function Get-MyCredential { param( $CredPath, [switch]$Help ) $HelpText = @" Get-MyCredential Usage: Get-MyCredential -CredPath `$CredPath If a credential is stored in $CredPath, it will be used. If no credential is found, Export-Credential will start and offer to Store a credential at the location specified. "@ if($Help -or (!($CredPath))){write-host $Helptext; Break} if (!(Test-Path -Path $CredPath -PathType Leaf)) { Export-Credential (Get-Credential) $CredPath } $cred = Import-Clixml $CredPath $cred.Password = $cred.Password | ConvertTo-SecureString $Credential = New-Object System.Management.Automation.PsCredential($cred.UserName, $cred.Password) Return $Credential }

Y éste:

#===================================================================== # Export-Credential # Usage: Export-Credential $CredentialObject $FileToSaveTo #===================================================================== function Export-Credential($cred, $path) { $cred = $cred | Select-Object * $cred.password = $cred.Password | ConvertFrom-SecureString $cred | Export-Clixml $path }

Lo usas así:

$Credentials = Get-MyCredential (join-path ($PsScriptRoot) Syncred.xml)

Si el archivo de credenciales no existe, se le preguntará la primera vez, en ese momento almacenará las credenciales en una cadena cifrada dentro de un archivo XML. La segunda vez que ejecuta esa línea, xmlfile está allí y se abrirá automáticamente.


Hay otra manera, pero ...

NO HAGA ESTO SI NO DESEA SU CONTRASEÑA EN EL ARCHIVO DE ESCRITURA (No es una buena idea guardar contraseñas en las secuencias de comandos, pero a algunos de nosotros nos gusta saber cómo).

Ok, esa fue la advertencia, aquí está el código:

$username = "John Doe" $password = "ABCDEF" $secstr = New-Object -TypeName System.Security.SecureString $password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)} $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

$cred tendrá las credenciales de John Doe con la contraseña "ABCDEF".

Medios alternativos para obtener la contraseña lista para usar:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force


Tengo que ejecutar las funciones de SCOM 2012 desde un servidor remoto que requiere una credencial diferente. Evito las contraseñas de texto sin cifrar pasando la salida de una función de descifrado de contraseñas como entrada a ConvertTo-SecureString. Para mayor claridad, esto no se muestra aquí.

Me gusta escribir fuertemente mis declaraciones. La declaración de tipo para $ strPass funciona correctamente.

[object] $objCred = $null [string] $strUser = ''domain/userID'' [System.Security.SecureString] $strPass = '''' $strPass = ConvertTo-SecureString -String "password" -AsPlainText -Force $objCred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($strUser, $strPass)


read-host -assecurestring | convertfrom-securestring | out-file C:/securestring.txt $pass = cat C:/securestring.txt | convertto-securestring $mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "test",$pass $mycred.GetNetworkCredential().Password

Tenga mucho cuidado con el almacenamiento de contraseñas de esta manera ... no es tan seguro como ...