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.
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
<any other parameters relevant to you>
Puede que necesites un valor diferente de Autenticación
porque no conozco tu entorno.
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
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.