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


10

在尝试使用远程处理创建PowerShell脚本时,我遇到了我认为是双跳问题。在那篇文章中,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能够成功工作!很好奇,但其手册页指示它执行了许多不同的操作,因此我假设其中一个人无意间做了我需要的操作。

但是,当我尝试使用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帮助主题。

我验证了设置,就像建议的此非常有用的错误消息一样,在我看来,它的配置正确。

新问题:与CredSSP的这种远程连接尝试失败了什么?


在回答请注意以下几点: 让我提前驱散任何想法,我知道我在这里做什么,什么样子有相反的规定:-)的Windows管理员是不是我的专业领域!


MS为了改变它而改变事物的另一个令人发狂的例子!我对实时迁移或类似的东西不感兴趣,我只想能够登录到我拥有的3台Hyper-V 2012服务器并在其上创建/删除/启动/停止/重新启动VM,它可以完美地从我的WIn7桌上型电脑,现在我赢了10,我不得不跳过篮球架并居中,以完成以前以前做的简单事情,Windows 10目前让我发疯了:-/
糟糕的

Answers:


8

经过短暂的中断后,我回到了这个话题,再次以崭新的眼神(我和他的同事)再次看了看,并决定再次回到基础知识:

在执行的客户端上(在管理员外壳中):

enable-wsmancredssp -role client -delegatecomputer devremvm03 -force

在我执行的服务器上(在管理员外壳中):

enable-wsmancredssp -role server -force

两者均返回正常输出,指示CredSSP现在为“ true”。

然后,我使用以下练习器代码来逐步解决日益复杂的问题:

$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

以前,仅基本,远程和凭证A有效。现在所有5个工作。ew!


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

我不确定这是否会有所作为,但我的原始帖子可能会引起误解。我从CLIENT机器上运行了所有这些命令。因此,上面第二个代码块中的“ $ computer”是我尝试连接TO的服务器的名称。
jbsmith 2011年

我有些想通了,因为服务器必须事先了解客户端是没有道理的。但是,我只是再次重新运行了整个序列,以确保不会失败,并出现相同的错误。另一种变化:我省略了-Authentication参数,并确认语句中的其他所有内容都有效(Invoke-Command { Write-Host "hello, world" } -computername $serverName -credential $testCred)。因此,CredSSP身份验证完全是问题。
Michael Sorens

同意-基本的WinRM很好; 我不知道确切的问题是什么,但是我怀疑这与“允许新凭据”策略和您设置的SPN有关。我会仔细研究该政策设置,也许还要更深入地研究,以确保您的kerberos正常工作。该链接似乎可能会有所帮助:[link] msdn.microsoft.com/en-us/library/ee309365(v=vs.85).aspx
jbsmith 2011年

为什么要使用Connect-WSMan到服务器,最好使用enable-wsmancredssp -role服务器,不是吗?
Kiquenet'9

1

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

最终,我转到了运行正常的Hyper-v,并将注册表项hklm:\ SOFTWARE \ Policies \ Microsoft \ Windows \ CredentialsDelegation复制到了不运行的hyper-v。此后,两种方法都工作正常。


注册表树副本也对我有用。hklm:\ SOFTWARE \ ... \ CredentialsDelegation节点不存在,该值存储在hklm:\ SOFTWARE \ Wow6432Node \ ... \ CredentialsDelegation和HKEY_USERS \ ... \ Group Policy Objects \ ... \ CredentialDelegation中。
Der_Meister '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.