Creazione di uno spazio di esecuzione vincolatoCreating a constrained runspace

Per motivi di prestazioni o sicurezza, potrebbe essere necessario limitare i comandi di Windows PowerShell disponibili per l'applicazione host.For performance or security reasons, you might want to restrict the Windows PowerShell commands available to your host application. A tale scopo, è necessario creare una System.Management.Automation.Runspaces.Initialsessionstate vuota chiamando il System.Management.Automation.Runspaces.Initialsessionstate. Create * Method, quindi aggiungere solo i comandi che si desidera siano disponibili.To do this you create an empty System.Management.Automation.Runspaces.Initialsessionstate by calling the System.Management.Automation.Runspaces.Initialsessionstate.Create* method, and then add only the commands you want available.

L'uso di un spazio che carica solo i comandi specificati fornisce prestazioni significativamente migliorate.Using a runspace that loads only the commands that you specify provides significantly improved performance.

Usare i metodi della classe System. Management. Automation. Runspaces. Sessionstatecmdletentry per definire i cmdlet per lo stato della sessione iniziale.You use the methods of the System.Management.Automation.Runspaces.Sessionstatecmdletentry class to define cmdlets for the initial session state.

È anche possibile rendere privati i comandi.You can also make commands private. I comandi privati possono essere usati dall'applicazione host, ma non dagli utenti dell'applicazione.Private commands can be used by the host application, but not by users of the application.

Aggiunta di comandi a un spazio vuotoAdding commands to an empty runspace

Nell'esempio seguente viene illustrato come creare un InitialSessionState vuoto e aggiungervi comandi.The following example demonstrates how to create an empty InitialSessionState and add commands to it.

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

Creazione di comandi privatiMaking commands private

È anche possibile impostare un comando come privato, impostando la proprietà System. Management. Automation. CommandInfo. Visibility su System. Management. Automation. SessionStateEntryVisibility private.You can also make a command private, by setting it's System.Management.Automation.Commandinfo.Visibility property to System.Management.Automation.SessionStateEntryVisibility Private. L'applicazione host e altri comandi possono chiamare tale comando, ma l'utente dell'applicazione non può.The host application and other commands can call that command, but the user of the application cannot. Nell'esempio seguente il comando Get-ChildItem è privato.In the following example, the Get-ChildItem command is private.

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

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

Vedere ancheSee Also

Creazione di un InitialSessionStateCreating an InitialSessionState