2015-12-30 129 views
0

我是一個系統管理員,並且一直試圖進一步研究編碼。我非常喜歡使用python,並且能夠做一些很酷的事情。然而,我正在努力的一件事是從本質上調用PowerShell腳本並讀取輸出(理想情況下不需要將其放到文件中)。與PowerShell的Python交互

這裏有兩個用例: 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')。我怎樣才能讓它回到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會話(從用戶/用戶界面的角度來看),但可以說有一個錯誤或從該命令的輸出,我想捕獲它,有沒有可能這樣做?

我會很樂意提供任何額外的信息,但我基本上尋找一種方法來最終從Python應用程序運行Exchange管理控制檯,這將允許我執行諸如「按(1)列出前25個郵箱按大小「或最終,」按(1)生成完整的環境報告「,該報告運行許多PowerShell命令以獲取域/廣告/交換信息,以及解析最近的備份文件等以便報告從系統可訪問性,延遲,正常運行時間,備份失敗,事件日誌內容,最近更改以及將所有內容作爲一個報告輸出。

謝謝!

+0

我只是想知道爲什麼在地球上,你會想要把額外的努力在一個(IMO)遜色平臺調用的PowerShell ?爲什麼不放棄額外的層並使用純PowerShell,直接利用.NET的強大功能以及像QAD Exhange工具這樣的很棒的cmdlets? –

+1

@AustinFrench所以在python中,我編寫了一整套網絡工具,可以讓我使用nmap進行網絡掃描/報告。我還寫了幾個XML解析器,它們讀取我的備份系統日常報告並總結錯誤。只是到了晚些時候,我才決定將某些系統(比如交換系統)作爲基準,並做一些檢查,例如「這些服務正在運行嗎?告訴我哪些服務不是?」。但是,最大的原因是我對腳本/編程不熟悉。我有一本關於Python的書,並且對它更熟悉。我已經做了一個控制檯應用程序,現在,我想擴大,也許PS l8r – Abraxas

回答

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 
+0

謝謝!看了幾個選項後,我覺得這是最好的選擇。 – Abraxas

1

你應該看織物(http://www.fabfile.org/)。

它意味着正是這些類型的任務。

希望有所幫助。