Udostępnij za pośrednictwem


Tworzenie ograniczonego obszaru działania

Ze względu na wydajność lub bezpieczeństwo możesz ograniczyć polecenia programu Windows PowerShell dostępne dla aplikacji hosta. W tym celu należy utworzyć pustą System.Management.Automation.Runspaces.InitialSessionState, wywołując System.Management.Automation.Runspaces.InitialSessionState.Create* metody, a następnie dodaj tylko potrzebne polecenia.

Użycie przestrzeni uruchomieniowej, która ładuje tylko określone polecenia, zapewnia znacznie lepszą wydajność.

Metody klasy System.Management.Automation.Runspaces.SessionStateCmdletEntry służą do definiowania poleceń cmdlet dla stanu początkowej sesji.

Możesz również tworzyć polecenia prywatne. Prywatne polecenia mogą być używane przez aplikację hosta, ale nie przez użytkowników aplikacji.

Dodawanie poleceń do pustej przestrzeni uruchomieniowej

W poniższym przykładzie pokazano, jak utworzyć pusty element InitialSessionState i dodać do niego polecenia.

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

Wykonywanie poleceń prywatnych

Możesz również utworzyć polecenie prywatne, ustawiając jej właściwość System.Management.Automation.CommandInfo.Visibility na System.Management.Automation.SessionStateEntryVisibilityprivate. Aplikacja hosta i inne polecenia mogą wywoływać to polecenie, ale użytkownik aplikacji nie może. W poniższym przykładzie polecenie Get-ChildItem jest prywatne.

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

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

Zobacz też

tworzenie InitialSessionState