是否有人知道是否有办法用PyWinrm打开一个持久的PowerShell会话来保持状态并且可以被多次调用?我正在尝试做类似以下的事情:
#!/bin/python
import winrm
# Initialize some COM object and call a method storing the results
# in $Results and then print $Results to stdout
ps_script = """
$SomeObject = New-Object -ComObject Some.Com.Object
$Results = SomeObject.DoThing
$Results
"""
# Create winrm connection
s = winrm.Session('https://server.domain.local', auth=('username', 'password'), transport='kerberos')
# Call the ps_script - contents of $Results is returned as a string
r = s.run_ps(ps_script)
# Parse the contents of $Results returned from the $Results variable
# in the ps script
parse_stdout_from_script(r.stdout)
# Based on results from parsing previous stdout, connect back to the
# same powershell session to manipulate the $Results variable some more
r = s.run_ps(new_ps_script_to_manipulate_existing_objects)
基于stdout的内容,我想连接回相同的PowerShell会话,并使用$ Results变量/对象。但是,当我执行另一个s.run_ps()时,我得到一个全新的PowerShell会话,其中没有在上一个会话中创建的对象或变量。
有没有人有任何想法如何连接回持久的PowerShell会话?我想知道这是否可能......
我无法在新的PowerShell会话中重新创建所有内容的原因是:
1)我正在调用的COM对象方法需要几分钟才能运行,如果我需要多次解析,这可能很容易叠加30分钟或更长时间。
2)COM对象在数组中返回结果,并不总是以相同的顺序返回它们。因此,当我重新运行COM对象方法并去操作它们时,我不能指望数组项在同一个地方。
如果我能以某种方式从powershell会话中获取stdout,执行需要在Python脚本中完成的解析(以及其他库调用),然后回调到所有相同的PowerShell会话,那将是很棒的第一次调用时保留变量和对象。
答案 0 :(得分:2)
您应该使用 pypsrp,它本机使用 PowerShell 远程处理。
GitHub 存储库中的示例将向您展示如何操作,您可以继续使用 .add_script()
或 add_cmdlet()
在会话中进行多次调用。
WinRM(以及扩展名 pywinrm
)与 PowerShell 并不严格相关,因此您正在执行的调用可能只会打开 powershell.exe
,并包含您发送的任何内容。
PSRP 是一个单独的协议,它通过 WinRM 作为其传输方式运行,因此您将连接到托管的 PowerShell 会话。