2012-03-22 10 views
1

リモートマシン上のPS1スクリプトを別のリモートマシンとC#ランスペースを介して実行する必要があります。C#ランスペース内の別のリモートサーバー上でリモートパワーシェルスクリプトを実行

私が作成しているサービスは、サーバーAにあります。以下の方法でサーバーBにリモートランスペースを作成します。私はrunspaceを介してサーバーBのサーバーCに存在するスクリプトを呼び出そうとしています。役立つならば、現在のサーバーAはサーバーCですが、いつもそうなることは保証されていません。

internal Collection<PSObject> RunRemoteScript(string remoteScript, string remoteServer, string scriptName, out bool scriptSuccessful) 
    { 
     bool isLocal = (remoteServer == "localhost" || remoteServer == "127.0.0.1" || remoteServer == Environment.MachineName); 

     WSManConnectionInfo connectionInfo = null; 

     if (!isLocal) 
     { 
      connectionInfo = new WSManConnectionInfo(new Uri("http://" + remoteServer + ":5985")); 
     } 

     PsHostImplementation myHost = new PsHostImplementation(scriptName); 

     using (Runspace remoteRunspace = (isLocal ? RunspaceFactory.CreateRunspace(myHost) : RunspaceFactory.CreateRunspace(myHost, connectionInfo))) 
     { 
      remoteRunspace.Open(); 
      using (PowerShell powershell = PowerShell.Create()) 
      { 
       powershell.Runspace = remoteRunspace; 

       Pipeline pipeline = remoteRunspace.CreatePipeline(); 

       pipeline.Commands.AddScript(remoteScript); 

       Collection<PSObject> results = pipeline.Invoke(); 

       remoteRunspace.Close(); 

       scriptSuccessful = myHost.ScriptSuccessful; 
       return results; 
      } 
     } 
    } 

「remoteScript」私が実行したいPowerShellスクリプトに設定されています:

は、ここで私は、リモート呼び出しを行うために使用している方法です。

"& \"\\\\remoteserveraddress\\PathToScript\\Install.ps1\" -Parameter;Import-Module Modulename;CustomCommand-FromModule -parameter(s) -ErrorAction stop" 

私は私が上でスクリプトを実行するリモートマシン上だ場合は、PowerShellコンソールに私は、次のコマンドを与えることができます:たとえば

& "\\remoteserverC\PathToScript\Install.ps1" -Parameter 

しかし、これは単に拒否する私がc#runspaceでそれを実行しようとすると私のために働きます。

私が「remoteScript」パラメータとして以下に送信する場合:

"& \"\\\\remoteserverC\\PathToScript\\Install.ps1\" -Parameter" 

私は次のエラーを取得する:

The term '\remoteserverC\PathToScript\Install.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

私はと「&」なしとして試してみましたパラメータなし。私はすでに "\\ remoteserver \ ... \ Install.ps1"の代わりにリモートマシン "c:\ ... \ Install.ps1"に直接存在するスクリプトを呼び出すことができますが、リモートスクリプトを直接呼び出す。

私はgoogleの多くのページとここでstackoverflowを検索しましたが、私はこの問題を克服するのに役立つものは何も見つかりませんでした。どんな助けもありがとう!ありがとう!

+0

Install.ps1の内容は何ですか? – Kiquenet

+1

@Kiquenet基本的に環境を設定し、他のスクリプトが使用できるようにモジュールをロードします。 以下の私の解決策と同じドライブマッピングチェックを行い、ステージング環境からファイルをサーバーにコピーし、アンインストール(存在する場合)してモジュールを再インストールします。次に、モジュールをインポートします。 – Arangarx

答えて

2

これは決して直接的には機能しませんでした。リモートで作業しているときにUNCアドレスを使用して3台目のマシンにアクセスできないセキュリティ機能のようです。私はしかし、私のために素晴らしい仕事の回避策を見つけることができました。

\\ server \ shareアドレスを直接呼び出す代わりに、スクリプトを実行しているマシン上のネットワークドライブを、スクリプトを持つマシン上の共有に動的にマップします。 (Aから遠隔実行、B上のドライブをC上の共有にマップする)。それから私はそのドライブを介してスクリプトを呼び出すと、それは魅力のように動作します。

"$net = new-object -ComObject WScript.Network;" + 
"if(!($net.EnumNetworkDrives() -contains \"S:\"))" + 
    "{Write-Host \"S: Drive Not Currently Mapped. Mapping to \\\\" + RemoteServerC + "\\Share.\";" + 
    "$net.MapNetWorkDrive(\"S:\",\"\\\\" + RemoteServerC + "\\Share\",$false,\"username\",\"password\")};" + 
"Get-PSDrive | Write-Verbose;" + 
"& \"S:\\PathToScript\\Install.ps1\" -noPrompt;" 

RemoteServerC

は、ユーザーの設定ファイルで定義されている、私はそれを渡す変数です:この文字列は、私は上記のRunRemoteScriptメソッドに渡すものです。誰もがそれを必要とする場合ここで

はあなたが前に設定するか、または単にハードコーディングする必要があると思いPowerShellの変数とRemoteServerCを交換する(ちょうどPowerShellのスクリプトと同じコードです:

$net = new-object -ComObject WScript.Network 
if(!($net.EnumNetworkDrives() -contains "S:")) 
{ Write-Host "S: Drive Not Currently Mapped. Mapping to \\remoteserverC\Share." 
    $net.MapNetWorkDrive("S:","\\remoteserverC\Share",$false,"username","password") 
} 
Get-PSDrive | Write-Verbose 
& "S:\\PathToScript\\Install.ps1\" -noPrompt;" 

最初に私がするオブジェクトを設定しますドライブをマップすることができます。次に、リモートマシンにマップされている「s」ドライブがすでに存在するかどうかを確認します。そうでない場合は、このサービスを実行するためにアクティブディレクトリに設定した名前とパスワードを使用して、リモートマシン上の "s"ドライブに共有をマップします。

PowerShellで使用可能なドライブのリストを強制的にリロードするように見えるため、Get-PSDriveコマンドが含まれていました。これは、PowerShellセッションでこれを実行しようとするときに初めて問題になりそうです(そして、シャープで、本当に必要かどうか分かりませんが、安全にするために含めました)。明らかに、PowerShellは、MapNetworkDriveを使用する場合に作成された同じセッションでドライブ追加を認識しません。

関連する問題