无法使 CredSSP 身份验证在 PowerShell 中起作用

无法使 CredSSP 身份验证在 PowerShell 中起作用

在尝试使用远程处理创建 PowerShell 脚本时,我遇到了我认为双跳问题在那篇文章中,Perriman 对问题进行了简洁的描述,并给出了解决问题的具体步骤(如果您知道命令,这几乎是微不足道的,但对于像我这样不太熟悉的人来说,这些信息是无价的!)。

Enable-WSManCredSSP Server在 Win7 服务器上运行没有发生任何意外,但尝试在我的 Win7 客户端上运行却Enable-WSManCredSSP Client –DelegateComputer <FQDN of the server>产生了此错误:

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.

获取 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 -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 更新

我找到了上述问题的解决方案:调用启用PSRemoting,广告宣传配置计算机以收到远程命令,允许启用-WSManCredSSP客户端上成功运行!好奇,但它的手册页表示它执行了许多不同的操作,因此我认为其中一个操作无意中完成了我需要的操作。

但是当我尝试使用 CredSSP 身份验证时,我遇到了另一个障碍。命令如下:

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

以下是响应:

连接远程服务器失败并显示以下错误消息:
WinRM 客户端无法处理该请求。计算机策略不允许
将用户凭据委托给目标计算机。使用 gpedit.msc
并查看以下策略:计算机配置
-> 管理模板 -> 系统 -> 凭据委派
-> 允许委派新凭证。验证它是否已启用,并
配置适合目标计算机的 SPN。例如,
对于目标计算机名称“myserver.example.com”,SPN 可以是以下之一
以下:WSMAN /myserver.domain.com 或 WSMAN/*.domain.com。
有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。

我按照这个非常有用的错误消息所建议的方式验证了设置,在我看来它配置正确。

新问题:这次与 CredSSP 的远程连接尝试为什么会失败?


回答时请记住以下几点: 让我提前消除任何想法,我知道自己在这里做什么,尽管有任何相反的迹象。:-) Windows 管理不是我的专业领域!

答案1

短暂的休息后,我又回来用全新的眼光(我和同事的眼光)重新审视这个问题,并决定重新回到基础:

在客户端我执行了(在管理员shell中):

enable-wsmancredssp -role client -delegatecomputer devremvm03 -force

在服务器上我执行了(在管理员shell中):

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

以前,只有 basic、remote 和 credentialA 有效。现在所有 5 个都有效。哇!

答案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 

这当然要求您以适当的权限运行脚本。这对我来说很有效——我希望它能帮到你。

答案3

我能够将虚拟机从一台 hyper-v 2012R2 服务器实时迁移到另一台,但无法将其迁移回来。(我正在尝试使用 SAMBA 4.2 作为我的域控制器,并想看看我是否可以使用 CredSSP 进行实时迁移,因为我无法对 Samba4 使用约束委派)。

最后我转到了正在运行的 hyper-v,并将 hklm:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation 处的注册表项复制到了未运行的 hyper-v。此后,两种方式都运行正常。

相关内容