ไม่สามารถรับการรับรองความถูกต้อง CredSSP ให้ทำงานใน PowerShell


10

ในความพยายามที่จะสร้างสคริปต์ PowerShell ใช้งานระยะไกลฉันวิ่งเข้าไปในสิ่งที่ผมเชื่อว่าเป็นปัญหา hop สองครั้ง ในบทความนั้น Perriman ให้คำอธิบายสั้น ๆ เกี่ยวกับปัญหารวมถึงขั้นตอนเฉพาะในการแก้ไขปัญหา (แทบจะไม่สำคัญถ้าคุณรู้คำสั่ง แต่สำหรับคนที่คุ้นเคยน้อยกว่าตัวฉันเอง

ฉันวิ่งEnable-WSManCredSSP Serverบนเซิร์ฟเวอร์ Win7 โดยไม่มีปัญหา แต่พยายามที่จะรันEnable-WSManCredSSP Client –DelegateComputer <FQDN of the server>บนไคลเอนต์ Win7 ของฉันสร้างข้อผิดพลาดนี้:

Enable-WSManCredSSP : The client cannot connect to the destination specified
in the request. Verify that the service on the destination is running and
is accepting requests.
Consult the logs and documentation for the WS-Management service running
on the destination, most commonly IIS or WinRM. If the destination
is the WinRM service, run the following com mand on the destination
to analyze and configure the WinRM service: "winrm quickconfig".

กำลังรันwinrm quickconfigยืนยันว่าเซิร์ฟเวอร์ของฉันใช้ WinRM อยู่:

WinRM already is set up to receive requests on this machine.
WinRM already is set up for remote management on this machine.

และGet-WSManCredSSPยืนยันว่าเซิร์ฟเวอร์ของฉันพร้อมที่จะรับข้อมูลรับรองจากลูกค้า:

The machine is not configured to allow delegating fresh credentials.
This computer is configured to receive credentials from a remote client computer.

ฉันยังพบบทความ Boessen ใน WinRMซึ่งเขาอธิบายการตั้งค่า WinRM ทั่วไปและพบหนึ่งชิ้นอาหารอันโอชะที่จะได้รับจุดข้อมูลที่เป็นประโยชน์ในการวินิจฉัย; คำสั่งนี้ทำงานบนไคลเอนต์ใช้เครื่องมือwinrsเพื่อเข้าถึงเซิร์ฟเวอร์จากระยะไกล:

winrs -r:http://<FQDN of my server>:5985 -u:<myDomain>\msorens "dir c:\"

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

Boessen ระบุว่าพอร์ต 5985 เป็นค่าเริ่มต้นสำหรับ Win7; คำสั่งนี้รันบนเซิร์ฟเวอร์ยืนยันค่า 5985:

get-item wsman:\localhost\listener\listener*\port

คำถาม: ทำไมฉันไม่สามารถเรียกใช้งานคำสั่ง Enable-WSManCredSSP ทางฝั่งไคลเอ็นต์ได้


ปรับปรุง 2011.06.07

ฉันพบวิธีแก้ปัญหาสำหรับคำถามด้านบน: เรียกใช้ Enable-PSRemoting , โฆษณาเพื่อกำหนดค่าคอมพิวเตอร์ให้รับคำสั่งระยะไกล, อนุญาตให้Enable-WSManCredSSPบนไคลเอนต์ทำงานได้สำเร็จ! อยากรู้อยากเห็น แต่หน้า manของมันบ่งบอกว่ามันเป็นการกระทำที่แตกต่างกันจำนวนหนึ่งดังนั้นฉันจึงคิดว่าหนึ่งในนั้นทำสิ่งที่ฉันต้องการโดยไม่ตั้งใจ

แต่ฉันก็มาถึงสิ่งกีดขวางบนถนนอื่นเมื่อฉันพยายามใช้การรับรองความถูกต้อง CredSSP นี่คือคำสั่ง:

Invoke-Command { Write-Host "hello, world" } -computername $serverName `
-credential $testCred  -Authentication Credssp

และนี่คือคำตอบ:

การเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลล้มเหลวด้วยข้อความแสดงข้อผิดพลาดต่อไปนี้:
ไคลเอ็นต์ WinRM ไม่สามารถดำเนินการตามคำขอได้ นโยบายคอมพิวเตอร์ไม่อนุญาต
การมอบหมายข้อมูลประจำตัวของผู้ใช้ไปยังคอมพิวเตอร์เป้าหมาย ใช้ gpedit.msc
และดูนโยบายต่อไปนี้: การกำหนดค่าคอมพิวเตอร์
-> เทมเพลตการดูแลระบบ -> ระบบ -> การมอบสิทธิ์
-> อนุญาตการมอบหมายข้อมูลประจำตัวใหม่ ตรวจสอบว่าเปิดใช้งานและ
กำหนดค่าด้วย SPN ที่เหมาะสมสำหรับคอมพิวเตอร์เป้าหมาย ตัวอย่างเช่น,
สำหรับชื่อคอมพิวเตอร์เป้าหมาย "myserver.domain.com" SPN สามารถเป็นหนึ่งในนั้นได้
ต่อไปนี้: WSMAN /myserver.domain.com หรือ WSMAN / *. domain.com
สำหรับข้อมูลเพิ่มเติมดูหัวข้อ about_Remote_Troubleshooting Help

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

คำถามใหม่: ความพยายามเชื่อมต่อระยะไกลนี้กับ CredSSP ล้มเหลวอย่างไร


ในการตอบโปรดระลึกถึงสิ่งต่อไปนี้: ขอให้ฉันบอกกล่าวล่วงหน้าเกี่ยวกับความคิดใด ๆ ที่ฉันรู้ว่าฉันกำลังทำอะไรอยู่ที่นี่


ยังเป็นอีกตัวอย่างหนึ่งที่ทำให้คลั่งไคล้ในการเปลี่ยนสิ่งต่าง ๆ เพื่อการเปลี่ยนแปลง !! ฉันไม่สนใจการโยกย้ายแบบสดหรืออะไรอย่างนั้นฉันแค่ต้องการที่จะสามารถเข้าสู่เซิร์ฟเวอร์ 3 Hyper-V 2012 ที่ฉันมีและสร้าง / ลบ / เริ่ม / หยุด / รีบูต / รีบูตบน VM มันทำงานได้อย่างสมบูรณ์แบบจาก เดสก์ท็อป WIn7 ของฉันตอนนี้ฉันอยู่ที่ win 10 และฉันต้องข้ามห่วงไปทางซ้ายและตรงกลางเพื่อทำสิ่งที่ง่ายต่อการทำก่อนหน้านี้ windows 10 กำลังขับรถฉันเลือดบ้า: - /
Shawty

คำตอบ:


8

ฉันกลับมาที่นี่หลังจากที่หายไปชั่วครู่เพื่อมองอีกครั้งด้วยสายตาที่สดใส (ทั้งของฉันและเพื่อนร่วมงาน) และตัดสินใจที่จะกลับไปที่พื้นฐานอีกครั้ง:

บนไคลเอนต์ที่ฉันดำเนินการ (ในเปลือกผู้ดูแลระบบ):

enable-wsmancredssp -role client -delegatecomputer devremvm03 -force

บนเซิร์ฟเวอร์ที่ฉันดำเนินการ (ในเปลือกผู้ดูแลระบบ):

enable-wsmancredssp -role server -force

ทั้งเอาต์พุตปกติที่ส่งคืนที่ระบุ CredSSP ตอนนี้เป็น "จริง"

จากนั้นฉันใช้รหัสของผู้ฝึกหัดต่อไปนี้เพื่อเพิ่มระดับความซับซ้อนที่เพิ่มขึ้น:

$block = {
  Write-Host ("hello, world: {0}, {1}" -f $env:USERNAME, (hostname))
}
$username = "test_user"
$password = "..."   
$adjPwd = $password | ConvertTo-SecureString -asPlainText -Force
$testCred = (New-Object System.Management.Automation.PSCredential($username,$adjPwd))    

switch ($choice)
{
  "basic"       { Invoke-Command $block }
  "remote"      { Invoke-Command $block -computername $serverName }
  "credentialA" { Invoke-Command $block -computername $serverName -credential $testCred  }
  "credentialB" { Invoke-Command $block -computername $serverName -credential $testCred  -Authentication Credssp}
  "session"     { 
      $testSession = New-PSSession -computername $serverName -credential $testCred -Authentication Credssp
      if ($testSession) { Invoke-Command $block -Session $testSession; Remove-PSSession $testSession }
      }
}

ทั้งหมดที่อยู่ในสคริปต์ run.ps1 ของฉันดังนั้นการถอดเสียงเป็นดังนี้ (และสิ่งนี้รันในเชลล์ที่ไม่ใช่ผู้ดูแลระบบ):

PS C:\> .\run.ps1 basic
hello, world: msorens, MyLocalMachine
PS C:\> .\run.ps1 remote MyRemoteServer
hello, world: msorens, MyRemoteServer
PS C:\> .\run.ps1 credentialA MyRemoteServer
hello, world: test_user, MyRemoteServer
PS C:\> .\run.ps1 credentialB MyRemoteServer
hello, world: test_user, MyRemoteServer
PS C:\> .\run.ps1 session MyRemoteServer
hello, world: test_user, MyRemoteServer

ก่อนหน้านี้ทำงานเพียงพื้นฐานระยะไกลและหนังสือรับรองเท่านั้น ตอนนี้ทำงานทั้งหมด 5 ข้อ ต๊าย!


CredSSP เป็นทางออกที่ดี? Microsoft กล่าวว่า: ข้อควรระวัง: การรับรองความถูกต้องของผู้ให้บริการความน่าเชื่อถือ (CredSSP) ซึ่งข้อมูลประจำตัวของผู้ใช้จะถูกส่งผ่านไปยังคอมพิวเตอร์ระยะไกลเพื่อรับรองความถูกต้องได้รับการออกแบบสำหรับคำสั่งที่ต้องการการรับรองความถูกต้อง กลไกนี้เพิ่มความเสี่ยงด้านความปลอดภัยของการดำเนินการระยะไกล หากคอมพิวเตอร์ระยะไกลถูกบุกรุกข้อมูลประจำตัวที่ส่งผ่านไปนั้นสามารถใช้เพื่อควบคุมเซสชันเครือข่าย
Kiquenet

2

เมื่อฉันต้องทำสิ่งนี้นี่คือสิ่งที่ฉันทำเพื่อให้มันใช้งานได้ (อาจมีการตั้งค่า GPO บางอย่าง แต่ดูเหมือนว่าคุณได้ครอบคลุมการตั้งค่าไว้แล้ว)

ในการเปิดใช้งานไคลเอนต์ให้ใช้ CredSSP เพื่อเชื่อมต่อกับเครื่องใด ๆ ในโดเมน:

Enable-WSManCredSSP -Role Client -DelegateComputer "*.my.domain.com" -Force | out-null
#the following is used because -delegatecomputer (above) doesn't appear to actually work properly.
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsDomain -Name WSMan -Value "WSMAN/*.my.domain.com"

จากนั้นฉันก็รันสิ่งต่อไปนี้ในแต่ละเครื่องเป้าหมาย (เซิร์ฟเวอร์) เพื่อเปิดใช้งานการรับรองความถูกต้อง CredSSP:

Connect-WSMan -ComputerName $computer 
Set-Item "WSMAN:\$computer\service\auth\credssp" -Value $true 

หลักสูตรนี้ต้องการให้คุณใช้งานสคริปต์ด้วยสิทธิ์ที่เหมาะสม สิ่งนี้ใช้ได้กับฉัน - ฉันหวังว่ามันจะช่วยคุณได้


ขอบคุณสำหรับคำแนะนำ แต่ก็ยังล้มเหลวด้วยผลลัพธ์เดียวกัน
Michael Sorens

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

ฉันคิดค่อนข้างออกว่าเพราะมันไม่สมเหตุสมผลที่เซิร์ฟเวอร์ต้องมีความรู้เบื้องต้นของลูกค้า ฉันเพิ่งรันลำดับทั้งหมดอีกครั้งเพื่อให้แน่ใจว่าและมันล้มเหลวด้วยข้อผิดพลาดเดียวกัน อีกหนึ่งรูปแบบอื่น: ฉันละเว้นพารามิเตอร์ -Authentication และยืนยันว่าทุกอย่างในงบของฉันใช้งานได้ ( Invoke-Command { Write-Host "hello, world" } -computername $serverName -credential $testCred) ดังนั้นการตรวจสอบ CredSSP จึงเป็นปัญหาอย่างเคร่งครัด
Michael Sorens

เห็นด้วย - WinRM พื้นฐานดี ฉันไม่ใช่ปัญหาที่แน่นอน แต่ฉันคิดว่ามันเกี่ยวข้องกับนโยบาย 'อนุญาตข้อมูลประจำตัวใหม่' และ SPN ที่คุณตั้งค่า ฉันจะพิจารณาการตั้งค่านโยบายอย่างละเอียดและอาจเจาะลึกลงไปอีกเล็กน้อยเพื่อให้แน่ใจว่า Kerberos ของคุณทำงานถูกต้อง ลิงก์นี้ดูเหมือนว่าอาจมีประโยชน์: [ลิงก์] msdn.microsoft.com/en-us/library/ee309365(v=vs.85).aspx
jbsmith

เหตุใดจึงต้องใช้ Connect-WSMan กับเซิร์ฟเวอร์ควรใช้เซิร์ฟเวอร์ enable-wsmancredssp -role ดีกว่าไม่ใช่หรือ?
Kiquenet

1

ฉันได้รับที่ฉันสามารถย้ายข้อมูล VM จากเซิร์ฟเวอร์ Hyper-v 2012R2 ไปยังอีกเครื่องหนึ่งได้ แต่ไม่สามารถย้ายกลับคืนได้ (ฉันพยายามใช้ SAMBA 4.2 เป็นตัวควบคุมโดเมนของฉันและต้องการดูว่าฉันสามารถย้ายข้อมูลด้วย CredSSP ได้หรือไม่เพราะฉันไม่สามารถใช้การมอบหมายแบบ จำกัด กับ Samba4)

ในที่สุดฉันไปทำงานไฮเปอร์ -v และคัดลอกรายการรีจิสทรีที่ hklm: \ SOFTWARE \ Policies \ Microsoft \ Windows \ CredentialsDelegation ไปยังไฮเปอร์ -V ที่ไม่ทำงาน ทำงานได้ดีทั้งสองวิธีหลังจากนั้น


ทรีรีจีสทรีรีจีสตรีก็ใช้ได้สำหรับฉันเช่นกัน hklm: \ SOFTWARE \ ... \ CredentialsDelegation โหนดไม่มีอยู่ค่าจะถูกเก็บไว้ใน hklm: \ SOFTWARE \ Wow6432Node \ ... \ CredentialsDelegation และใน HKEY_USERS \ ... \ วัตถุนโยบายกลุ่ม \ ... \ CredentialDelegation
Der_Meister
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.