Skapa ett begränsat körningsutrymme

Av prestanda- eller säkerhetsskäl kanske du vill begränsa de Windows PowerShell tillgängliga kommandona för värdprogrammet. Om du vill göra detta skapar du en tom System.Management.Automation.Runspaces.Initialsessionstate genom att anropa metoden System.Management.Automation.Runspaces.Initialsessionstate.Create* och sedan bara lägga till de kommandon som du vill ha tillgängliga.

Om du använder ett runspace som endast läser in de kommandon som du anger får du betydligt bättre prestanda.

Du använder metoderna i klassen System.Management.Automation.Runspaces.Sessionstatecmdletentry för att definiera cmdletar för det inledande sessionstillståndet.

Du kan också göra kommandon privata. Privata kommandon kan användas av värdprogrammet, men inte av programmets användare.

Lägga till kommandon i ett tomt runspace

I följande exempel visas hur du skapar en tom InitialSessionState och lägger till kommandon i den.

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

Göra kommandon privata

Du kan också göra ett kommando privat genom att ange egenskapen System.Management.Automation.Commandinfo.Visibility till System.Management.Automation.SessionStateEntryVisibility Private. Värdprogrammet och andra kommandon kan anropa det kommandot, men inte programmets användare. I följande exempel är kommandot 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();

Se även

Skapa en InitialSessionState