我在执行代码时遇到错误。该代码的主要目的是通过使用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会话中工作。