PowerShell: 使用PowerShell建立远程会话

PowerShell连接远程主机运行远程命令

https://www.cnblogs.com/makesense/p/12820404.html

PowerShell主要采用Web Services for Mangement(WS-MAN)进行远程处理,WS-MAN完全基于Http(默认5985)或者Https(默认5986)进行工作,这样保证在需要的情况下,能够轻易透过防火墙进行作业(因为每种协议都使用唯一的端口进行通信)。微软对WS-MAN的实现是Windows Remote mangement(WinRM)。WinRM是一个基于SOAP的后台服务。

PowerShell连接常规远程主机

1. 在远程机器上以Administrator角色打开PowerShell执行以下命令,启动允许远程连接

Enable-PsRemoting

2. 在客户机器 (本地) 执行以下命令,将远程机器IP地址加入可信主机列表

Set-Item wsman:\localhost\Client\TrustedHosts -value <Remote Host IP Address>

3. 在客户机器 (本地) 输入以下命令, 在弹出对话框输入密码,以交互的方式连接远程主机

Enter-PSSession -ComputerName <Remote Host IP Address> -Credential <UserName>

4. PowerShell远程命令的基本使用见官方文档: Running Remote Commands

  • Start an Interactive Session (Enter-PSSession and Exit-PSSession)
  • Run a Remote Command / Script (Invoke-Command)
  • Establish a Persistent Connection (New-PSSession)

使用PowerShellHttp方式连接Azure虚拟机

1. 同以上常规连接远程主机设置

1. 若虚拟机安全受网络完全组(Network Security Group)管控,设置允许5985入栈

2. 若虚拟机绑定了负载均衡器(load balancer),为5985端口设置入站NAT规则(Inbound NAT Rules), 或者为了隐藏实际端口,为5985端口运行状况探测(probes)和负载均衡规则(load Balancing Rules)

 使用PowerShell以Https方式连接Azure虚拟机

1. 同以上常规连接远程主机设置

2. 打开Azure远程虚拟机(Windows)防火墙设置,设置允许5986入栈

3. 若虚拟机安全受网络完全组(Network Security Group)管控,设置允许5986入栈

4. 若虚拟机绑定了负载均衡器(load balancer),为5986端口设置入站NAT规则(Inbound NAT Rules),或者为了隐藏实际端口,为5986端口运行状况探测(probes)和负载均衡规则(load Balancing Rules)

5. 需使用以下命令连接远程主机, 详细参数设置见: Enter-PSSession

# 设置会话,忽略远程机器的SSL证书验证
$SessionOption = New-PsSessionOption SkipCACheck -SkipCNCheck
Enter-PSSession -ConnectionUri https://<Remote Host IP Address>:5986 -Credential <User Name> -SessionOption $SessionOption
# 另一种参数形式
Enter-PSSession -ComputerName <Remote Host IP Address> -Port 5986 -UseSSL -Credential <User Name> -SessionOption $SessionOption

从PowerShell 6开始,除了WS-MAN之外,远程处理技术还可以基于SSH协议。在最新的Windows 10和Windows Server 2019中,可以使用OpenSSH连接远程机器,详细文档参见:PowerShell remoting over SSH and OpenSSH in Windows, 另外,OpenSSH客户端在最新的Windows 10和Windows Server 2019中已默认安装,在 设置\应用\可选功能 列表下可以找到(见下图), 可以通过上方的添加功能按钮安装OpenSSH服务器。

 

更多参考:

1. Enable PowerShell remoting on Azure RM virtual machines

2. Copy files to Azure VM using PowerShell Remoting

3. Secrets of PowerShell Remoting

3. 远程管理WinRM,Enter-PSSession (Enable-PSRemoting = Set-WSManQuickConfig = winrm quickconfig)

4. PowerShell 远程执行任务

5. Windows开启WinRM服务 

PowerShell: 如何使用PowerShell远程登录,如何使用PowerShell建立远程会话

IT大厨 2022-03-30 09:12:05 修改

摘要

认识 Enter-PSSession

示例

示例一:下面是一个比较完整的使用Enter-PSSession的例子

示例二:建立一个可重用的会话

示例三:使用用户名密码建立连接

示例四:指定认证方式

注意事项

摘要
在服务器上执行远程脚本的时候一般可以使用Invoke-Command,但是如果连续执行脚本,并且想在执行过程中保持上下文信息,也就是说交互式的执行远程命令,就得用到今天要说的另外一个命令了 Enter-PSSession。

认识 Enter-PSSession


看下官方的原文解释。

Starts an interactive session with a remote computer.

其实说白了就是启动一个链接到远程计算机的交互式会话。

因此当这个会话启动之后你所敲入的所有命令都会在远程计算机上执行,直到你关闭窗口或者执行Exit-PSSession退出当前会话。而且一般来讲同时建立会话的个数是有个上限的。

有时候如果没有显示的调用Exit-PSSession,有可能会话不会立即中断。当这种会话达到一定数量之后再去建立新的会话就会出现失败。当然这个具体的限制是多少没有具体研究过,毕竟平时很少遇到这种情况,有兴趣的读者可以去研究一下。

执行Enter-PSSession成功之后会在原来的命令行前面显示你所连接到的远程计算机名字比如:

PS C:\> Enter-PSSession -ComputerName Server01
[Server01]: PS>
示例
示例一:下面是一个比较完整的使用Enter-PSSession的例子
PS C:\> Enter-PSSession -ComputerName Server01
[Server01]: PS>  #Exuting on remote server
[Server01]: PS C:\> Get-Process PowerShell > C:\ps-test\Process.txt  #Exuting on remote server
[Server01]: PS C:\> exit #Exuting on remote server
PS C:\>  #back to local server
PS C:\> dir C:\ps-test\process.txt #back to local server
Get-ChildItem : Cannot find path 'C:\ps-test\process.txt' because it does not exist.
At line:1 char:4
+ dir <<<<  c:\ps-test\process.txt
示例二:建立一个可重用的会话
第一步:新建一个会话对象

PS> $s = New-PSSession -ComputerName Server01
第二步:使用会话对象建立连接

PS> Enter-PSSession -Session $s
 完整代码片段:

PS> $s = New-PSSession -ComputerName Server01
PS> Enter-PSSession -Session $s
[Server01]: PS>
这里的这个$s变量是可以重复使用的,比如它可以当参数传递给别的命令,又或者他可以多次调用。这样既避免了多次建立连接的麻烦,也避免了平凡建立连接对系统的影响。

示例三:使用用户名密码建立连接
 一般情况下企业都会搭建域环境,而且相同功能的一组机器之间也会有相同的权限设置。所以使用同一个管理账号可以在不同机器之间无缝切换,并且默认使用Windows认证并不需要你重复输入 你的用户名密码。因为你已经登录到某一台机器了,要不怎么执行这些个命令呢。

但凡事都有意外不是。

假如你所操作的机器不在同一个域,或者在同一个域但是有不同的权限设置,又或者你想用一个管理员账号来执行一些远程的管理任务。。。等等

这些情况下,默认的Windows认证就不在好用你需要显示的输入你的凭证。

PS> Enter-PSSession -ComputerName Server01 -Credential (Get-Credential)
[Server01]: PS>
第一条命令执行的时候会弹出一个输入框,让你输入你的用户名密码。如果是在域环境下需要按照 domain\user的形式来输入用户名。

示例四:指定认证方式
这种方式也是比较坑的一种方式,一般情况下用不到,但是往往新手遇到的时候会在这个上面卡很久。

PS> Enter-PSSession -ComputerName Server01 -Credential (Get-Credential) -Authentication Credssp
[Server01]: PS>
这个指定认证方式有很多种,我只说其中的CredSSP。

其它的几种认证方式都只是说如何把你输入的凭证有效的应用到远程机器上。让你通过从本地到远程的认证。而CredSSP除了让你的凭证通过本地到远程的认证之外它还会让你的凭证继续在远程机器上生效。我们先看下官方文档:

CredSSP authentication is available only in Windows Vista, Windows Server 2008, and later versions of the Windows operating system.

For more information about the values of this parameter, see AuthenticationMechanism Enum.

Caution: Credential Security Support Provider (CredSSP) authentication, in which the user's credentials are passed to a remote computer to be authenticated, is designed for commands that require authentication on more than one resource, such as accessing a remote network share. This mechanism increases the security risk of the remote operation. If the remote computer is compromised, the credentials that are passed to it can be used to control the network session.

什么意思呢?举个栗子,就容易理解了。

假设有A,B,C三台服务器,并且都能使用user1登录。

1. 非CredSSP的情况

当使用User1从A建立到B的会话,然后又在会话里面去访问C上只有User1才能访问的资源的时候就会失败。

2. 使用CredSSP

当使用User1从A建立到B的会话,然后又在会话里面去访问C上只有User1才能访问的资源的时候就不会有问题。因为建立A-->B的连接的时候通过CredSSP这种方式已经把完整的凭证传给了B,所以在B上可以继续以User1的身份来访问C上的内容。

还有其他一些示例也就不再赘述。

注意事项
1. 不使用的会话要及时关闭

2. 使用New-PSSession可以建立一个可重用的会话

3. 提供凭证可以在不同环境的服务器之间建立连接

4. 如果在远程服务器上要访问另外一台服务器资源的时候要注意是否使用CredSSP

整理了部分近期发布的文章仅供大家参考:

为什么大神们的文章看起来那么酷?除了写的好还使用了生动的动图(gif)。一款【免费】的动图工具screentogif了解一下
Powershell:使用PSCustomObject,序列化执行结果
PowerShell: 为啥大神们的PowerShell窗口还有智能提示?因为他设置了这个
PowerShell: 远程管理除了知道Invoke-Command,还应该掌握Enter-PSSession这个命令
PowerShell: RDP管理服务器效率低下,使用invoke-command同时维护多台服务器不再难
PowerShell: 用原生PowerShell就能解决访问web资源时的ADFS认证问题
PowerShell: 不需要学Python,使用powershell也能处理Excel提高办公效率
PowerShell: 作为一个PowerShell菜鸟,如何快速入门?掌握这些就够了
————————————————
版权声明:本文为CSDN博主「IT大厨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gjmjack/article/details/117792465

我们有的时候,不能直接远程桌面登录另外一台Window机器,这个时候可以使用Enter-PSSession命令,通过PowerShell终端等到远程的Window机器,这个时候,就需要被访问的机器打开5985 或者5986 端口。 默认情况下,Window 2008 Server或者Window 2012 Server会自动默认开启WinRM的服务器,从而暴露5985或者5986端口; 但是如果所有的机器在一个域里面的话,http(5985端口)的方式就能直接访问,否则必须启用https(5986端口)的方式,在调用的过程中可能会遇到下面的错误:

解决方案就是,在执行Enter-PSSession命令的这端(注意不是目标机器一端)执行下面的命令:

Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.2.*

调用完之后,Enter-Session就能登录到远程的机器上去了。
————————————————
版权声明:本文为CSDN博主「大象无形,大音希声」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chancein007/article/details/73535519

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值