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

Z důvodu výkonu nebo zabezpečení můžete chtít omezit Windows PowerShell příkazy dostupné pro hostitelskou aplikaci. Chcete-li to provést, vytvořte prázdnou metodu System.Management.Automation.Runspaces.Initialsessionstate zavolání metody System.Management.Automation.Runspaces.Initialsessionstate.Create* a pak přidáte pouze příkazy, které chcete mít k dispozici.

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

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

Příkazy můžete také nastavit jako soukromé. Soukromé příkazy může používat hostitelská aplikace, ale ne uživatelé aplikace.

Přidání příkazů do prázdného runspace

Následující příklad ukazuje, jak vytvořit prázdný objekt 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();
    }
  }
}

Vytváření příkazů jako soukromých

Příkaz můžete také nastavit jako soukromý nastavením jeho vlastnosti System.Management.Automation.Commandinfo.Visibility na System.Management.Automation.SessionStateEntryVisibility Private. Hostitelská aplikace a další příkazy mohou tento příkaz volat, ale uživatel aplikace ho nemůže volat. 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í objektu InitialSessionState