Python与PowerShell的交互

时间:2015-12-30 01:38:25

标签: python powershell

我是一名系统管理员,并一直在努力进行编码。到目前为止,我真的很喜欢使用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命令来获取域/广告/交换信息,以及解析最近的备份文件等,以便报告从系统可访问性,延迟,正常运行时间,备份失败,事件日志内容,最近更改等所有内容,并将其作为一个报告输出。

谢谢!

2 个答案:

答案 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)

您应该查看Fabric(http://www.fabfile.org/)。

这是为了完成这些任务。

希望有所帮助。