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

3voto

ScriptingDad Punkte 23

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

Dies sind meine Lieblingsbefehle für das Problem, das du zu lösen versuchst. Und der einfachste Weg, sie zu verwenden, ist.

$passwordPath = './password.txt'
if (-not (test-path $passwordPath)) {
    $cred = Get-Credential -Username domain\username -message 'Bitte anmelden.'
    Export-CliXML -InputObject $cred -Path $passwordPath
}
$cred = Import-CliXML -path $passwordPath

Wenn die Datei also lokal nicht vorhanden ist, werden die Anmeldeinformationen abgefragt und gespeichert. Dies nimmt ein [pscredential]-Objekt ohne Probleme an und verbirgt die Anmeldeinformationen als sicheren String.

Verwenden Sie abschließend die Anmeldeinformationen wie gewohnt.

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

Hinweis zur Sicherheit:

Anmeldeinformationen sicher auf der Festplatte speichern

Beim Lesen der Lösung könntest du zunächst zögern, ein Passwort auf der Festplatte zu speichern. Obwohl es natürlich (und vernünftig) ist, vorsichtig zu sein, deinen Festplattenlaufwerk mit sensiblen Informationen zu überfluten, verschlüsselt der Export-CliXml-Befehl Anmeldeinformationsobjekte mithilfe des Windows-Standard-Datenschutz-API. Dies stellt sicher, dass nur dein Benutzerkonto den Inhalt ordnungsgemäß entschlüsseln kann. Ebenso verschlüsselt der ConvertFrom-SecureString-Befehl auch das von dir bereitgestellte Passwort.

Bearbeitung: Habe die Originalfrage nochmal gelesen. Das oben Genannte funktioniert, solange du das [pscredential] auf der Festplatte initialisiert hast. Das bedeutet, wenn du das in dein Skript einfügst und das Skript einmal ausführst, wird diese Datei erstellt und das Ausführen des Skripts unbeaufsichtigt wird einfach sein.

1 Stimmen

Schön. Können Sie einen Tippfehler korrigieren "Export-CliXML", das "xml" fehlt.

1voto

MockMyBeret Punkte 11
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...

1voto

it3xl Punkte 1754

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 Benutzername und Passwortwerte durch geheime ("aus Logs ausgeblendete") Umgebungsvariablen Ihrer Build-Maschine

Testergebnisse von

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

und Sie werden sehen

# Ergebnisse
test-domain
test-login
test-password

1voto

TheLostOne Punkte 21

Dies ist das, was ich benutze und was für mich funktioniert.

$User="Domain\Benutzername"
$Password=[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('VABlAHMAdABQAGEAcwBzAHcAbwByAGQA'))

$SecurePassword = New-Object -TypeName System.Security.SecureString
$Password.ToCharArray() | ForEach-Object {$SecurePassword.AppendChar($_)}

$Credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $SecurePassword

Und um VABlAHMAdABQAGEAcwBzAHcAbwByAGQA zu erhalten, mache ich folgendes:

$EString bedeutet verschlüsselter String und $DString bedeutet entschlüsselter String

$EString = Read-Host "Text zum Codieren eingeben" -AsSecureString
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($EString)
$DString=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
$Encoded=[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($DString))

$Encoded # VABlAHMAdABQAGEAcwBzAHcAbwByAGQA
$DString # TestPasswort

So kann ich jedes beliebige Passwort im Skript verwenden, ohne zu viel Aufwand.

0voto

user3233781 Punkte 1

Im Falle des unten stehenden Codes könnte es jemandem helfen.

function Get-RemoteConnection()
{
    //$serverIp kann als Parameter der Funktion übergeben werden.
    //Ich mache es nur für Testzwecke statisch.
    $serverIp = '192.168.100.137'
    Enable-PSRemoting -Force
    Set-Item wsman:\localhost\client\trustedhosts $serverIp
    Restart-Service WinRM
    #Set credentials needed for remote installation
    $userName = "administrator"
    $password = ConvertTo-SecureString "2020core0515" -AsPlainText -Force
    $cred = New-Object System.Management.Automation.PSCredential -ArgumentList ($userName, $password)
    $session = New-PSSession -ComputerName $serverIp -Credential $cred

    $a = Invoke-Command -Session $session -ScriptBlock {  Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" | Select-Object DeviceID, @{label='UsedPercent'; expression={[Math]::Round((($_.size - $_.freespace) / $_.size) * 100, 2)}} }

    Write-Host $a

    return $session
}

function Delete-RemoteConnection($session)
{
    Disconnect-PSSession $session | Out-Null
    Disable-WSManCredSSP -Role Client
}

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