paramiko是连接Linux服务器的,如果想要远程连接Windows,则需要用到winrm
winRM服务是windows server下PowerShell的远程管理服务。
Python脚本通过连接winRM模块操作windows命令行。
查看winrm服务状态,默认没有启动
winrm enumerate winrm/config/listener
winrm服务启动
winrm quickconfig
报错:
PS C:\Windows\system32> winrm quickconfig
在此计算机上,WinRM 未设置为接收请求。
必须进行以下更改:
启动 WinRM 服务。
将 WinRM 服务类型设置为延迟的自动启动。
执行这些更改吗[y/n]? y
WinRM 已更新为接收请求。
成功更改 WinRM 服务类型。
已启动 WinRM 服务。
WSManFault
Message
ProviderFault
WSManFault
Message = 由于此计算机上的网络连接类型之一设置为公用,因此 WinRM 防火墙例外将不运行。 将网络连接类型更改为域或专用,然后再次尝试。
错误编号: -2144108183 0x80338169
由于此计算机上的网络连接类型之一设置为公用,因此 WinRM 防火墙例外将不运行。 将网络连接类型更改为域或专用,然后再次尝试。
打开网络和Internet设置:
更改连接属性为专用:
运行再次报错:
PS C:\Windows\system32> winrm quickconfig
已在此计算机上运行 WinRM 服务。
WinRM 没有设置成为了管理此计算机而允许对其进行远程访问。
必须进行以下更改:
启用 WinRM 防火墙异常。
配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。
开启防火墙:
netsh advfirewall firewall set rule group="Windows 远程管理" new enable=yes
运行成功:
已更新 3 规则。
确定。
再次启动:
C:\Windows\system32> winrm quickconfig
已在此计算机上运行 WinRM 服务。
在此计算机上设置了 WinRM 以进行远程管理。
查看:
PS C:\Windows\system32> winrm enumerate winrm/config/listener
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = 127.0.0.1, 192.168.64.84, ::1
为winrm service 配置auth
winrm set winrm/config/service/auth '@{Basic="true"}'
Auth
Basic = true
Kerberos = true
Negotiate = true
Certificate = false
CredSSP = false
CbtHardeningLevel = Relaxed```
为winrm service 配置加密方式为允许非加密
winrm set winrm/config/service @{AllowUnencrypted="true"}
PS C:\Windows\system32> winrm set winrm/config/service '@{AllowUnencrypted="true"}'
Service
RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
MaxConcurrentOperations = 4294967295
MaxConcurrentOperationsPerUser = 1500
EnumerationTimeoutms = 240000
MaxConnections = 300
MaxPacketRetrievalTimeSeconds = 120
AllowUnencrypted = true
Auth
Basic = true
Kerberos = true
Negotiate = true
Certificate = false
CredSSP = false
CbtHardeningLevel = Relaxed
DefaultPorts
HTTP = 5985
HTTPS = 5986
IPv4Filter = *
IPv6Filter = *
EnableCompatibilityHttpListener = false
EnableCompatibilityHttpsListener = false
CertificateThumbprint
AllowRemoteAccess = true
注意:
1.需要在控制端和被控制端都进行配置才可以使用winrm远程连接
2.只用于局域网,两台电脑必须可以ping通
3.必须使用管理员打开命令行,否则会出现权限不够导致出错
下面这些命令我没有使用,有需要的可以取:
1.能够以每组多达50个实例的速度获取实例
winrm set winrm/config @{MaxBatchItems="50"}
2.通过增大分配的最大封包大小和超时设置,也可以提高性能
winrm set winrm/config @{MaxEnvelopeSizekb="150"}
winrm set winrm/config @{MaxTimeoutms ="60000"}
3.要获取当前的WinRM配置设置,请执行以下命令
winrm g winrm/config
4.默认情况下,客户端计算机要求对网络流量加密。要允许客户端计算机请求未加密流量,请执行以下命令
winrm s winrm/config/Client @{AllowUnencrypted="true"}
TrustedHosts 是一个数组,用于指定可信的远程计算机的列表。同一工作组中的其他计算机或不同域中的计算机均应添加到此列表中。TrustedHosts 列表中的计算机未经过身份验证。
5.执行以下命令可将所有计算机都纳入TrustedHosts
winrm s winrm/config/Client @{TrustedHosts="*"}
6.基本身份验证是以明文形式将用户名和密码发送给服务器或代理的方案。这是最不安全的身份验证方法。默认值为True。
执行以下命令可将客户端计算机设置为使用基本身份验证
winrm s winrm/config/Client/Auth @{Basic="true"}