前言

在我的博客PowerShell: 远程管理除了知道Invoke-Command,还应该掌握Enter-PSSession这个命令_码农杰克-CSDN博客

种曾经提到执行使用PowerShell执行远程操作的时候有多种认证方式,其中之一就是CredSSP (Credential Security Support Provider) 。今天就来详细的聊一聊如何使用这个CredSSP。至于具体原因为啥要使用CredSSP,在这里不再赘述,请移步 PowerShell: 远程管理除了知道Invoke-Command,还应该掌握Enter-PSSession这个命令_码农杰克-CSDN博客

CredSSP概述

CredSSP主要是用来解决在Windows下远程资源访问的认证问题。所以敲黑板划重点了,CredSSP只适用于Windows平台,并且只是在访问远程资源的过程中才需要使用。那既然是访问远程资源那么聪明的你一定想到了,肯定就会有Server端和Client端。

CredSSP Client端

何为CredSSP的Client端?简言之就是你当前正在执行PowerShell命令的机器或者说你打开PowerShell窗口执行PowerShell命令的机器。当然这么说有点狭隘,有时候可能你并没有打开PowerShell窗口。比如使用一个后台任务运行某段PowerShell脚本,然后在这个脚本里面去访问了远程资源。

所以换句话说,CredSSP的Client端(客户端)就是你发起远程资源访问请求的那台机器,也就是你从那台机器发起远程访问,那么这台机器或者终端就可以看作是CredSSP的Client端。

CredSSP Server端

上一节说到了Client端,那么对应的,被访问的那台机器或者终端对应的就是CredSSP的Server端也就是服务器端。这里拿我们的Web应用来打比方就很好理解了,承载web应用的为服务器端,而我们浏览器所在的机器都可以是客户端。其实在CredSSP中,server端也叫delegate server,后面会详细讲到这个概念。

CredSSP 前因后果

那么Server端和Client端是不是就是CredSSP的全部呢?其实不然。如果只有Server端和Client端,我们还不需要使用CredSSP。其实在CredSSP中还涉及到第三个角色,正是这个角色才引入了CredSSP。

如果只有Client和Server两端,是不需要CredSSP也能实现我们平时所需的大部分功能的。如下图所示:

但是,如果我们在Server A上起了一个PowerShell 然后去Server B上执行一段脚本,然后再段脚本中又去访问的Server C的资源,这时候普通的认证就无法满足我们的需求了。如下图所示:

为啥会出现这种情况呢?因为在Windows里面,默认情况下在Server B上再执行Server A给的远程脚本访问Server C的资源的时候会把Server A传送给Server B的认证上下文全部清掉。那么对Server C上来说,Server B只是发起了一个匿名访问的请求。所以在Server B上访问任何Server C上需要认证的资源的都是Access Denied。

这个并不是PowerShell独有的问题,相信以前做过Windows下的Web程序或者其它类似情况的童鞋都遇到这样的问题。也就是经典的Double-Hop问题。

下面这张图来自网络,描述的就是典型的Double Hop问题,相信曾经困扰过不少同学。

好了至于web 应用如果解决Double Hop问题就不在这里讨论。有兴趣的童鞋可以自己研究一下下:)

配置CredSSP

那我们接下来看看PowerShell是如何解决这个问题的。---当然就是CredSSP。

为了解决Double-Hop的问题,有以下的步骤:

  1. 在Server A(也就是Client)上设置激活CredSSP Client, 并设置Target CredSSP Server
  2. 在Server B(也就是 Server 或者Delegate Server)上设置激活 CredSSP Server
  3. 在建立Server A->B的链接时告诉PowerShell使用CredSSP认证

然后再通过Server A在Server B上发起向Server C的资源请求时就不会再有Access Denied或者Unauthorized的问题了。

具体细节如下:

1. 客户端激活CredSSP

使用Enable-WSManCredSSP命令激活客户端,在激活客户端CredSSP是需要指定服务端是谁。

Enable-WSManCredSSP

[[-DelegateComputer] <String[]>]

[-Force]

[-Role] <String>

[<CommonParameters>]

使用举例:

指定单台服务端服务器

Enable-WSManCredSSP -Role "Client" -DelegateComputer "Server02.fabrikam.com"cfg         : http://schemas.microsoft.com/wbem/wsman/1/config/client/auth
lang        : en-US
Basic       : true
Digest      : true
Kerberos    : true
Negotiate   : true
Certificate : true
CredSSP     : true

这里的“Server02.fabrikam.com”就是我们图里面的Server B,可以是一台也可以是多台

-Role “Client” 表示当前机器是客户端也就是我们图里面的 Server A。

指定多台服务器为服务端

$servers = "server02.fabrikam.com", "server03.fabrikam.com", "server04.fabrikam.com"
Enable-WSManCredSSP -Role "Client" -DelegateComputer $serverscfg         : http://schemas.microsoft.com/wbem/wsman/1/config/client/auth
lang        : en-US
Basic       : true
Digest      : true
Kerberos    : true
Negotiate   : true
Certificate : true
CredSSP     : true

除了使用具体的机器名还可以使用通配符*来指定

指定"fabrikam.com"域下面的所有机器都可为服务端

Enable-WSManCredSSP -Role "Client" -DelegateComputer "*.fabrikam.com"cfg         : http://schemas.microsoft.com/wbem/wsman/1/config/client/auth
lang        : en-US
Basic       : true
Digest      : true
Kerberos    : true
Negotiate   : true
Certificate : true
CredSSP     : true

指定任何机器可为服务端

Enable-WSManCredSSP -Role "Client" -DelegateComputer "*"cfg         : http://schemas.microsoft.com/wbem/wsman/1/config/client/auth
lang        : en-US
Basic       : true
Digest      : true
Kerberos    : true
Negotiate   : true
Certificate : true
CredSSP     : true

2. 服务端激活CredSSP

服务端设置相对来讲比较简单,也是使用Enable-WSManCredSSP命令。

Enable-WSManCredSSP -Role "Server"

这个命令表示说把当前的服务器作为服务端或者代理端使用也就是Server B,可以把Server A传给他的认证信息代理给其它Server C。

3. 指定CredSSP 认证方式

现在 Client端和Server端都已经配置好那么接下来就是使用了。常见的两个远程操作命令都可以使用CredSSP的认证方式。

Enter-PSSession -ComputerName ServerB -Credential (Get-Credential) -Authentication Credssp
$parameters = @{ComputerName = 'ServerB'ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 }Authentication = "CredSSP"Credential = "Domain01\Admin01"
}
Invoke-Command @parameters

到这里CredSSP的详细使用就告一段落了。那么问题来了,是不是Server A上只能激活Client而 Server B上只能激活Server端呢?

其实不是的,既然Server A可以向Server B发起请求,同样的Server B也可以向Server A发起请求。所以在同一台服务器上既可以设置他为Client端也可以设置他作为服务端或者代理端来使用。

4. 查看CredSSP设置

PowerShell中使用Get-WSManCredSSP来查看当前Server的CredSSP设置。

Get-WSManCredSSP

5. 关闭CredSSP设置

如果我们不想一直开着CredSSP设置,那么可以使用Disable-WSManCredSSP来关闭他。

关闭服务端

Disable-WSManCredSSP -Role Server

关闭客户端

Disable-WSManCredSSP -Role Client

常见问题诊断

1. 没有权限

不管是 Enable-WSManCredSSP还是Get-WSManCredSSP都需要管理员权限,所以请使用“Run as Administrator” 或者 “以管理员身份运行”。

2. 相关服务没有运行

CredSSP依赖于WS-Management服务,所以确保这个服务已经运行。如果没有运行也没关系,使用下面的命令快速的设置。

winrm quickconfig

总结

本文介绍了CredSSP的使用场景,CredSSP中涉及到的各个服务器的角色,以及CredSSP的使用步骤和常见问题诊断。


我是码农杰克欢迎大家来交流共同学习! 最后祝女神们节日快乐。

PowerShell:远程管理中的多跳问题之CredSSP详解相关推荐

  1. linux操作系统之常用远程管理命令:关机和重启命令shutdown详解 简单易懂~

    1.shutdown命令的使用格式:shutdown 选项(关机或重启电脑 ) 2.怎样才能通过终端来远程的控制电脑呢? 通过控制终端,向重新启动或者关闭电脑的时候,就可以在终端输入shutdown的 ...

  2. powershell远程管理

    简介 在一定程度上讲powershell 远程管理类似域Telent或者其他一些老旧的远程处理技术,它会在远程计算机上面执行相关命令,并将结果返回本地计算机,powershell远程管理使用的是针对管 ...

  3. PowerShell远程管理Windows Server(2):公网访问【web形式】

    *此文章只适合于windows server 2012版本以上: Powershell Web Access需要两个步骤才能使用: 一.安装powershell web access功能: 二.配置p ...

  4. Powershell远程管理服务器客户端

    目录 域中计算机远程管理 1.管理员权限运行Powershell,输入Enable-PsRemoting开启Powershell远程管理 2.S12-1Powershell远程管理S12-2

  5. PowerShell 远程管理之启用和执行命令

    PowerShell 2.0的远程管理功能很强大,为了方便读者学习这里首先介绍学习环境的设置,便于读者在理解原理的同时有相对形象的体验.在本文中,将会分别介绍了如何启用和禁用powershell的远程 ...

  6. Node.js中的不安全跳转如何防御详解

    为什么80%的码农都做不了架构师?>>>    Node.js中的不安全跳转如何防御详解 导语: 早年在浏览器大战期间,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个 ...

  7. rac的crs进程是做什么的_RAC 管理(crs_stat、crsctl、srvctl各种命令详解)

    RAC 管理(crs_stat.crsctl.srvctl各种命令详解) 命令集可以分为以下4种: 节点层:osnodes 网络层:oifcfg 集群层:crsctl, ocrcheck,ocrdum ...

  8. RAC 管理(crs_stat、crsctl、srvctl各种命令详解)

    RAC 管理(crs_stat.crsctl.srvctl各种命令详解) Oracle Clusterware的命令集可以分为以下4种:  节点层:osnodes  网络层:oifcfg  集群层:c ...

  9. php 修改 wordpress,修改WordPress中文章编辑器的样式的方法详解

    这篇文章主要介绍了修改WordPress中文章编辑器的样式的方法详解,同时文中也推荐了两款取代默认文章编辑器的插件,需要的朋友可以参考下 自定义文章编辑器的样式每一个 WordPress 主题的文章样 ...

最新文章

  1. ------ 比较二位数组大小-----
  2. python常用快捷键、写代码事半功倍_Pycharm常用快捷键总结及配置方法
  3. STM32F0使用LL库实现MS5536C通讯
  4. 链表删除功能实现演示
  5. 人工智能/数据科学比赛汇总 2019.4
  6. 混沌工程:Netflix系统稳定性之道
  7. iOS - OC NSTimeZone 时区
  8. 渲染怎么加hdri_[翻译]Corona渲染器官方教程2--设置HDRI光照
  9. AD ---- 活动目录的日常管理操作(3)
  10. [3D数学基础:图形与游戏开发]读书笔记 第12章(几何图元直线、AABB、球圆、平面、三角形、多边形)
  11. 台式计算机可以发射无线网络,台式电脑无线网卡怎么发射WIFI信号!
  12. C. Balanced Stone Heaps和P2440 木材加工
  13. CentOS官网下载对应版本
  14. android adb连接多个夜神模拟器,夜神安卓模拟器连接adb的具体操作流程
  15. 动画(重点)~~~~~
  16. 编程之美 2.1 求二进制中1的个数
  17. Nginx推流负载均衡配置
  18. Win10系统卸载照片应用程序详细介绍
  19. MySQL8安装教程和新特征
  20. CircuitJS 好玩实用电路仿真软件

热门文章

  1. 微信红包文案怎么写吸引人,520发红包感想
  2. 2021年安徽省高考成绩查询窗口,安徽省教育招生考试院:2021年安徽高考查分入口、查分系统...
  3. Nginx开启gzip压缩配置参数
  4. vant weapp 小程序 获取用户信息授权
  5. python取整求余
  6. 压缩包如何设置自动添加密码?
  7. java格式化货币_java-格式化没有货币符号的货币
  8. mysql百万数据分区_mysql百万数据实践-分区
  9. WAIC | 阿里副总裁司罗:大规模语言模型如何赋能行业、创造价值
  10. unity3D防止破解插件:Anti-Cheat Toolkit的使用