Utilizzo delle credenziali di PowerShell senza che sia richiesta una password


147

Vorrei riavviare un computer remoto che appartiene a un dominio. Ho un account amministratore ma non so come usarlo da PowerShell.

So che esiste un Restart-Computercmdlet e che posso passare le credenziali, ma se il mio dominio è ad esempio mydomain, il mio nome utente è myusere la mia password mypasswordqual è la sintassi giusta per usarlo?

Devo pianificare il riavvio in modo da non dover digitare la password.


Dovresti leggere questo link
marmellate

Cosa significa get-credential domain01 \ admin01? Il prossimo comando è restart-computer -computername $ s -force -throttlelimit 10 -credential $ c. Significa che get-credential recupera la password senza chiederla?
Tutti gli occhi su di me il

Risposte:


202

Il problema Get-Credentialè che richiederà sempre una password. Esiste comunque un modo per aggirare questo problema, ma implica la memorizzazione della password come stringa sicura sul filesystem.

Il seguente articolo spiega come funziona:

Utilizzo di PSCredentials senza prompt

In breve, si crea un file per memorizzare la password (come stringa crittografata). La seguente riga richiederà una password, quindi la memorizzerà c:\mysecurestring.txtcome stringa crittografata. Devi solo farlo una volta:

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

Ovunque vedi un -Credentialargomento su un comando PowerShell, significa che puoi passare a PSCredential. Quindi nel tuo caso:

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

Potrebbe essere necessario un -Authenticationvalore di commutazione diverso perché non conosco il tuo ambiente.


23
Puoi anche fare ConvertTo-SecureString "password" -AsPlainText -Force.
x0n

14
Giusto per chiarire,$password = ConvertTo-SecureString "password" -AsPlainText -Force
Akira Yamamoto,

-Credential [nome utente] è stato richiesto nei parametri Read-Host per me, altrimenti powershell si blocca. Dopo aver passato -Credential a read-host, verrà richiesto direttamente nella console di PowerShell e la password verrà archiviata correttamente. Grazie!
Sephirot

Sto cercando di capire come farlo funzionare quando utilizzo la funzione Send-MailMessage in PowerShell. Voglio archiviare le credenziali del mio utente e-mail e passarlo, quindi non devo continuare a inserirlo. Qualche idea su come farlo?
KangarooRIOT,

@ user3681591 - Consiglierei di fare una nuova domanda piuttosto che farlo nei commenti. Grazie.
Kev

71

C'è un altro modo, ma ...

NON FARE QUESTO SE NON VUOI LA TUA PASSWORD NEL FILE DI SCRIPT (Non è una buona idea archiviare le password negli script, ma ad alcuni di noi piace solo sapere come.)

Ok, quello era l'avvertimento, ecco il codice:

$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 avrà le credenziali di John Doe con la password "ABCDEF".

Mezzi alternativi per ottenere la password pronta per l'uso:

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

Grazie. Questo è molto utile Nel mio caso stavo creando un cmdlet PowerShell personalizzato che accetta un nome utente e una password (come secureString). Internamente il cmdlet chiama diversi altri cmdlet, alcuni richiedono solo un utente e una password, ma uno di essi ha bisogno di una credenziale, quindi non ho bisogno di codificare la password nel mio script.
BenR

20
Un po 'più semplice: $ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Sam

Sto cercando di capire come farlo funzionare quando utilizzo la funzione Send-MailMessage in PowerShell. Voglio archiviare le credenziali del mio utente e-mail e passarlo, quindi non devo continuare a inserirlo. Qualche idea su come farlo?
KangarooRIOT,

@ user3681591 Sarebbe Send-MailMessage -Credential $ cred (con $ cred creato come mostrato in questo post)
Jeroen Landheer

@JeroenLandheer Ho provato la tua risposta (grazie per l'aiuto!) Ma non ha funzionato. Il mio errore è: -Credential: il termine '-Credential' non è riconosciuto come il nome di un cmdlet, una funzione, un file di script o un programma eseguibile.
KangarooRIOT,

29

Per quanto riguarda l'archiviazione delle credenziali, utilizzo due funzioni (che normalmente si trovano in un modulo caricato dal mio profilo):

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

E questo:

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

Lo usi in questo modo:

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

Se il file delle credenziali non esiste, ti verrà richiesto la prima volta, a quel punto memorizzerà le credenziali in una stringa crittografata all'interno di un file XML. La seconda volta che si esegue quella riga, il file xml è lì e verrà aperto automaticamente.


10

Devo eseguire le funzioni di SCOM 2012 da un server remoto che richiede credenziali diverse. Evito le password in chiaro passando l'output di una funzione di decodifica della password come input a ConvertTo-SecureString. Per chiarezza, questo non è mostrato qui.

Mi piace fortemente scrivere le mie dichiarazioni. La dichiarazione del tipo per $ strPass funziona correttamente.

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

4

Ecco due modi per farlo, se stai pianificando il riavvio.

Innanzitutto è possibile creare un'attività su un computer utilizzando le credenziali che dispongono dei diritti necessari per connettersi e riavviare un altro computer. Ciò rende lo scheduler responsabile della memorizzazione sicura delle credenziali. Il comando reboot (sono un ragazzo Powershell, ma questo è più pulito.) È:

SHUTDOWN /r /f /m \\ComputerName

La riga di comando per creare un'attività pianificata sul computer locale, per riavviare in remoto un'altra, sarebbe:

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"

Preferisco il secondo modo, in cui si utilizzano le credenziali correnti per creare un'attività pianificata che viene eseguita con l'account di sistema su un computer remoto.

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

Questo funziona anche attraverso la GUI, basta inserire SYSTEM come nome utente, lasciando vuoti i campi della password.


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

Fai molta attenzione a memorizzare le password in questo modo ... non è sicuro come ...


1

Ho visto un esempio che utilizza Import / Export-CLIXML.

Questi sono i miei comandi preferiti per il problema che stai cercando di risolvere. E il modo più semplice per usarli è.

$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

Quindi, se il file non esiste localmente, richiederà le credenziali e le memorizzerà. Ciò richiederà un [pscredential]oggetto senza problemi e nasconderà le credenziali come stringa sicura.

Infine, usa le credenziali come fai di solito.

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

Nota sulla sicurezza :

Archivia in modo sicuro le credenziali sul disco

Quando leggi la soluzione, potresti inizialmente essere prudente nel memorizzare una password sul disco. Mentre è naturale (e prudente) essere cauti di sporcare il disco rigido con informazioni riservate, il cmdlet Export-CliXml crittografa gli oggetti credenziali utilizzando l'API di protezione dei dati standard di Windows. Questo assicura che solo il tuo account utente possa decifrare correttamente il suo contenuto. Analogamente, il cmdlet ConvertFrom-SecureString crittografa anche la password fornita.

Modifica: rileggi solo la domanda originale. Quanto sopra funzionerà finché avrai inizializzato [pscredential]il disco rigido. Cioè se lo lasci cadere nel tuo script ed esegui lo script una volta che creerà quel file e quindi eseguire lo script incustodito sarà semplice.


1

Soluzione

$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

Per macchine da costruzione
Nel codice precedente sostituisci i valori di nome utente e password con variabili di ambiente segrete ("nascoste dai registri") della tua macchina da costruzione

Risultati del test di

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

e vedrai

# Results
test-domain
test-login
test-password

-3

perché non provi qualcosa di molto semplice?

usa psexec con il comando 'shutdown / r / f / t 0' e un elenco di PC da CMD.


Questo è un caso specifico. Il punto non sta generando una finestra di accesso in nessuno scenario casuale.
Overmind
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.