Pywinrm 连接访问 401 错误

使用 pywinrm 操作 windows 远程运行命令

  1. 使用 winrs 测试确认结果正确返回,使用 代码则失败
  • 代码如下, 安装使用 pip install pywinrm ,导入使用 import winrm
import winrm
ip = "1.1.1.1"
user = r"xha\sss"
password = "se123"
s = winrm.Session(ip, auth=(user, password))
r = s.run_command("ifconfig")
print(r.std_out)
  • 报错如下
File "./windows.py", line 18, in
shell_id = p.open_shell()
File "/usr/lib/python2.6/site-packages/winrm/protocol.py", line 118,
in open_shell
rs = self.send_message(xmltodict.unparse(rq))
File "/usr/lib/python2.6/site-packages/winrm/protocol.py", line 190,
in send_message
return self.transport.send_message(message)
File "/usr/lib/python2.6/site-packages/winrm/transport.py", line 99,
in send_message
raise UnauthorizedError(transport='plaintext', message=ex.msg)
winrm.exceptions.UnauthorizedError: 401 Unauthorized. basic auth failed
  • 使用命令测试, 测试正常,如不正常,请检查服务是否正常,在文章下面自行检查
winrs -r:ip:5985 -u:user -p:password ipconfig

问题症结

  1. 抓包对比使用命令行和代码执行的区别,发现请求头不同,代码使用的是 basic,命令行使用的是 Negotiate
  2. 解决方式, 将认证方式改为 ntlm,另外用户名如果是域名加用户名的形式的话,必须要使用 r"xx\xx", 否则 \ 会将后面的字符转义
s = winrm.Session(ip, auth=(user, password), transport="ntlm")
  1. 或者在组策略中打开,允许basic 认证
    1. win + r, 输入 gpedit.msc
    2. 找到计算机配置 -> 策略 -> 管理模板 -> Windows 组件 -> Windows 远程管理(WinRM) -> WinRM 服务
    3. 找到 Allow Basic authentication, 改为 启用

排除winrm 是否正常

  1. 在对端windows 电脑上,使用管理员运行 cmd
启用 WinRM 远程服务:winrm quickconfig
查看 WinRM 服务监听状态:winrm e winrm/config/listener
允许使用 Basic 认证方式:winrm set winrm/config/service/auth @{Basic="true"}
允许 WinRM 使用非加密的连接:winrm set winrm/config/service @{AllowUnencrypted="true"}

参考文章

  1. https://www.jianshu.com/p/1b4d456ec606
  2. https://github.com/diyan/pywinrm/issues/68
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值