Sdílet prostřednictvím


Vytvoření omezeného prostředí runspace

Z důvodů výkonu nebo zabezpečení můžete chtít omezit příkazy Prostředí Windows PowerShell dostupné pro vaši hostitelskou aplikaci. Uděláte to tak, že vytvoříte prázdnou System.Management.Automation.Runspaces.InitialSessionState voláním metody System.Management.Automation.Runspaces.InitialSessionState.Create* a pak přidejte pouze příkazy, které chcete mít k dispozici.

Použití runspace, který načte pouze zadané příkazy, poskytuje výrazně vyšší výkon.

Metody System.Management.Automation.Runspaces.SessionStateCmdletEntry třídy slouží k definování rutin pro počáteční stav relace.

Můžete také nastavit jako soukromé příkazy. Privátní příkazy můžou používat hostitelská aplikace, ale ne uživatelé aplikace.

Přidání příkazů do prázdného prostředí Runspace

Následující příklad ukazuje, jak vytvořit prázdný InitialSessionState a přidat do něj příkazy.

namespace Microsoft.Samples.PowerShell.Runspaces
{
  using System;
  using System.Collections.ObjectModel;
  using System.Management.Automation;
  using System.Management.Automation.Runspaces;
  using Microsoft.PowerShell.Commands;
  using PowerShell = System.Management.Automation.PowerShell;

  /// <summary>
  /// This class contains the Main entry point for the application.
  /// </summary>
  internal class Runspace10b
  {
    /// <summary>
    /// This sample shows how to create an empty initial session state,
    /// how to add commands to the session state, and then how to create a
    /// runspace that has only those two commands. A PowerShell object
    /// is used to run the Get-Command cmdlet to show that only two commands
    /// are available.
    /// </summary>
    /// <param name="args">Parameter not used.</param>
    private static void Main(string[] args)
    {
      // Create an empty InitialSessionState and then add two commands.
      InitialSessionState iss = InitialSessionState.Create();

      // Add the Get-Process and Get-Command cmdlets to the session state.
      SessionStateCmdletEntry ssce1 = new SessionStateCmdletEntry(
                                                            "Get-Process",
                                                            typeof(GetProcessCommand),
                                                            null);
      iss.Commands.Add(ssce1);

      SessionStateCmdletEntry ssce2 = new SessionStateCmdletEntry(
                                                            "Get-Command",
                                                            typeof(GetCommandCommand),
                                                            null);
      iss.Commands.Add(ssce2);

      // Create a runspace.
      using (Runspace myRunSpace = RunspaceFactory.CreateRunspace(iss))
      {
        myRunSpace.Open();
        using (PowerShell powershell = PowerShell.Create())
        {
          powershell.Runspace = myRunSpace;

          // Create a pipeline with the Get-Command command.
          powershell.AddCommand("Get-Command");

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

          Console.WriteLine("Verb                 Noun");
          Console.WriteLine("----------------------------");

          // Display each result object.
          foreach (PSObject result in results)
          {
            Console.WriteLine(
                             "{0,-20} {1}",
                             result.Members["verb"].Value,
                             result.Members["Noun"].Value);
          }
        }

        // Close the runspace and release any resources.
        myRunSpace.Close();
      }

      System.Console.WriteLine("Hit any key to exit...");
      System.Console.ReadKey();
    }
  }
}

Soukromé příkazy

Příkaz můžete také nastavit jako soukromý nastavením vlastnosti System.Management.Automation.CommandInfo.Visibility vlastnost System.Management.Automation.SessionStateEntryVisibilityprivátních. Hostitelská aplikace a další příkazy můžou tento příkaz volat, ale uživatel aplikace nemůže. V následujícím příkladu je příkaz Get-ChildItem privátní.

defaultSessionState = InitialSessionState.CreateDefault();
commandIndex = GetIndexOfEntry(defaultSessionState.Commands, "Get-ChildItem");
defaultSessionState.Commands[commandIndex].Visibility = SessionStateEntryVisibility.Private;

this.runspace = RunspaceFactory.CreateRunspace(defaultSessionState);
this.runspace.Open();

Viz také

vytvoření InitialSessionState