Uso de credenciales de PowerShell sin que se le solicite una contraseña


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

Sé que hay un 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.

Author: Kev, 2011-06-05

8 answers

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 esto:

Usando PSCredentials sin un prompt

En resumen, crea un archivo para almacenar su contraseña (como una cadena cifrada). La siguiente línea pedirá una contraseña y luego la almacenará en c:\mysecurestring.txt como un cifrado cadena. Solo necesitas hacer esto una vez:

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

Siempre que vea un argumento -Credential en un comando de PowerShell, significa que puede pasar un PSCredential. Así que en su 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 -Authentication diferente porque no conozco su entorno.

 180
Author: Kev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-25 11:54:59

Hay otro camino, pero...

NO HAGA ESTO SI NO DESEA SU CONTRASEÑA EN EL ARCHIVO DE SCRIPT (No es una buena idea almacenar contraseñas en scripts, pero a algunos de nosotros solo 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 su uso:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
 64
Author: Jeroen Landheer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-11 20:21:11

Con respecto 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 este:

#=====================================================================
# 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 ejecute esa línea, el archivo xmlfile estará allí y se abrirá automáticamente.

 26
Author: Winfred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-05 04:47:41

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

Me gusta escribir fuertemente mis declaraciones. La declaración de tipo para str 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)
 8
Author: Bruce Gavin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-08 01:39:27

Aquí hay dos maneras de hacer esto, si está programando el reinicio.

Primero puede crear una tarea en una máquina utilizando credenciales que tengan los derechos necesarios para conectarse y reiniciar otra máquina. Esto hace que el programador sea responsable de almacenar de forma segura las credenciales. El comando reboot (soy un tipo de Powershell, pero esto es más limpio.) es:

SHUTDOWN /r /f /m \\ComputerName

La línea de comandos para crear una tarea programada en la máquina local, para reiniciar de forma remota otra, sería be:

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 forma, 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 el nombre de usuario, dejando los campos de contraseña en blanco.

 3
Author: Nathan Hartley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-09 17:27:57
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 ...

 0
Author: MockMyBeret,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-21 18:28:21

Vi un ejemplo que usa Import/Export-CLIXML.

Estos son mis comandos favoritos para el problema que está tratando de resolver. Y la forma más sencilla de usarlos es.

$passwordPath = './password.txt'
if (-not (test-path $passwordPath)) {
    $cred = Get-Credential -Username domain\username -message 'Please login.'
    Export-Cli -InputObject $cred -Path $passwordPath
}
$cred = Import-CliXML -path $passwordPath

Entonces, si el archivo no existe localmente, solicitará las credenciales y las almacenará. Esto tomará un objeto [pscredential] sin problema y ocultará las credenciales como una cadena segura.

Finalmente solo usa la credencial como lo haces normalmente.

Restart-Computer -ComputerName ... -Credentail $cred

Nota sobre Securty :

Almacene credenciales de forma segura en el disco

Al leer la Solución, es posible que al principio tenga cuidado de almacenar una contraseña en el disco. Si bien es natural (y prudente) tener cuidado de ensuciar su disco duro con información confidencial, el cmdlet Export-CliXml cifra los objetos de API de Protección de Datos estándar de Windows. Esto asegura que solo su cuenta de usuario puede descifrar correctamente su contenido. Del mismo modo, el ConvertFrom-SecureString cmdlet también encripta la contraseña que usted proporciona.

Editar: Simplemente relee la pregunta original. Lo anterior funcionará siempre y cuando haya inicializado el [pscredential] en el disco duro. Es decir, si lo suelta en su script y ejecuta el script una vez que creará ese archivo y luego ejecutar el script sin supervisión será simple.

 0
Author: ScriptingDad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 13:29:41

¿Por qué no intentas algo muy simple?

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

 -3
Author: Root Loop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-29 17:20:39