我是一名系统管理员,并一直在努力进行编码。到目前为止,我真的很喜欢使用python,并且能够做一些很酷的事情。但是,我正在努力的一件事就是能够基本上调用一个PowerShell脚本并读取输出(理想情况下不将它放到文件中)。
以下是两个用例: 1)
elif choice =="2":
target = raw_input("Enter your target hostname: ")
print "Creating target.ps1 file to establish connection"
pstarget = open("pstarget.ps1", "w")
pstarget.write("$target = New-Pssession " + target + "\n")
pstarget.write("Enter-PSSession $target" + "\n")
pstarget.close()
print "File created. Initiating Connection to remote host..."
os.system("powershell -noexit -ExecutionPolicy Unrestricted secretpath\HealthCheck\pstarget.ps1")
这让我陷入了一个远程的PowerShell会话,我可以在其中执行类似get-host的操作,它将输出远程计算机的主机名。
我遇到的主要问题是,我可以将该命令作为我创建的文件的一部分运行(因此它将响应输出到'get-host')。我怎么能把它带回python?现在的工作方式是我被引入PowerShell会话(实际上是一个嵌套的PowerShell会话,因为它是在另一台机器上调用shell的powershell会话)。所以,是的,是否有可能让这些命令的输出回到python(也许我想将该响应设置为变量?)
第二个问题是这样的:
elif choice == "4":
username = raw_input("Unlock AD User (Input username): ")
print "Creating target.ps1 file to unlock AD account"
psunlock = open("unlocktarget.ps1", "w")
psunlock.write("$unlock = Unlock-ADAccount " + username + "\n")
psunlock.close()
print "File created. Unlocking User Account."
os.system("powershell -ExecutionPolicy Unrestricted C:secretpath\Stuff\Code\Python\HealthCheck\unlocktarget.ps1")
print "%s's account has been unlocked. Press enter to continue." % username
raw_input("Press enter to continue...")
os.system("cls")
在这种情况下,我从未明确地在powershell会话中(从用户/ UI的角度来看),但是假设该命令存在错误或输出,我想捕获它,是否可以这样做? / p>
我很乐意提供任何其他信息,但我基本上是在寻找一种方法来最终运行来自python应用程序的Exchange管理控制台之类的东西,让我可以执行“按(1)列出前25个邮箱”之类的操作通过大小“或者,最终”,按(1)生成一个完整的环境报告“,它运行一些powershell命令来获取域/广告/交换信息,以及解析最近的备份文件等,以便报告从系统可访问性,延迟,正常运行时间,备份失败,事件日志内容,最近更改等所有内容,并将其作为一个报告输出。
谢谢!
答案 0 :(得分:3)
使用subprocess
模块而不是os.system()
(从here无耻地窃取的代码):
from subprocess import Popen, PIPE
cmd = ['powershell.exe', '-ExecutionPolicy', 'Bypass', '-File', 'C:\\Users\\cobalt\\Documents\\test\\test.ps1']
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
while True:
line = proc.stdout.readline()
if line != b'':
print(line.strip())
else:
break
答案 1 :(得分:1)