Menggunakan kredensial PowerShell tanpa diminta kata sandi

147

Saya ingin memulai kembali komputer jarak jauh milik domain. Saya memiliki akun administrator tetapi saya tidak tahu cara menggunakannya dari PowerShell.

Saya tahu bahwa ada Restart-Computercmdlet dan bahwa saya dapat lulus kredensial tetapi jika domain saya misalnya mydomain, nama pengguna myusersaya dan kata sandi saya adalah mypasswordapa sintaks yang tepat untuk menggunakannya?

Saya perlu menjadwalkan reboot sehingga saya tidak perlu mengetikkan kata sandi.

semua menatapku
sumber
Anda harus membaca tautan
macet
Apa yang dimaksud dengan get-credential domain01 \ admin01? Perintah selanjutnya adalah restart-komputer -komputer $ s-force -rottlelimit 10 -kredensial $ c. Apakah itu berarti mendapatkan kredensial mengambil kata sandi tanpa menanyakannya?
semua mata pada saya

Jawaban:

202

Masalahnya Get-Credentialadalah selalu akan dimintai kata sandi. Namun ada beberapa cara untuk mengatasi hal ini, tetapi melibatkan penyimpanan kata sandi sebagai string aman pada sistem file.

Artikel berikut menjelaskan cara kerjanya:

Menggunakan PSCredentials tanpa prompt

Singkatnya, Anda membuat file untuk menyimpan kata sandi Anda (sebagai string terenkripsi). Baris berikut akan meminta kata sandi lalu menyimpannya c:\mysecurestring.txtsebagai string terenkripsi. Anda hanya perlu melakukan ini sekali:

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

Di mana pun Anda melihat -Credentialargumen pada perintah PowerShell maka itu berarti Anda bisa melewati a PSCredential. Jadi dalam kasus Anda:

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

Anda mungkin memerlukan -Authenticationnilai sakelar yang berbeda karena saya tidak tahu lingkungan Anda.

Kev
sumber
23
Anda juga bisa melakukannya ConvertTo-SecureString "password" -AsPlainText -Force.
x0n
14
Untuk memperjelasnya,$password = ConvertTo-SecureString "password" -AsPlainText -Force
Akira Yamamoto
-Kredensial [nama pengguna] diperlukan dalam parameter Read-Host untuk saya, jika tidak, PowerShell hanya hang. Setelah melewati -Kredensial untuk membaca-host Anda akan diminta langsung di konsol PowerShell dan kata sandi disimpan dengan benar. Terima kasih!
sephirot
Saya mencoba mencari cara untuk mendapatkan ini berfungsi ketika saya menggunakan fungsi Kirim-MailMessage di PowerShell. Saya ingin menyimpan kredensial pengguna email saya dan meneruskannya sehingga saya tidak harus terus memasukkannya. Ada ide bagaimana melakukan ini?
KangarooRIOT
@ user3681591 - Saya akan merekomendasikan mengajukan pertanyaan baru daripada melakukan ini di komentar. Terima kasih.
Kev
71

Ada cara lain, tapi ...

JANGAN MELAKUKAN INI JIKA ANDA TIDAK INGIN PASSWORD ANDA DI FILE SCRIPT (Ini bukan ide yang baik untuk menyimpan kata sandi dalam skrip, tetapi beberapa dari kita hanya ingin tahu caranya.)

Oke, itu peringatannya, ini kodenya:

$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 akan memiliki kredensial dari John Doe dengan kata sandi "ABCDEF".

Alternatif berarti menyiapkan kata sandi untuk digunakan:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Jeroen Landheer
sumber
Terima kasih. Ini sangat membantu. Dalam kasus saya, saya membuat cmdlet PowerShell kustom yang menggunakan nama pengguna dan kata sandi (sebagai secureString). Secara internal cmdlet memanggil beberapa cmdlet lain, beberapa hanya membutuhkan pengguna dan kata sandi tetapi salah satunya membutuhkan kredensial jadi saya sebenarnya tidak perlu membuat kode sandi kata sandi dalam skrip saya.
BenR
20
Agak sederhana: $ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Sam
Saya mencoba mencari cara untuk mendapatkan ini berfungsi ketika saya menggunakan fungsi Kirim-MailMessage di PowerShell. Saya ingin menyimpan kredensial pengguna email saya dan meneruskannya sehingga saya tidak harus terus memasukkannya. Ada ide bagaimana melakukan ini?
KangarooRIOT
@ user3681591 Itu adalah Send-MailMessage -Credential $ cred (dengan $ cred dibuat seperti yang ditunjukkan dalam posting ini)
Jeroen Landheer
@ JoeroLandheer Saya sudah mencoba jawaban Anda (terima kasih telah membantu!) Namun tidak berhasil. Kesalahan saya adalah: -Kredensial: Istilah '-Kredensial' tidak dikenali sebagai nama cmdlet, fungsi, file skrip, atau program yang dapat dioperasikan.
KangarooRIOT
29

Mengenai menyimpan kredensial, saya menggunakan dua fungsi (yang biasanya dalam modul yang diambil dari profil saya):

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

Dan yang satu ini:

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

Anda menggunakannya seperti ini:

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

Jika file kredensial tidak ada, Anda akan diminta pertama kali, pada saat itu file kredensial akan disimpan dalam string terenkripsi di dalam file XML. Kali kedua Anda menjalankan baris itu, xmlfile ada di sana dan akan dibuka secara otomatis.

Menang
sumber
10

Saya harus menjalankan fungsi SCOM 2012 dari server jauh yang memerlukan kredensial berbeda. Saya menghindari kata sandi teks-jelas dengan melewatkan output dari fungsi dekripsi kata sandi sebagai input untuk ConvertTo-SecureString. Untuk kejelasan, ini tidak diperlihatkan di sini.

Saya sangat suka mengetik pernyataan saya. Deklarasi tipe untuk $ strPass bekerja dengan benar.

[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
sumber
4

Berikut adalah dua cara Anda bisa melakukan ini, jika Anda menjadwalkan reboot.

Pertama, Anda dapat membuat tugas di satu mesin menggunakan kredensial yang memiliki hak yang diperlukan untuk menghubungkan dan mem-boot ulang komputer lain. Ini membuat penjadwal bertanggung jawab untuk menyimpan kredensial dengan aman. Perintah reboot (saya pria Powershell, tapi ini lebih bersih.) Adalah:

SHUTDOWN /r /f /m \\ComputerName

Baris perintah untuk membuat tugas terjadwal pada mesin lokal, untuk melakukan reboot dari jarak jauh, adalah:

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"

Saya lebih suka cara kedua, di mana Anda menggunakan kredensial Anda saat ini untuk membuat tugas terjadwal yang berjalan dengan akun sistem pada mesin jarak jauh.

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

Ini juga berfungsi melalui GUI, cukup masukkan SISTEM sebagai nama pengguna, biarkan bidang kata sandi kosong.

Nathan Hartley
sumber
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

Berhati-hatilah dengan menyimpan kata sandi dengan cara ini ... tidak seaman ...

MockMyBeret
sumber
1

Saya melihat satu contoh yang menggunakan Impor / Ekspor-CLIXML.

Ini adalah perintah favorit saya untuk masalah yang Anda coba selesaikan. Dan cara paling sederhana untuk menggunakannya adalah.

$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

Jadi jika file tersebut tidak ada secara lokal itu akan meminta kredensial dan menyimpannya. Ini akan mengambil [pscredential]objek tanpa masalah dan akan menyembunyikan kredensial sebagai string aman.

Akhirnya cukup gunakan kredensial seperti yang biasa Anda lakukan.

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

Catatan tentang Securty :

Aman menyimpan kredensial di disk

Saat membaca Solusi, Anda mungkin awalnya waspada menyimpan kata sandi pada disk. Meskipun wajar (dan bijaksana) untuk berhati-hati membuang sampah di hard drive Anda dengan informasi sensitif, cmdlet Ekspor-CliXml mengenkripsi objek kredensial menggunakan API Perlindungan Data standar Windows. Ini memastikan bahwa hanya akun pengguna Anda yang dapat mendekripsi isinya dengan benar. Demikian pula, cmdlet ConvertFrom-SecureString juga mengenkripsi kata sandi yang Anda berikan.

Sunting: Baca ulang pertanyaan aslinya. Hal di atas akan berfungsi selama Anda menginisialisasi [pscredential]ke hard disk. Itu adalah jika Anda menjatuhkan itu dalam skrip Anda dan menjalankan skrip setelah itu akan membuat file itu dan kemudian menjalankan skrip tanpa pengawasan akan menjadi sederhana.

ScriptingDad
sumber
1

Larutan

$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

Untuk Mesin Bangun
Dalam kode sebelumnya, ganti nama pengguna dan nilai kata sandi dengan variabel lingkungan rahasia ("disembunyikan dari log") dari mesin-bangunan Anda

Hasil pengujian oleh

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

dan kamu akan lihat

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

mengapa kamu tidak mencoba sesuatu yang sangat sederhana?

gunakan psexec dengan perintah 'shutdown / r / f / t 0' dan daftar PC dari CMD.

Root Loop
sumber
Itu kasus khusus. Intinya bukan memunculkan jendela login dalam skenario acak apa pun.
Overmind