使用 CredSSP 的 PowerShell 远程处理已损坏

使用 CredSSP 的 PowerShell 远程处理已损坏

我最近让 PowerShell 与 CredSSP 完美配合,但现在每次我尝试使用 CredSSP 建立远程会话时,都会出现以下错误:

Enter-PSSession : 连接到远程服务器 server01.contoso.com 失败,并显示以下错误消息 : WinRM 客户端收到 HTTP 服务器错误状态 (500),但远程服务未包含有关失败原因的任何其他信息。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。位于行:1 字符:1 + Enter-PSSession -ComputerName server01.contoso.com -Credential $cred -Authentication C ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (server01.contoso.com:String) [Enter-PSSession],PSRemotingTransportException + FullyQualifiedErrorId : CreateRemoteRunspaceFailed

我尝试使用重置 winrm 服务winrm invoke restore winrm/config

我尝试过禁用 PowerShell 远程处理、禁用 CredSSP(客户端和服务器)、重新启用 PowerShell 远程处理、重新启用 CredSSP、禁用与配置 WinRM 和凭据委派相关的任何 GPO,但都不起作用。有没有办法进一步深入研究这个问题,找出到底发生了什么?

这影响了我的实验室环境中的所有 Windows Server 2012 系统,这些系统显然运行的是 PowerShell v3。

在里面客户我看到的是Windows 远程管理事件日志:WSMan operation CreateShell failed, error code 2150859120

配置服务器

  • Disable-PSRemoting -Force;
  • Disable-WsmanCredssp -Role Client;
  • Disable-WsmanCredssp -Role Server;
  • Enable-PSRemoting -Force;
  • Set-WSmanQuickConfig -UseSSL -Force;
  • Enable-WsmanCredSSP -Role Server -Force;

配置客户端

  • Disable-PSRemoting -Force;
  • Disable-WsmanCredssp -Role Client;
  • Disable-WsmanCredssp -Role Server;
  • Enable-PSRemoting -Force;
  • Set-WSmanQuickConfig -UseSSL -Force;
  • Enable-WsmanCredssp -Role Client -DelegateComputer *.contoso.com -Force;

配置客户端和服务器后,运行:

$cred = Get-Credential;
Enter-PSSession -ComputerName server.contoso.com -Credential $cred -Authentication CredSSP;

这会持续重现该错误。

答案1

我想我可能已经发现这个问题了。

我最初在使用 HTTPS 侦听器时遇到了问题。我想使用显式 IP,但这仅在使用 SSL 时可用。使用以下命令设置 SSL 侦听器:

Set-WSManQuickConfig -UseSSL -Force

或者

winrm quickconfig -transport:https -Force

将在服务器上配置监听器,但使用该-UseSSL参数从客户端连接时仍然会失败。

我放弃了 IP,转而使用机器名。我尝试在脚本中设置 HTTPS,但在使用 HTTPS 进行身份验证时遇到了 500 个响应的问题Credssp

最后,我决定一次尝试一件事。一旦我删除 HTTPS 设置,一切就都好了!

我的完整脚本如下所示:

# Disable/revoke winrm/remoting
Start-Service winrm
winrm invoke restore winrm/config

Disable-PSRemoting -Force
Disable-WSManCredSSP -Role Client
Disable-WSManCredSSP -Role Server
Stop-Service winrm

# Enable remoting
Enable-PSRemoting -Force
Enable-WSManCredSSP -Role Server -Force
Enable-WSManCredSSP -Role Client -DelegateComputer "*.mydomain.com" -Force
winrm enumerate winrm/config/listener

Set-Item WSMan:\localhost\Client\TrustedHosts "*.mydomain.com" -Force

这当然不是理想的,但我希望它有所帮助。

答案2

快速摘要

对于任何其他寻求如何系统地解决此问题的人来说,它基本上归结为更改由 lsass.exe 冒充 NT AUTHORITY\NETWORK SERVICE 访问的文件 ACE。

细节

1) 出现此错误表明远程处理的 WinRM 设置正确,否则将遇到非 500 http 错误。

2)我的问题仅限于使用本地主机,使用以下 PS 命令在同一台机器上测试客户端/服务器部分:

$cred = Get-Credential 
Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp

3)我使用以下 PS 命令生成了自签名证书:
笔记:将实际主机名替换为 <hostname>(不带尖括号 <>)。如果计算机是域的一部分,请将 FQDN 添加到列表中。

$todaydt = Get-Date
$3years = $todaydt.AddYears(3)
New-SelfSignedCertificate -dnsname <hostname>, localhost -notafter $3years -CertStoreLocation cert:\LocalMachine\My

4) 上述证书将与私钥一起添加到本地计算机的操作系统证书存储中:

\Personal\Certificates

使用 certlm.msc 导出证书(带有私钥),然后将其导入 - 是的,您将有两个副本:

\Trusted Root Certificate Authorities\Certificates

5) New-SelfSignedCertificate 将输出一个指纹,确保该值作为证书指纹存储在以下两个 WinRM 位置(请参阅下文了解如何通过注册表轻松更新 WinRM 值)

winrm e winrm/config/listener
Look for the CertificateThumbprint under the HTTPS transport
[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Listener\*+HTTPS\certThumbprint]

winrm get winrm/config/service
[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Service\credssp_thumbprint]

6)启用 PS 跟踪来捕获服务器抛出的确切错误消息:

Enable-PSWsmanCombinedTrace
Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp
Disable-PSWsmanCombinedTrace

7)使用事件查看器打开生成的跟踪文件:

C:\Windows\System32\WindowsPowerShell\v1.0\Traces\PSTrace.etl

8) 在这种情况下,错误被报告为服务器响应处理

Sending HTTP error back to the client due to a transport failure.
The HTTP status code is 500
The error code is 2148074253

这也可以表示为 0x8009030D 或 SEC_E_UNKNOWN_CREDENTIALS

9)使用 Sysinternals 进程监视器查找进程 lsass.exe 中被拒绝访问的确切文件

C:\ProgramData\Microsoft\Crypto\Keys\
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

10)使用以下 icacls 命令更新文件上的 ACE

icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\<###> /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"
icacls C:\ProgramData\Microsoft\Crypto\Keys\<###> /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"

11)一切准备就绪

Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp
Enter-PSSession -ComputerName localhost -Credential $cred -Authentication Credssp -UseSSL


便捷命令

(一)查看当前WinRM配置信息

winrm get winrm/config
winrm e winrm/config/listener

上述配置信息存储在注册表中,可以从下面的位置轻松地动态修改值,并在上述命令中立即看到更新。

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN

(B)当网络为“公共”时,启用 PS 远程处理并绕过“故障”

Enable-PSRemoting -SkipNetworkProfileCheck -Force

(C)检查当前 CredSSP 配置

Get-WSManCredSSP

(D)为服务器和客户端角色启用 CredSSP

Enable-WSManCredSSP -Role "Server"
Enable-WSManCredSSP -Role "Client" -DelegateComputer "localhost", "127.0.0.1", "<hostname>", "<FQDN>"

相关内容