Làm cách nào để duy trì thông tin đăng nhập trong phiên Powershell từ xa?


13

Tôi có Chia sẻ tệp Azure và muốn sử dụng tính năng này từ máy ảo Azure của mình - sau khi duy trì thông tin đăng nhập trên máy ảo bằng cmdkey và gắn kết với việc sử dụng mạng. Điều này đã được kiểm tra bằng cách chạy các lệnh này trong phiên Powershell cục bộ trên Windows Server 2012 R2.

Nhưng tôi cần thêm bước này vào tập lệnh triển khai Azure. Tập lệnh Azure Powershell chạy từ máy tính xách tay của tôi, kết nối với thuê bao Azure và xây dựng VM từ đầu, sử dụng rất nhiều biến.

Tìm ra cách sử dụng Lệnh gọi để chuyển các biến từ tập lệnh Azure Powershell sang phiên Powershell từ xa trên VM mới được tạo.

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

Và lỗi:

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

Thay thế bằng cmdkey / list để kiểm tra cú pháp và không có lỗi.

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

Có một vấn đề tương tự (và không thể khắc phục) với Mô-đun PowerShell của Windows Update (Invoke-WUInstall), chỉ chạy tốt trên phiên Powershell cục bộ trên VM, nhưng không cập nhật khi được khởi động qua Powershell từ xa.

Bất cứ cách nào để có được xung quanh này?

Câu trả lời:


2

Do cách Windows xử lý xác thực, không thể sử dụng CMDKEY để đặt thông tin đăng nhập thông qua phiên PowerShell từ xa, nó phải được thực hiện tương tác khi sử dụng CMDKEY.

Để trích dẫn Don Jones từ một chủ đề tìm kiếm một câu trả lời tương tự như của bạn:

Đó là một hạn chế của lệnh Cmdkey - không thực sự là một thứ PowerShell. Nhưng nó liên quan đến cách Remotig xử lý thông tin đăng nhập. Phiên từ xa không thực sự có được thông tin xác thực, nó nhận được một vé được ủy quyền, vì vậy không có mã thông báo để thực sự lưu. Đó là tất cả theo thiết kế, và không phải là thứ bạn có thể cấu hình lại.


2

Bạn có thể sử dụng PsExec.exe của Sysiternal nếu bạn không muốn sử dụng Tác vụ theo lịch trình. Thông thường, khi bạn bắt đầu phiên PowerShell, nó sẽ chạy trong servicesquy trình (bạn có thể xác nhận điều này bằng cách chạy query sessionlệnh trên máy tính từ xa) thay vì người dùng cục bộ bị lỗi cmdkey.

Để khắc phục điều này, chúng ta cần chạy cmdkey.exe trong quy trình người dùng cục bộ có thể được thực hiện bằng cách sử dụng PsExec.exe's -icờ

Chạy chương trình để nó tương tác với máy tính để bàn của phiên được chỉ định trên hệ thống từ xa. Nếu không có phiên nào được chỉ định, quy trình sẽ chạy trong phiên giao diện điều khiển.

Bây giờ, thách thức là lấy id phiên của người dùng cục bộ trên máy từ xa. Tôi đã đạt được điều này bằng cách chạy query sessionlệnh cung cấp danh sách các phiên hoạt động trên máy. Một trong những giải pháp khả thi là -

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

} -ArgumentList ($user)

Ở đây $userchứa tên người dùng của người dùng cục bộ trên máy tính từ xa.

Khi bạn nhận được id phiên, bạn chỉ cần thực hiện

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

Ghi chú:

  1. Có thể có các cách tốt hơn để lấy id phiên của người dùng trên máy từ xa.
  2. Ngay bây giờ, trong khi chạy PsExec, tôi lại tạo kết nối với hệ thống từ xa có thể tránh được (tôi chưa thử nghiệm).
  3. Người dùng đang chạy lệnh nên có quyền truy cập quản trị viên trên máy từ xa.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.