Erstellen eines eingeschränkten Runspaces
Aus Leistungs- oder Sicherheitsgründen sollten Sie die windows PowerShell-Befehle einschränken, die für Ihre Hostanwendung verfügbar sind. Dazu erstellen Sie eine leere System.Management.Automation.Runspaces.InitialSessionState durch Aufrufen der System.Management.Automation.Runspaces.InitialSessionState.Create* Methode, und fügen Sie dann nur die gewünschten Befehle hinzu.
Wenn Sie einen Runspace verwenden, 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 ihr 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();
}
}
}
Private Befehle erstellen
Sie können einen Befehl auch privat machen, indem Sie ihn System.Management.Automation.CommandInfo.Visibility- Eigenschaft auf System.Management.Automation.SessionStateEntryVisibilityPrivatefestlegen. Die Hostanwendung und andere Befehle können diesen Befehl aufrufen, der Benutzer der Anwendung kann 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();