Bagaimana cara mempertahankan kredensial dalam sesi Powershell jarak jauh?

13

Saya memiliki Berbagi File Azure dan ingin menggunakan ini dari Azure VM saya - setelah mempertahankan kredensial pada VMs dengan cmdkey dan pemasangan dengan penggunaan net. Ini diuji dengan menjalankan perintah ini dalam sesi Powershell lokal di Windows Server 2012 R2.

Tapi saya perlu menambahkan langkah ini ke skrip penerapan Azure. Skrip Azure Powershell dijalankan dari laptop saya, terhubung ke langganan Azure dan membangun VM dari awal, menggunakan banyak variabel.

Memikirkan untuk menggunakan Invoke-Command untuk meneruskan variabel dari skrip Azure Powershell ke sesi Powershell jarak jauh pada VM yang baru dibuat.

$Session = New-PSSession -ConnectionUri $Uri -Credential $DomainCredential

$ScriptBlockContent = { 
Param ($Arg1,$Arg2,$Arg3)
cmdkey /add:$Arg1 /user:$Arg2 /pass:$Arg3}

Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)

Dan kesalahannya:

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)
CMDKEY: Credentials cannot be saved from this logon session.

Diganti dengan cmdkey / list untuk memeriksa sintaks, dan tidak ada kesalahan.

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent
Currently stored credentials:
* NONE *

Punya masalah yang sama (dan tidak bisa memperbaikinya) dengan Modul Pembaruan Windows PowerShell (Invoke-WUInstall), yang berjalan dengan baik pada sesi Powershell lokal di VM, tetapi tidak memperbarui ketika dimulai melalui Powershell jarak jauh.

Ada cara untuk menyiasati yang ini?

Razvan Zoitanu
sumber

Jawaban:

2

Karena cara Windows menangani autentikasi, CMDKEY tidak mungkin digunakan untuk menetapkan kredensial melalui sesi PowerShell jarak jauh, harus dilakukan secara interaktif saat menggunakan CMDKEY.

Mengutip Don Jones dari utas mencari jawaban yang mirip dengan Anda:

Itu batasan dari perintah Cmdkey - bukan benar-benar hal PowerShell. Tapi ini terkait dengan cara Remotig menangani kredensial. Sesi jarak jauh tidak benar-benar mendapatkan kredensial, itu mendapatkan tiket yang didelegasikan, jadi tidak ada tanda untuk benar-benar menyelamatkan. Itu semua berdasarkan desain, dan bukan sesuatu yang dapat Anda konfigurasi ulang.

Gigih13
sumber
2

Anda dapat menggunakan PsExec.exe Sysinternal jika Anda tidak ingin menggunakan Tugas Terjadwal. Biasanya, ketika Anda memulai sesi PowerShell, itu berjalan dalam servicesproses (Anda dapat mengonfirmasi ini dengan menjalankan query sessionperintah pada komputer jarak jauh) alih-alih pengguna lokal yang gagal cmdkey.

Untuk mengatasinya, kita perlu menjalankan cmdkey.exe dalam proses pengguna lokal yang dapat dilakukan dengan menggunakan PsExec.exe's -iflag yang

Jalankan program sehingga berinteraksi dengan desktop dari sesi yang ditentukan pada sistem jarak jauh. Jika tidak ada sesi yang ditentukan, proses berjalan di sesi konsol.

Sekarang, tantangannya adalah untuk mendapatkan id sesi dari pengguna lokal di mesin jarak jauh. Saya mencapai ini dengan menjalankan query sessionperintah yang memberikan daftar sesi aktif di mesin. Salah satu solusi yang mungkin adalah -

$processId = Invoke-Command $session -ScriptBlock  {
param($user)
    $sessions = query session $user;
    return $sessions[1].split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)[2];

} -ArgumentList ($user)

Di sini $userberisi nama pengguna pengguna lokal di komputer jarak jauh.

Setelah Anda mendapatkan id sesi, Anda bisa menjalankannya

PsExec \\<computer_name> -u <local_user_name> -p <password> -h -i $processId cmdkey.exe /generic:testtt /user:userr /pass:pass

catatan:

  1. Ada cara yang lebih baik untuk mendapatkan id sesi pengguna di mesin jarak jauh.
  2. Saat ini, saat menjalankan PsExec, saya kembali membuat koneksi dengan sistem jarak jauh yang dapat dihindari (saya belum diuji).
  3. Pengguna yang menjalankan perintah harus memiliki akses admin pada mesin jarak jauh.
Ankit Aggarwal
sumber