4

我知道这个Get-WSManCredSSP功能;但是,此 cmdlet 在脚本中不能正常工作。这将返回一个类似于以下内容的长字符串:

The machine is configured to allow delegating fresh credentials to the following target(s): wsman/*,wsman/*,wsman/*,wsman/*
This computer is configured to receive credentials from a remote client computer.

我不能轻易地将它包含在我正在编写的脚本中,因此我正在寻找另一种方法来检查 CredSSP。

4

3 回答 3

4

您不能考虑按照CmdLet 帮助中的说明使用它:获取客户端上的 WS-Management CredSSP 设置 ( <localhost|computername>\Client\Auth\CredSSP)。

在本地机器上它给出:

(Get-Item  WSMan:\localhost\Client\Auth\CredSSP).value

你可以像这样使用它:

(Get-Item  WSMan:\localhost\Client\Auth\CredSSP).value -eq $false

您可以先测试 WinRm 是否可用:

(Get-Service -Name winrm ).Status
于 2013-09-24T03:20:49.823 回答
2

我也在努力解决Get-WSManCredSSP输出的限制问题,发现Victor Vogelpoel/Ravikanth Chaganti 的这个帮助脚本非常有用。

一些例子:

检查当前机器是否已配置为 CredSSP 服务器和/或客户端:

(Get-WSManCredSSPConfiguration).IsServer
(Get-WSManCredSSPConfiguration).IsClient

检查是否已为委派设置了指定的客户端计算机:

Get-WSManCredSSPConfiguration | % { $_.ClientDelegateComputer.Contains('clientcomputername') }
于 2014-03-26T09:48:01.273 回答
0

(不是为了替代 Vogelpoel & Chaganti 的工作,而是作为对 CredSSP.cs 的快速阅读的快速总结,因此您可以快速了解它在做什么——也就是说,它在我的几个系统上进行了测试手头有,似乎工作)

function Get-WSManCredSSPState
{
  $res = [pscustomobject]@{DelegateTo = @(); ReceiveFromRemote = $false}

  $wsmTypes = [ordered]@{}
  (gcm Get-WSManCredSSP).ImplementingType.Assembly.ExportedTypes `
  | %{$wsmTypes[$_.Name] = $_}

  $wmc = new-object $wsmTypes.WSManClass.FullName
  $wms = $wsmTypes.IWSManEx.GetMethod('CreateSession').Invoke($wmc, @($null,0,$null))
  $cli = $wsmTypes.IWSManSession.GetMethod('Get').Invoke($wms, @("winrm/config/client/auth", 0))
  $res.ReceiveFromRemote = [bool]([xml]$cli).Auth.CredSSP

  $afcPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentials'
  if (test-path $afcPath)
  {
    $afc = gi $afcPath
    $res.DelegateTo = $afc.GetValueNames() | sls '^\d+$' | %{$afc.GetValue($_)}
  }
  return $res
}
于 2017-10-30T18:35:54.300 回答