Verwenden von PowerShell-Anmeldeinformationen, ohne zur Eingabe eines Kennworts aufgefordert zu werden

147

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

Ich weiß, dass es ein Restart-ComputerCmdlet gibt und dass ich Anmeldeinformationen übergeben kann, aber wenn meine Domain zum Beispiel ist mydomain, ist mein Benutzername myuserund mein Passwortmypassword die richtige Syntax, um es zu verwenden?

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

Alle Augen auf mich
quelle
Sie sollten diesen Link
Marmeladen
Was bedeutet get-credential domain01 \ admin01? Der nächste Befehl lautet restart-computer -computername $ s -force -throttlelimit 10 -credential $ c. Bedeutet dies, dass get-credential das Passwort abruft, ohne es zu fragen?
Alle Augen auf mich

Antworten:

202

Das Problem mit Get-Credential ist, dass immer nach einem Passwort gefragt wird. Es gibt jedoch einen Weg, dies zu umgehen, aber das Kennwort muss als sichere Zeichenfolge im Dateisystem gespeichert werden.

Der folgende Artikel erklärt, wie dies funktioniert:

Verwenden von PSCredentials ohne Eingabeaufforderung

Zusammenfassend erstellen Sie eine Datei zum Speichern Ihres Kennworts (als verschlüsselte Zeichenfolge). In der folgenden Zeile werden Sie aufgefordert, ein Kennwort einzugeben und es dann c:\mysecurestring.txtals verschlüsselte Zeichenfolge zu speichern . Sie müssen dies nur einmal tun:

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

Wenn Sie -Credentialin einem PowerShell-Befehl ein Argument sehen, können Sie ein Argument übergeben PSCredential. Also in deinem 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
                 <any other parameters relevant to you>

Möglicherweise benötigen Sie einen anderen -AuthenticationSchaltwert, da ich Ihre Umgebung nicht kenne.

Kev
quelle
23
Sie können auch tun ConvertTo-SecureString "password" -AsPlainText -Force.
x0n
14
Nur um es klar zu machen,$password = ConvertTo-SecureString "password" -AsPlainText -Force
Akira Yamamoto
-Credential [Benutzername] war für mich in den Read-Host-Parametern erforderlich, ansonsten hängt die Powershell nur. Nachdem Sie -Credential an read-host übergeben haben, werden Sie direkt in der Powershell-Konsole dazu aufgefordert, und das Kennwort wird korrekt gespeichert. Danke!
Sephirot
Ich versuche herauszufinden, wie dies funktioniert, wenn ich die Send-MailMessage-Funktion in Powershell verwende. Ich möchte die Anmeldeinformationen meines E-Mail-Benutzers speichern und weitergeben, damit ich sie nicht ständig eingeben muss. Haben Sie eine Idee, wie das geht?
KangarooRIOT
@ user3681591 - Ich würde empfehlen, eine neue Frage zu stellen, anstatt dies in den Kommentaren zu tun. Vielen Dank.
Kev
71

Es gibt noch einen anderen Weg, aber ...

TUN SIE DAS NICHT, WENN SIE IHR PASSWORT NICHT IN DER SCRIPT-DATEI WOLLEN (Es ist keine gute Idee, Passwörter in Skripten zu speichern, aber einige von uns nur wissen, wie.)

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 wird die Anmeldeinformationen von John Doe mit dem Passwort "ABCDEF" haben.

Alternative Mittel, um das Passwort einsatzbereit zu machen:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Jeroen Landheer
quelle
Vielen Dank. Das ist sehr hilfreich. In meinem Fall habe ich ein benutzerdefiniertes Powershell-Cmdlet erstellt, das einen Benutzernamen und ein Kennwort (als SecureString) verwendet. Intern ruft das Cmdlet mehrere andere Cmdlets auf, einige benötigen nur einen Benutzer und ein Kennwort, aber eines benötigt einen Berechtigungsnachweis, sodass ich das Kennwort in meinem Skript nicht fest codieren muss.
BenR
20
Etwas einfacher: $ password = in sicheres Ring konvertieren -String "notverysecretpassword" -AsPlainText -Force
Sam
Ich versuche herauszufinden, wie dies funktioniert, wenn ich die Send-MailMessage-Funktion in Powershell verwende. Ich möchte die Anmeldeinformationen meines E-Mail-Benutzers speichern und weitergeben, damit ich sie nicht ständig eingeben muss. Haben Sie eine Idee, wie das geht?
KangarooRIOT
@ user3681591 Das wäre Send-MailMessage -Credential $ cred (mit $ cred erstellt wie in diesem Beitrag gezeigt)
Jeroen Landheer
@JeroenLandheer Ich habe deine Antwort ausprobiert (danke für deine Hilfe!), Aber es hat nicht funktioniert. Mein Fehler ist: -Credential: Der Begriff '-Credential' wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.
KangarooRIOT
29

Zum Speichern von Anmeldeinformationen 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
    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
}

Und das hier:

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

Sie verwenden es so:

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

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

Winfred
quelle
10

Ich muss SCOM 2012-Funktionen von einem Remote-Server ausführen, für den ein anderer Berechtigungsnachweis erforderlich ist. Ich vermeide Klartext-Passwörter, indem ich die Ausgabe einer Passwort-Entschlüsselungsfunktion als Eingabe an ConvertTo-SecureString übergebe. Aus Gründen der Übersichtlichkeit wird dies hier nicht gezeigt.

Ich schreibe meine Erklärungen gerne stark. Die Typdeklaration für $ strPass funktioniert ordnungsgemäß.

[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)
Bruce Gavin
quelle
4

Hier sind zwei Möglichkeiten, wie Sie dies tun können, wenn Sie den Neustart planen.

Zuerst können Sie eine Aufgabe auf einem Computer mit Anmeldeinformationen erstellen, für die Rechte erforderlich sind, um eine Verbindung herzustellen und einen anderen Computer neu zu starten. Dadurch ist der Scheduler für die sichere Speicherung der Anmeldeinformationen verantwortlich. Der Neustartbefehl (ich bin ein Powershell-Typ, aber das ist sauberer.) Lautet:

SHUTDOWN /r /f /m \\ComputerName

Die Befehlszeile zum Erstellen einer geplanten Aufgabe auf dem lokalen Computer und zum Remote-Neustart einer anderen Aufgabe lautet:

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"

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

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

Dies funktioniert auch über die GUI. Geben Sie einfach SYSTEM als Benutzernamen ein und lassen Sie die Kennwortfelder leer.

Nathan Hartley
quelle
1
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

Seien Sie sehr vorsichtig beim Speichern von Passwörtern auf diese Weise ... es ist nicht so sicher wie ...

MockMyBeret
quelle
1

Ich habe ein Beispiel gesehen, das Import / Export-CLIXML verwendet.

Dies sind meine Lieblingsbefehle für das Problem, das Sie lösen möchten. Und der einfachste Weg, sie zu benutzen, ist.

$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

Wenn die Datei lokal nicht vorhanden ist, werden Sie aufgefordert, die Anmeldeinformationen einzugeben und zu speichern. Dies wird eine dauern[pscredential] Objekt ohne Probleme verwendet und die Anmeldeinformationen werden als sichere Zeichenfolge ausgeblendet.

Verwenden Sie zum Schluss einfach die Anmeldeinformationen wie gewohnt.

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

Hinweis zur Sicherheit :

Speichern Sie Ihre Anmeldeinformationen sicher auf der Festplatte

Wenn Sie die Lösung lesen, sind Sie möglicherweise zunächst vorsichtig, wenn Sie ein Kennwort auf der Festplatte speichern. Während es natürlich (und umsichtig) ist, vorsichtig zu sein, Ihre Festplatte mit vertraulichen Informationen zu verschmutzen, verschlüsselt das Cmdlet Export-CliXml Anmeldeinformationsobjekte mithilfe der Windows-Standard-Datenschutz-API. Dadurch wird sichergestellt, dass nur Ihr Benutzerkonto den Inhalt ordnungsgemäß entschlüsseln kann. In ähnlicher Weise verschlüsselt das Cmdlet ConvertFrom-SecureString auch das von Ihnen angegebene Kennwort.

Bearbeiten: Lesen Sie einfach die ursprüngliche Frage erneut. Das oben genannte funktioniert, solange Sie das [pscredential]auf der Festplatte initialisiert haben . Das heißt, wenn Sie das in Ihr Skript einfügen und das Skript ausführen, sobald es diese Datei erstellt, und dann das Skript unbeaufsichtigt ausführen, ist dies einfach.

ScriptingDad
quelle
1

Lösung

$userName = 'test-domain\test-login'
$password = 'test-password'

$pwdSecureString = ConvertTo-SecureString -Force -AsPlainText $password
$credential = New-Object -TypeName System.Management.Automation.PSCredential `
    -ArgumentList $userName, $pwdSecureString

Für Build-Maschinen
Ersetzen Sie im vorherigen Code die Werte für Benutzername und Kennwort durch geheime ("vor Protokollen verborgen") Umgebungsvariablen Ihrer Build-Maschine

Testergebnisse von

'# Results'
$credential.GetNetworkCredential().Domain
$credential.GetNetworkCredential().UserName
$credential.GetNetworkCredential().Password

und du wirst sehen

# Results
test-domain
test-login
test-password
it3xl
quelle
-3

Warum probierst du nicht etwas sehr Einfaches aus?

Verwenden Sie psexec mit dem Befehl 'shutdown / r / f / t 0' und einer PC-Liste von CMD.

Wurzelschleife
quelle
Das ist ein spezieller Fall. Der Punkt ist, in keinem zufälligen Szenario ein Anmeldefenster zu erzeugen.
Overmind