จะคงข้อมูลรับรองไว้ในเซสชัน Powershell ระยะไกลได้อย่างไร


13

ฉันมี Azure File Share และต้องการใช้สิ่งนี้จาก Azure VM ของฉัน - หลังจากยืนยันข้อมูลประจำตัวบน VMs ด้วย cmdkey และติดตั้งด้วยการใช้เน็ต สิ่งนี้ถูกทดสอบโดยการรันคำสั่งเหล่านี้ในเซสชัน Powershell ในเครื่องบน Windows Server 2012 R2

แต่ฉันต้องเพิ่มขั้นตอนนี้ในสคริปต์การปรับใช้ Azure สคริปต์ Azure Powershell ทำงานจากแล็ปท็อปของฉันเชื่อมต่อกับการสมัครสมาชิก Azure และสร้าง VMs ตั้งแต่เริ่มต้นโดยใช้ตัวแปรจำนวนมาก

คิดให้ใช้ Invoke-Command เพื่อส่งตัวแปรจากสคริปต์ Azure Powershell ไปยังเซสชัน Powershell ระยะไกลบน VM ที่สร้างขึ้นใหม่

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

และข้อผิดพลาด:

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

แทนที่ด้วย cmdkey / รายการเพื่อตรวจสอบไวยากรณ์และไม่มีข้อผิดพลาด

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

มีปัญหาที่คล้ายกัน (และไม่สามารถแก้ไขได้) ด้วยโมดูล Windows Update PowerShell (Invoke-WUInstall) ที่ทำงานได้ดีบนเซสชัน Powershell ในเครื่องบน VM แต่ไม่อัปเดตเมื่อเริ่มต้นด้วย Powershell ระยะไกล

มีวิธีไหนบ้างที่จะหลีกเลี่ยงสิ่งนี้?

คำตอบ:


2

เนื่องจากวิธีการที่ Windows จัดการกับการรับรองความถูกต้องจึงไม่สามารถใช้ CMDKEY เพื่อตั้งค่าข้อมูลรับรองผ่านเซสชัน PowerShell ระยะไกลได้จึงต้องทำแบบโต้ตอบเมื่อใช้ CMDKEY

หากต้องการอ้างอิงDon Jonesจากชุดข้อความที่ค้นหาคำตอบที่คล้ายกับของคุณ:

นั่นเป็นข้อ จำกัด ของคำสั่ง Cmdkey - ไม่ใช่สิ่งที่เป็น PowerShell แต่มันเกี่ยวข้องกับวิธีที่ Remotig จัดการข้อมูลประจำตัว เซสชันระยะไกลไม่ได้รับข้อมูลรับรองจริง ๆ แล้วจะได้รับตั๋วที่มอบสิทธิ์ดังนั้นจึงไม่มีโทเค็นที่จะบันทึกจริง ทั้งหมดนี้เกิดจากการออกแบบไม่ใช่สิ่งที่คุณสามารถกำหนดค่าใหม่ได้


2

คุณสามารถใช้PsExec.exeของ Sysinternal หากคุณไม่ต้องการใช้งานที่กำหนดเวลาไว้ โดยปกติเมื่อคุณเริ่มเซสชัน PowerShell เซสชันจะทำงานในservicesกระบวนการ (คุณสามารถยืนยันได้ด้วยการเรียกใช้query sessionคำสั่งบนคอมพิวเตอร์ระยะไกล) แทนผู้ใช้ภายในซึ่งล้มเหลวใน cmdkey

เพื่อเอาชนะสิ่งนี้เราจำเป็นต้องเรียกใช้ cmdkey.exe ในกระบวนการของผู้ใช้ในพื้นที่ซึ่งสามารถทำได้โดยใช้การPsExec.exe's -iตั้งค่าสถานะซึ่ง

รันโปรแกรมเพื่อโต้ตอบกับเดสก์ท็อปของเซสชันที่ระบุบนระบบรีโมต หากไม่ได้ระบุเซสชันกระบวนการจะทำงานในคอนโซลเซสชัน

ตอนนี้ความท้าทายคือการรับรหัสเซสชันของผู้ใช้ท้องถิ่นบนเครื่องระยะไกล ฉันทำได้โดยใช้query sessionคำสั่งที่ให้รายการของเซสชันที่ใช้งานบนเครื่อง หนึ่งในวิธีแก้ปัญหาที่เป็นไปได้คือ -

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

} -ArgumentList ($user)

ที่นี่$userมีชื่อผู้ใช้ของผู้ใช้ท้องถิ่นบนคอมพิวเตอร์ระยะไกล

เมื่อคุณได้รับรหัสเซสชั่นคุณสามารถดำเนินการได้

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

บันทึก:

  1. อาจมีวิธีที่ดีกว่าในการรับรหัสเซสชันของผู้ใช้บนเครื่องระยะไกล
  2. ตอนนี้ในขณะที่เรียกใช้ PsExec ฉันกำลังเชื่อมต่อกับระบบระยะไกลซึ่งสามารถหลีกเลี่ยงได้อีกครั้ง (ฉันยังไม่ได้ทดสอบ)
  3. ผู้ใช้ที่รันคำสั่งควรมีสิทธิ์เข้าถึงแบบผู้ดูแลระบบบนเครื่องระยะไกล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.