2017-03-10 319 views
1

我已經找了幾個星期,並有其他人研究/ /我,但我還沒有找到答案。遠程服務器上執行遠程PowerShell腳本

我有一個腳本,位於服務器1上,需要使用某些憑據在服務器1上執行。最終的解決方案將有助於解密文件。該腳本必須作爲特定用戶在特定服務器上執行,因爲密鑰對位於該服務器上的用戶密鑰環中。

我希望從服務器2調用腳本作爲更大進程的一部分。服務器2具有它具有以下流SQL作業:

  1. 步驟的作業1使用PowerShell腳本下載
  2. 工作的第2步需要執行服務器上的1腳本解密文件文件(**這是我在這裏談論的步驟)
  3. 作業的第3步將運行powershell腳本來檢查文件屬性(上次寫入日期,與昨天相比的文件大小等)
  4. 步驟4的作業將恢復日誌文件

服務器1上的腳本在本地運行時沒有任何問題,併產生預期的結果。當試圖讓服務器2在服務器1上執行腳本時,我沒有取得任何成功。爲了儘可能簡單地找出哪些實際上不起作用,我想出了一套簡單的腳本(見下文)。

  • 當我在服務器1上運行腳本1(文件在物理上存在的位置)時,它的 工作正常。文本文件由文件中的「hello world」生成。
  • 當我在服務器2上運行腳本2(我沒有保存文件, 只是在ISE窗口中運行它),它運行時沒有錯誤或警告, 但應寫入的文件不存在服務器1(也不在 服務器2 - 不是它應該但我檢查無論如何)。

我不是任何類型的PowerShell導師 - 所以我現在很抱歉,如果這是一個非常明顯的事情。 :)

#------------------------------------- 
# script 1 
# this script lives on server 1 
# file name: c:\deleteme\helloworld2.ps1 

$CMD = Invoke-Expression " `"hello world`" >> C:\deleteme\helloworld.txt" 
Invoke-Command -ScriptBlock { $CMD } 



#------------------------------------- 
# script 2 
# this script is executed on server 2 and attempts to execute the script on server 1 

$session = New-PSSession -ComputerName "SERVER01.lahcg.com" #-Credential $username 


$CMD = "Invoke-Command -ScriptBlock { powershell.exe `"C:\deleteme\helloworld2.ps1`" } " 
#write-output $CMD 
Invoke-Command -Session $session -ScriptBlock { $CMD } 

Remove-PSSession $session 

環境信息:

  • 服務器1:在Windows Server 2008 R2標準使用PowerShell 2
  • 服務器2:在Windows Server 2012 R2數據中心使用PowerShell 4

額外筆記

  • 我確實有啓用遠程設置好了......我在研究之前發現了這一點。
  • 我使用不同版本的Powershell,但由於服務器1上的腳本本地運行正常,因此我不認爲這是一個問題。
  • 我已經獲得憑證部分來處理另一個腳本 - 所以我不在此帖中詢問。我把它留在腳本中,註釋掉以供參考。
+1

'調用命令-Session $會議-ScriptBlock {使用調用-表達$:CMD}' – BenH

+0

我做了這一變化,並在服務器1中的腳本沒有執行(不創建的文本文件)。我必須爲invoke-expression部分添加雙引號才能工作,但這不應改變您所談論的內容。它成功運行且沒有錯誤,但文本文件未創建。 –

回答

1

BenH是正確的。你有兩個選擇。您可以使用

  1. 調用命令執行{代碼塊}
  2. 連接-PSSession可連接到電腦作爲給定用戶

調用命令是做的更快的方法因爲它自動建立一個PSSession,執行代碼,然後把它撕下來。問題在於它不允許你控制哪個用戶建立會話。爲此,您必須自己構建會話,然後告訴Invoke-Command將使用哪個會話。因此,嘗試這樣的事情:

  1. 從:服務器 $證書= GET-憑證#這可以編寫腳本,而不是提示。去谷歌上查詢。
  2. 從:服務器新PSSesssion -ComputerName Server1的-Credential $證書
  3. 從:服務器現在,您可以連接到會議並啓動你的代碼,或者使用調用命令只推一個命令到會話:
    1. 連接-PSSession將-Session(GET-的PSSession)
    2. 調用命令-Session(獲取會話)-ScriptBlock {C:/script1.ps1}
+0

我很欣賞這個迴應。我創建一個會話,你在步驟2中提到我的步驟3中的不同之處在於,最終運行腳本是不是本地服務器1.在步驟3中,這將需要腳本本地服務器1,正確的?原因是,當我傳遞文件名與之合作時,我無法正確解析文件名和路徑。我已經嘗試了所有我發現的與逃逸和雙斜槓等,但沒有成功。如果我有腳本生命並在服務器2上運行,那麼稍後進行故障排除似乎是一個更簡單的過程。 –

+0

所以這聽起來像一個語法問題?不是一個遠程問題?請列出您正在嘗試的命令。 –

+0

我改劇本2如下:調用命令-Session $會議-ScriptBlock { 「援引-表達{使用$:CMD}」 –

相關問題