Utilizar las credenciales de PowerShell sin que se le pida la contraseña

Me gustaría reiniciar un ordenador remoto que pertenece a un dominio. Tengo una cuenta de administrador pero no sé cómo usarla desde powershell.

Sé que existe el cmdlet Restart-Computer y que puedo pasar credenciales pero si mi dominio es por ejemplo mydomain, mi nombre de usuario es myuser y mi contraseña es mypassword ¿cuál es la sintaxis correcta para usarlo?

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

Solución

El problema con Get-Credential es que siempre pedirá una contraseña. Sin embargo, hay una manera 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:

Usar PSCredentials sin preguntar]1

En resumen, usted crea un archivo para almacenar su contraseña (como una cadena encriptada). La siguiente línea pedirá una contraseña y 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

Siempre que veas un argumento Credencial en un comando PowerShell significa que puedes pasar un PSCredential. Así que 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

Puede que necesites un valor diferente de Autenticación porque no conozco tu entorno.

Comentarios (6)

Hay otra manera, pero...

NO HAGA ESTO SI NO QUIERE QUE SU CONTRASEÑA ESTÉ EN EL ARCHIVO DE LA SECUENCIA DE COMANDOS (No es una buena idea almacenar las contraseñas en los scripts, pero a algunos nos gusta saber cómo hacerlo).

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 su uso:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Comentarios (5)

En cuanto al almacenamiento de credenciales, uso 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 esta otra:

#=====================================================================
# 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
}

Se usa así:

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

Si el archivo de credenciales no existe, se te pedirá la primera vez, en ese momento almacenará las credenciales en una cadena encriptada dentro de un archivo XML. La segunda vez que ejecute esa línea, el archivo xml estará ahí y se abrirá automáticamente.

Comentarios (0)