2017-03-10 12 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 - それは必要ではありませんが、とにかく確認するためにチェックしました)。

私はどのような種類の力士達でもありません - それは非常に明白なことであれば、今私は謝罪します。 :)

#------------------------------------- 
# 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:PowerShellの2でのWindows Server 2008 R2の標準
  • サーバー2:のWindows Server PowerShellの4と

エキストラ2012 R2 Datacenterのノート

  • 私は可能なリモートセットOKを持っています...私は以前研究していたことがわかりました。
  • 私はPowershellの異なるバージョンを使用していますが、サーバー1のスクリプトがローカルでokを実行しているため、問題ではないと思いました。
  • 私は別のスクリプトで作業するための資格を取得しました。だから私はこの投稿でそれについて質問していません。私はスクリプトに残し、参考にしてコメントアウトしました。
+1

Invoke-Commandセッション$セッション-ScriptBlock {Invoke-Expression $ using:CMD} ' – BenH

+0

この変更を行い、サーバー1のスクリプトは実行されませんでした(テキストファイルは作成されませんでした)。 invoke-expression部分を二重引用符で囲む必要がありましたが、それはあなたが話している内容を変えるべきではありません。エラーなしで正常に実行されましたが、テキストファイルは作成されませんでした。 –

答えて

1

BenHです。あなたには2つの選択肢があります。あなたは、Invoke-Commandコマンドを実行するより高速な方法である

与えられたユーザーとしてコンピュータに接続するには、{コードブロック}

  • 接続-PSSessionコマンドを実行するために

    1. Invoke-Commandコマンドを使用しますかそれは自動的にPSSessionを確立し、コードを実行してから、それを破棄します。問題は、どのユーザーがセッションを確立するかを制御することができないことです。そのためには、セッションを自分で構築し、使用するセッションをInvoke-Commandに伝える必要があります。・資格取得#これは、スクリプトではなく促すことができる= Server2の $資格情報:

      1. から:だから、このような何かを試してみてください。それはGoogleです。
      2. から:Server2の新PSSesssion -ComputerNameのServer1 -Credential $資格情報から
      3. :Server2のは今、あなたは、セッションに接続し、あなたのコードを起動、または単に単一のコマンドをプッシュするために呼び出すコマンドを使用しますかセッションへ:
        1. 接続-のPSSession -Session(GET-のPSSession)
        2. Invoke-Commandコマンド-Session(取得セッション)-ScriptBlock {C:/script1.ps1}
  • +0

    私は応答を感謝します。私はステップ2で言及したようにセッションを作成しています。私のステップ3との違いは、最終的に実行されるスクリプトがサーバー1に対してローカルではないということです。ステップ3では、サーバー1のローカルスクリプト?その理由は、作業するファイル名を渡しているときに、ファイル名とパスを正しく解決できなかったためです。私はエスケープや二重スラッシュなどで見つけたすべてを試しましたが、成功しませんでした。もし私がスクリプトの寿命を持ち、サーバー2で動いていれば、それは後でトラブルシューティングするためのより簡単なプロセスだったようです。 –

    +0

    これは構文の問題のように聞こえるでしょうか?遠隔の質問ではない?あなたが今試しているコマンドをリストアップしてください。 –

    +0

    スクリプト2を次のように変更しました。Invoke-Command-Session $ session -ScriptBlock {"Invoke-Expression {$ using:CMD}"} –

    関連する問題