157 votes

Utilisation des informations d'identification PowerShell sans être invité à saisir un mot de passe

J'aimerais redémarrer un ordinateur distant qui appartient à un domaine. Je dispose d'un compte administrateur mais je ne sais pas comment l'utiliser à partir de powershell.

Je sais qu'il y a un Restart-Computer et que je peux passer les informations d'identification mais si mon domaine est par exemple mydomain mon nom d'utilisateur est myuser et mon mot de passe est mypassword quelle est la bonne syntaxe pour l'utiliser ?

Je dois programmer le redémarrage pour ne pas avoir à taper le mot de passe.

0 votes

Vous devriez lire ceci lien

0 votes

Que signifie get-credential domain01 \admin01 signifie ? La commande suivante est restart-computer -computername $s -force -throttlelimit 10 -credential $c. Cela signifie-t-il que get-credential récupère le mot de passe sans le demander ?

0 votes

209voto

Kev Points 60744

Le problème avec Get-Credential est qu'il demandera toujours un mot de passe. Il existe cependant un moyen de contourner ce problème, mais il implique de stocker le mot de passe sous forme de chaîne sécurisée sur le système de fichiers.

L'article suivant explique comment cela fonctionne :

Utilisation de PSCredentials sans invite

En résumé, vous créez un fichier pour stocker votre mot de passe (sous forme de chaîne cryptée). La ligne suivante demande un mot de passe et le stocke dans le fichier c:\mysecurestring.txt comme une chaîne cryptée. Vous ne devez effectuer cette opération qu'une seule fois :

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

Partout où vous voyez un -Credential sur une commande PowerShell, cela signifie que vous pouvez passer un argument PSCredential . Donc dans votre cas :

$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>

Vous pouvez avoir besoin d'un autre -Authentication valeur de commutation parce que je ne connais pas votre environnement.

25 votes

Vous pouvez également faire ConvertTo-SecureString "password" -AsPlainText -Force .

16 votes

Juste pour que ce soit clair, $password = ConvertTo-SecureString "password" -AsPlainText -Force

0 votes

-Certificat [nom d'utilisateur] était nécessaire dans les paramètres de Read-Host pour moi, sinon powershell se bloque. Après avoir passé -Credential à read-host, vous serez invité directement dans la console powershell et le mot de passe est stocké correctement. Merci pour votre aide !

72voto

Jeroen Landheer Points 3346

Il y a un autre moyen, mais...

NE LE FAITES PAS SI VOUS NE VOULEZ PAS QUE VOTRE MOT DE PASSE SOIT DANS LE FICHIER script. (Ce n'est pas une bonne idée de stocker des mots de passe dans des scripts, mais certains d'entre nous aiment savoir comment faire).

Ok, c'était l'avertissement, voici le code :

$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 aura les informations d'identification de John Doe avec le mot de passe "ABCDEF".

Moyen alternatif pour obtenir le mot de passe prêt à être utilisé :

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

0 votes

Merci. C'est très utile. Dans mon cas, j'ai créé une cmdlet powershell personnalisée qui prend un nom d'utilisateur et un mot de passe (sous forme de secureString). En interne, le cmdlet appelle plusieurs autres cmdlets, certains ont juste besoin d'un utilisateur et d'un mot de passe, mais l'un d'entre eux a besoin d'un credential, de sorte que je n'ai pas réellement besoin de coder en dur le mot de passe dans mon script.

20 votes

Un peu plus simple : $password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force

0 votes

J'essaie de comprendre comment faire pour que cela fonctionne lorsque j'utilise la fonction Send-MailMessage dans powershell. Je souhaite stocker les informations d'identification de l'utilisateur et du mot de passe de mon courrier électronique afin de ne pas avoir à les saisir en permanence. Avez-vous une idée de la façon de procéder ?

30voto

Winfred Points 448

En ce qui concerne le stockage des informations d'identification, j'utilise deux fonctions (qui sont normalement dans un module qui est chargé à partir de mon profil) :

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

Et celui-là :

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

Vous l'utilisez comme ça :

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

Si le fichier d'identification n'existe pas, vous serez invité la première fois, à ce moment-là, il stockera les informations d'identification dans une chaîne cryptée dans un fichier XML. La deuxième fois que vous exécutez cette ligne, le fichier xml est là et sera ouvert automatiquement.

10voto

Bruce Gavin Points 39

Je dois exécuter les fonctions de SCOM 2012 à partir d'un serveur distant qui nécessite un identifiant différent. J'évite les mots de passe en texte clair en passant la sortie d'une fonction de décryptage de mot de passe en entrée de ConvertTo-SecureString. Pour plus de clarté, ceci n'est pas montré ici.

J'aime bien typer fortement mes déclarations. La déclaration de type pour $strPass fonctionne correctement.

[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)

4voto

Nathan Hartley Points 1115

Voici deux façons de procéder, si vous programmez le redémarrage.

Tout d'abord, vous pourriez créer une tâche sur une machine en utilisant des informations d'identification qui ont les droits nécessaires pour se connecter et redémarrer une autre machine. Le planificateur est alors responsable du stockage sécurisé des informations d'identification. La commande de redémarrage (je suis un gars de Powershell, mais c'est plus propre.) est :

SHUTDOWN /r /f /m \\ComputerName

La ligne de commande pour créer une tâche planifiée sur la machine locale, pour en redémarrer une autre à distance, serait la suivante :

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"

Je préfère la deuxième méthode, où vous utilisez vos informations d'identification actuelles pour créer une tâche planifiée qui s'exécute avec le compte système sur une machine distante.

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

Cela fonctionne également via l'interface graphique, il suffit d'entrer SYSTEM comme nom d'utilisateur, en laissant les champs de mot de passe vides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X