https://github.com/diyan/pywinrm/
https://pypi.org/project/pywinrm/0.2.1/
https://devblogs.microsoft.com/scripting/using-winrm-on-linux/
sudo apt-get install python-dev libkrb5-dev pip install Kerberos pywinrm
#!/bin/python import winrm win_host = 'http://windows.domain.local:5985/wsman' win_user = 'user@DOMAIN.LOCAL' win_pass = 'secret_password' winrm_transport='ntlm' s = winrm.Session(win_host, auth=(win_user, win_pass), transport=winrm_transport) r = s.run_cmd('ipconfig', ['/all']) print (r.std_out) print (r.status_code) ps_script = """$strComputer = $Host Clear $RAM = WmiObject Win32_ComputerSystem $MB = 1048576 "Installed Memory: " + [int]($RAM.TotalPhysicalMemory /$MB) + " MB" """ r= s.run_ps(ps_script) print (r.status_code) print (r.std_out)
#!/bin/python
from winrm.protocol import Protocol
p = Protocol(
endpoint='https://windows-host:5986/wsman',
# endpoint='http://windows-host:5985/wsman',
transport='ntlm',
username=r'somedomain\someuser',
password='secret',
server_cert_validation='ignore')
shell_id = p.open_shell()
command_id = p.run_command(shell_id, 'ipconfig', ['/all'])
std_out, std_err, status_code = p.get_command_output(shell_id, command_id)
p.cleanup_command(shell_id, command_id)
p.close_shell(shell_id)
print (std_out)
print (status_code)
Ошибки
TypeError: startswith first arg must be bytes...
При попытке запустить PowerShell Script на русскоязычной Windows получаем такое:
Traceback (most recent call last): File "./test_winrm.py", line 19, in <module> r= s.run_ps(ps_script) File "/usr/local/lib/python3.7/dist-packages/winrm/__init__.py", line 54, in run_ps rs.std_err = self._clean_error_msg(rs.std_err) File "/usr/local/lib/python3.7/dist-packages/winrm/__init__.py", line 62, in _clean_error_msg if msg.startswith("#< CLIXML\r\n"): TypeError: startswith first arg must be bytes or a tuple of bytes, not str
Обсуждение тут: https://github.com/diyan/pywinrm/issues/111
Судя по всему - причина в каких-то проблемах с кодировкой в функции _clean_error_msg(self, msg). Я просто закомментировал пару строк, которые вызывают эту функцию, которая делает удобочитаемыми сообщения об ошибках.
В принципе, меня вполне устроит просто проверка того, что скрипт вернул код 0.
В моей системе в файлике /usr/local/lib/python3.7/dist-packages/winrm/init.py я закоменнтировал строки:
if len(rs.std_err): # if there was an error message, clean it it up and make it human # readable rs.std_err = self._clean_error_msg(rs.std_err)
в функции run_ps(self, script).
Однако, если исполнять этот скрипт в среде python2, то все отрабатывает без ошибок!
Discussion