1

既に作成された powershell スクリプトを C# GUI クライアントでラップしようとしています。

スクリプトはユーザーからの入力に従って動作し、それらに応じて出力も行います。

PowerShell の出力を取得して C# クライアントに表示し、選択に従って入力を入力したいと考えています。

これは私のスクリプトであり、以下のコードは私が思いついたものですが、機能しません。(出力は最後にしか取得できず、PowerShell スクリプトに Read-Host がない場合にのみ取得できます)。それが何らかの形で役立つことを願っています。

Write-Host
Write-Host 'Hello World!'
Write-Host "Good-bye World! `n"

$option = Read-Host "Please enter your number"

switch ($option){
  "1"
  {
    Write-Host "jack"
  }
  "2"
  {
    Write-Host "john"
  }
  "3"
  {
    Write-Host "joe"
  }
}

public void WrapPowerShell()
{
        string directory = Directory.GetCurrentDirectory();

        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = @"powershell.exe";
        startInfo.Arguments = string.Format(@"& '{0}'", directory + @"\hello.ps1");
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = false;
        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();



        string output = process.StandardOutput.ReadToEnd();
        // Assert.IsTrue(output.Contains("StringToBeVerifiedInAUnitTest"));

        string errors = process.StandardError.ReadToEnd();
  }

ご回答ありがとうございます。

4

1 に答える 1

0

これは、PowerShell スクリプトを実行できる ASP.NET Web アプリを作成するために作成したヘルパー クラスです。

PSHelper.cs

using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Text;

namespace admin_scripts {
  public class PSHelper {
    // See the _ps_user_lookup method for demonstration of using this method
    public static Runspace new_runspace() {
      InitialSessionState init_state = InitialSessionState.CreateDefault();
      init_state.ThreadOptions = PSThreadOptions.UseCurrentThread;
      init_state.ImportPSModule(new[] { "ActiveDirectory", "C:\\ps_modules\\disable_user.psm1" });  
                                     // Custom  PS module containing functions related
                                     // to disabling AD accounts at work.
                                     // You would use your own module here, obviously.
      return RunspaceFactory.CreateRunspace(init_state);
    }

    // This method is for dead-simple scripts that you only want text output from
    // Not as flexible as the previous method, but it's good for the really simple cases
    public static string run_simple_script( string body ) {
      Runspace runspace = new_runspace();
      runspace.Open();

      Pipeline pipeline = runspace.CreatePipeline();
      pipeline.Commands.AddScript(body);
      pipeline.Commands.Add("Out-String");

      Collection<PSObject> output = pipeline.Invoke();
      runspace.Close();

      StringBuilder sb = new StringBuilder();
      foreach( PSObject line in output ) {
        sb.AppendLine(line.ToString());
      }
      return sb.ToString();
    }
  }
}

次のように、ASP.NET ハンドラーからスクリプトを呼び出します。

private PSObject _ps_user_lookup( string id_param ) {
  Runspace runspace = PSHelper.new_runspace();
  runspace.Open();
  using( Pipeline pipe = runspace.CreatePipeline() ) {
    Command cmd = new Command("Get-ADUser");
    cmd.Parameters.Add(new CommandParameter("Identity", id_param));
    cmd.Parameters.Add(new CommandParameter("Properties", "*"));
    cmd.Parameters.Add(new CommandParameter("Server", "REDACTED"));
    pipe.Commands.Add(cmd);
    return pipe.Invoke().FirstOrDefault();
  }
}

この構成の真の利点は、Web アプリケーションが Web ユーザーのドメイン アカウントの資格情報を使用してスクリプトを実行することです。お役に立てば幸いです。

于 2013-05-22T14:45:09.473 に答える