164 Stimmen

Die Verwendung von PowerShell-Anmeldeinformationen, ohne zur Eingabe eines Passworts aufgefordert zu werden.

Ich möchte einen Remote-Computer neu starten, der zu einer Domäne gehört. Ich habe ein Administrator-Konto, weiß aber nicht, wie ich es von Powershell aus verwenden soll.

Ich weiß, dass es einen Restart-Computer cmdlet gibt und dass ich Anmeldeinformationen übergeben kann, aber wenn meine Domäne z. B. meineDomäne ist, mein Benutzername meinBenutzer ist und mein Passwort meinPasswort ist, 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 ist 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 fragt. Es gibt jedoch einen Weg, wie man das umgehen kann, indem man das Passwort als Secure String auf dem Dateisystem speichert.

Der folgende Artikel erklärt, wie das funktioniert:

Verwendung von PSCredentials ohne Aufforderung

Zusammengefasst erstellen Sie eine Datei, um Ihr Passwort zu speichern (als verschlüsselten String). Die folgende Zeile fordert Sie auf, ein Passwort einzugeben und speichert es dann als verschlüsselten String in c:\mysecurestring.txt. Dies müssen Sie nur einmal tun:

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

Immer wenn Sie ein -Credential Argument in einem PowerShell-Befehl sehen, bedeutet dies, dass Sie eine 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, da 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, sonst hängt Powershell einfach. Nachdem -Anmeldeinformationen an read-host übergeben wurden, werden Sie direkt im Powershell-Konsole aufgefordert und das Passwort wird korrekt gespeichert. Vielen Dank!

73voto

Jeroen Landheer Punkte 8240

Es gibt noch einen anderen Weg, aber...

TU DAS NICHT, WENN DU NICHT MÖCHTEST, DASS DEIN PASSWORT IN DER SKRIPTDATEI STEHT (Es ist keine gute Idee, Passwörter in Skripts zu speichern, aber einige von uns möchten einfach nur wissen, wie es geht.)

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 enthält die Anmeldedaten von John Doe mit dem Passwort "ABCDEF".

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

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

0 Stimmen

Vielen Dank. Dies 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, einige benötigen nur einen Benutzer und ein Passwort, aber eines von ihnen benötigt Anmeldeinformationen. Daher muss ich das Passwort nicht tatsächlich in meinem Skript festcodieren.

21 Stimmen

Etwas einfacher: $password = convertto-securestring -String "nichtsehrgeheimespasswort" -AsPlainText -Force

0 Stimmen

Ich versuche herauszufinden, wie ich dies zum Laufen bringe, wenn ich die Send-MailMessage-Funktion in Powershell verwende. Ich möchte die Anmeldeinformationen meines E-Mail-Benutzers und Passworts speichern, damit ich sie nicht jedes Mal eingeben muss. Hast du eine Idee, wie das geht?

30voto

Winfred Punkte 939

Was das Speichern von Anmeldeinformationen betrifft, verwende ich zwei Funktionen (die normalerweise in einem Modul enthalten sind, das von meinem Profil geladen wird):

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

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

    Wenn Anmeldeinformationen in $CredPath gespeichert sind, werden sie verwendet.
    Wenn keine Anmeldeinformationen gefunden werden, wird Export-Credential gestartet und bietet an,
    Anmeldeinformationen am 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 existiert, 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 diesen Befehl 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 einen anderen Anmeldeinformationen erfordert. Ich vermeide Klartextpasswörter, indem ich den Ausgang einer Passwortentschlüsselungsfunktion als Eingabe an ConvertTo-SecureString übergebe. Zur Klarstellung wird dies hier nicht gezeigt.

Ich mag es, meine Deklarationen stark zu typisieren. Die Typ-Deklaration 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, wie Sie dies tun könnten, wenn Sie den Neustart planen.

Zunächst könnten Sie eine Aufgabe auf einer Maschine erstellen, die Anmeldeinformationen verwendet, die die erforderlichen Rechte haben, um eine Verbindung herzustellen und eine andere Maschine neu zu starten. Dies macht den Scheduler 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 Maschine remote neu zu starten, wäre:

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

Ich bevorzuge den zweiten Weg, bei dem Sie Ihre aktuellen Anmeldeinformationen verwenden, um eine geplante Aufgabe zu erstellen, die mit dem Systemkonto auf einem Remote-Computer ausgeführt wird.

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f" /SC ONCE /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