164 Stimmen

Verwenden von PowerShell-Anmeldeinformationen ohne nach einem Passwort gefragt zu werden

Ich möchte einen Remote-Computer neu starten, der einer Domäne angehört. Ich habe ein Administrator-Konto, weiß aber nicht, wie ich es über PowerShell verwenden kann.

Ich weiß, dass es ein Restart-Computer Cmdlet gibt und dass ich Anmeldeinformationen übergeben kann. Aber wenn meine Domäne zum Beispiel meinedomäne, mein Benutzername meinbenutzer und mein Passwort meinpasswort sind, wie lautet die richtige Syntax, um es zu verwenden?

Ich muss den Neustart planen, damit ich das Passwort nicht eingeben muss.

0 Stimmen

Sie sollten diesen Link lesen.

0 Stimmen

Was bedeutet get-credential domain01\admin01? Der nächste Befehl lautet restart-computer -computername $s -force -throttlelimit 10 -credential $c. Bedeutet das, dass get-credential das Passwort abruft, ohne danach zu fragen?

0 Stimmen

214voto

Kev Punkte 115293

Das Problem mit Get-Credential ist, dass es immer nach einem Passwort fragen wird. Es gibt jedoch einen Weg, dies zu umgehen, der jedoch das Speichern des Passworts als sichere Zeichenfolge auf dem Dateisystem beinhaltet.

Der folgende Artikel erklärt, wie das funktioniert:

Verwendung von PSCredentials ohne Aufforderung

Zusammenfassend erstellen Sie eine Datei, um Ihr Passwort zu speichern (als verschlüsselte Zeichenfolge). Die folgende Zeile wird nach einem Passwort fragen und es dann in c:\mysecurestring.txt als verschlüsselte Zeichenfolge speichern. Dies müssen Sie nur einmal tun:

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

Wo immer Sie ein -Credential-Argument in einem PowerShell-Befehl sehen, bedeutet dies, dass Sie ein PSCredential übergeben können. Also in Ihrem Fall:

$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

Sie benötigen möglicherweise einen anderen -Authentication-Schalterwert, weil ich Ihre Umgebung nicht kenne.

27 Stimmen

Sie können auch ConvertTo-SecureString "password" -AsPlainText -Force ausführen.

18 Stimmen

Nur um es klar zu machen, $password = ConvertTo-SecureString "password" -AsPlainText -Force

0 Stimmen

-Anmeldeinformationen [Benutzername] wurden in den Read-Host-Parametern für mich benötigt, da PowerShell sonst einfach hängen bleibt. Nachdem -Credential an Read-Host übergeben wurde, werden Sie direkt in der PowerShell-Konsole aufgefordert und das Passwort wird korrekt gespeichert. Vielen Dank!

73voto

Jeroen Landheer Punkte 8240

Es gibt noch einen anderen Weg, aber...

TUN SIE DAS NICHT, WENN SIE NICHT WOLLEN, DASS IHR PASSWORT IN DER SKRIPTDATEI STEHT (Es ist keine gute Idee, Passwörter in Skripts zu speichern, aber einige von uns möchten es einfach nur wissen.)

Ok, das war die Warnung, hier ist der 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 hat die Anmeldeinformationen von John Doe mit dem Passwort "ABCDEF".

Alternative Möglichkeiten, um das Passwort für die Verwendung vorzubereiten:

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

0 Stimmen

Danke. Das ist sehr hilfreich. In meinem Fall habe ich ein benutzerdefiniertes PowerShell-Cmdlet erstellt, das einen Benutzernamen und ein Passwort (als secureString) benötigt. Intern ruft das Cmdlet mehrere andere Cmdlets auf, bei denen einige nur einen Benutzer und ein Passwort benötigen, aber eines davon benötigt Anmeldeinformationen, sodass ich das Passwort tatsächlich nicht im Skript festcodieren muss.

21 Stimmen

Etwas einfacher: $password = umwandeln in-sicherestring -Zeichenfolge "nichtsehrgeheimepasswort" -AlsPlainText -Force

0 Stimmen

Ich versuche herauszufinden, wie ich das zum Laufen bekomme, wenn ich die Send-MailMessage-Funktion in Powershell verwende. Ich möchte die Anmeldeinformationen meines E-Mail-Benutzers und Passworts speichern, damit ich es nicht immer wieder eingeben muss. Irgendwelche Ideen, wie das geht?

30voto

Winfred Punkte 939

Über das Speichern von Anmeldedaten verwende ich zwei Funktionen (die normalerweise in einem Modul enthalten sind, das aus meinem Profil geladen wird):

#=====================================================================
# Get-MyCredential
#=====================================================================
function Get-MyCredential
{
param(
$CredPath,
[switch]$Help
)
$HelpText = @"

    Get-MyCredential
    Verwendung:
    Get-MyCredential -CredPath `$CredPath

    Wenn Anmeldeinformationen unter $CredPath gespeichert sind, werden sie verwendet.
    Wenn keine Anmeldeinformationen gefunden werden, wird Export-Credential gestartet und bietet an,
    Anmeldeinformationen an dem angegebenen Speicherort zu speichern.

"@
    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
}

Und dieser:

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

Sie verwenden es so:

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

Wenn die Anmeldeinformationsdatei nicht vorhanden ist, werden Sie beim ersten Mal zur Eingabe aufgefordert. Zu diesem Zeitpunkt werden die Anmeldeinformationen in einer verschlüsselten Zeichenfolge in einer XML-Datei gespeichert. Wenn Sie diese Zeile das zweite Mal ausführen, ist die XML-Datei vorhanden und wird automatisch geöffnet.

10voto

Bruce Gavin Punkte 349

Ich muss SCOM 2012 Funktionen von einem Remote-Server ausführen, der eine andere Anmeldeinformation benötigt. Ich vermeide Klartextkennwörter, indem ich die Ausgabe einer Passwortentschlüsselungsfunktion als Eingabe an ConvertTo-SecureString weitergebe. Zur Verdeutlichung wird dies hier nicht gezeigt.

Ich mag es, meine Deklarationen stark zu typisieren. Die Typdeklaration für $strPass funktioniert korrekt.

[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 Punkte 3713

Hier sind zwei Möglichkeiten, dies zu tun, wenn Sie den Neustart planen.

Erstens könnten Sie eine Aufgabe auf einer Maschine erstellen, die über die erforderlichen Rechte verfügt, um eine Verbindung herzustellen und eine andere Maschine neu zu starten. Dadurch wird der Zeitplaner dafür verantwortlich, die Anmeldeinformationen sicher zu speichern. Der Neustartsbefehl (Ich bin ein Powershell-Typ, aber das ist sauberer.) lautet:

SHUTDOWN /r /f /m \\ComputerName

Der Befehlszeilenbefehl zum Erstellen einer geplanten Aufgabe auf der lokalen Maschine, um eine andere remote neu zu starten, würde lauten:

SCHTASKS /Create /TN "Server neu starten" /TR "shutdown.exe /r /f /m \\ComputerName" /SC EINMAL /ST 00:00 /SD "24.12.2012" /RU "domäne\benutzername" /RP "passwort"

Ich bevorzuge die zweite Methode, bei der Sie Ihre aktuellen Anmeldeinformationen verwenden, um eine geplante Aufgabe zu erstellen, die mit dem Systemkonto auf einer entfernten Maschine ausgeführt wird.

SCHTASKS /Create /TN "Server neu starten" /TR "shutdown.exe /r /f" /SC EINMAL /ST 00:00 /SD "24.12.2012" /RU SYSTEM /S ComputerName

Dies funktioniert auch über die GUI, geben Sie einfach SYSTEM als Benutzernamen ein und lassen Sie die Passwortfelder leer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X