使用python子进程执行调用命令powershell会话时出错



我在执行代码时遇到错误。该代码的主要目的是通过使用subprocess python在powershell中创建new-Pssession,然后利用该session执行"Get-process">

下面是我的代码示例:
import subprocess
result=subprocess.run(['powershell.exe',' New-PSSession -ComputerName 12.455.66.7777 -Credential (New-Object System.Management.Automation.PSCredential("username",(ConvertTo-SecureString "password" -AsPlainText -Force)))'],capture_output=True)
session=result.stdout.decode().strip()
print(session)
result=subprocess.run(["powershell.exe","-Command", f"Invoke-Command -Session {session} -ScriptBlock {{Get-Process}}"], capture_output=True)
print(result)

和我有这个错误:

引用CompletedProcess(args=['powershell.exe', '-Command', 'Invoke-Command -Session Id ' Name ComputerName ComputerType State ConfigurationName Availabilityrn ------ ------------ ----------------- ----------------- ------------rn 1 WinRM1 11.888.32.09 remotemmachine打开Microsoft. exePowerShell Available -ScriptBlock {Get-Process}'], returncode=1, stdout=b ", stderr=b"At line:3 char:5rn+ 1 WinRM1 10.229.78.59 remotemmachine open Mic…rn+ ~~~~~~rn表达式或语句中出现意外的令牌'WinRM1'。 r nAt线:2字符:5 r n + -- ---- ------------ ------------ ----- --- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。 r nAt线:2字符:7 r n + -- ---- ------------ ------------ ----- --- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。rnAt line:2 char:21rn+…------------ ------------ ----- ----------- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。rnAt line:2 char:23rn+…------------ ------------ ----- ------------- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。rnAt line:2 char:25rn+…------------ ------------ ----- --------------- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。rnAt line:2 char:27rn+…------------ ------------ ----- ----------------- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。rnAt line:2 char:29rn+…------------ ------------ ----- ----------------- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。rnAt line:2 char:31rn+…------------ ------------ ----- ----------------- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。rnAt line:2 char:37rn+…-------- ------------ ----- ----------------- ----- ... r n + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ r nThe"——"操作员只能对变量或属性。并不是所有的解析错误都被报告了。更正报告的错误,然后重试。rn + CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordExceptionrn + fulllyqualifiederrid: UnexpectedTokenrn rn")

这个问题是由于试图传递一个Powershell对象作为它的字符串表示而引起的。

当调用New-PSSession时,它将返回一个Powershell Session对象。你的代码没有对对象做任何事情,所以Powershell将打印它,有点像Python对象__str()__。现在,在Powershell中,这些默认输出表单通常是面向表的。也就是说,有带有标题和破折号/减去-字符的分隔符的列。一样,

PS C:>New-PSSession -ComputerName testserver
Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
-- ----            ------------    ------------    -----         -----------------     ------------
2 WinRM2          testserver     RemoteMachine   Opened        Microsoft.PowerShell     Available

Python代码将所有这些(ID, Name, Computername... --, ----,...)读取为字符串。在下一个子进程命令中,整个混乱的字符串而不是实际对象作为参数值传递给-Session。它将包含所有的负号和其他垃圾。Powershell的解析器不理解这些,它需要对象。一堆减号字符被解释为减法运算符,好吧,什么都不起作用。

等等,情况更糟了。Powershell的会话不是全局的。因此,当您第二次为Invoke-Command调用Powershell shell会话时,远程会话不在作用域中。因此,即使如果您设法使会话未被修改(例如,有Export-CliXML序列化),它也不会在第二个shell会话中工作。

相关内容

  • 没有找到相关文章

最新更新