Een beperkte runspace maken

Uit prestatie- of beveiligingsoverwegingen kunt u de beschikbare Windows PowerShell voor uw hosttoepassing beperken. Hiervoor maakt u een lege system.Management.Automation.Runspaces.Initialsessionstate door de methode System.Management.Automation.Runspaces.Initialsessionstate.Create* aan te roepen en vervolgens alleen de opdrachten toe te voegen die u beschikbaar wilt hebben.

Het gebruik van een runspace die alleen de opdrachten laadt die u opgeeft, levert aanzienlijk betere prestaties op.

U gebruikt de methoden van de klasse System.Management.Automation.Runspaces.Sessionstatecmdletentry om cmdlets te definiëren voor de initiële sessietoestand.

U kunt opdrachten ook privé maken. Persoonlijke opdrachten kunnen worden gebruikt door de hosttoepassing, maar niet door gebruikers van de toepassing.

Opdrachten toevoegen aan een lege runspace

In het volgende voorbeeld wordt gedemonstreerd hoe u een lege InitialSessionState maakt en er opdrachten aan toevoegt.

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

Opdrachten privé maken

U kunt een opdracht ook privé maken door de eigenschap System.Management.Automation.Commandinfo.Visibility in te stellen op System.Management.Automation.SessionStateEntryVisibility Private. De hosttoepassing en andere opdrachten kunnen die opdracht aanroepen, maar de gebruiker van de toepassing niet. In het volgende voorbeeld is de opdracht Get-ChildItem privé.

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

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

Zie ook

Een InitialSessionState maken