Share via


Erstellen eines eingeschränkten Runspaces

Aus Leistungs- oder Sicherheitsgründen sollten Sie die für Ihre Hostanwendung verfügbaren Windows PowerShell Befehle einschränken. Hierzu erstellen Sie eine leere System.Management.Automation.Runspaces.Initialsessionstate,indem Sie die Methode System.Management.Automation.Runspaces.Initialsessionstate.Create* aufrufen und dann nur die Befehle hinzufügen, die Verfügbar sein sollen.

Die Verwendung eines Runspace, der nur die von Ihnen angegebenen Befehle lädt, bietet eine deutlich verbesserte Leistung.

Sie verwenden die Methoden der System.Management.Automation.Runspaces.Sessionstatecmdletentry-Klasse, um Cmdlets für den anfänglichen Sitzungszustand zu definieren.

Sie können Befehle auch privat machen. Private Befehle können von der Hostanwendung, aber nicht von Benutzern der Anwendung verwendet werden.

Hinzufügen von Befehlen zu einem leeren Runspace

Im folgenden Beispiel wird veranschaulicht, wie Sie einen leeren InitialSessionState erstellen und ihm Befehle hinzufügen.

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();
    }
  }
}

Privates Erstellen von Befehlen

Sie können einen Befehl auch privat machen, indem Sie die Eigenschaft System.Management.Automation.Commandinfo.Visibility auf System.Management.Automation.SessionStateEntryVisibility Private festlegen. Die Hostanwendung und andere Befehle können diesen Befehl aufrufen, der Benutzer der Anwendung jedoch nicht. Im folgenden Beispiel ist der Befehl Get-ChildItem privat.

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

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

Weitere Informationen

Erstellen von InitialSessionState