Creazione di uno spazio di esecuzione vincolato
Per motivi di prestazioni o di sicurezza, può essere necessario limitare i Windows PowerShell disponibili per l'applicazione host. A tale scopo, creare un oggetto System.Management.Automation.Runspaces.Initialsessionstate vuoto chiamando il metodo System.Management.Automation.Runspaces.Initialsessionstate.Create* e quindi aggiungere solo i comandi desiderati.
L'uso di uno spazio di esecuzione che carica solo i comandi specificati offre prestazioni notevolmente migliorate.
Usare i metodi della classe System.Management.Automation.Runspaces.Sessionstatecmdletentry per definire i cmdlet per lo stato iniziale della sessione.
È anche possibile rendere privati i comandi. I comandi privati possono essere usati dall'applicazione host, ma non dagli utenti dell'applicazione.
Aggiunta di comandi a uno spazio di esecuzione vuoto
L'esempio seguente illustra come creare un oggetto InitialSessionState vuoto e aggiungerne comandi.
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();
}
}
}
Rendere privati i comandi
È anche possibile rendere privato un comando impostando la proprietà System.Management.Automation.Commandinfo.Visibility su System.Management.Automation.SessionStateEntryVisibility Private. L'applicazione host e altri comandi possono chiamare tale comando, ma l'utente dell'applicazione non può chiamare tale comando. Nell'esempio seguente il comando Get-ChildItem è privato.
defaultSessionState = InitialSessionState.CreateDefault();
commandIndex = GetIndexOfEntry(defaultSessionState.Commands, "get-childitem");
defaultSessionState.Commands[commandIndex].Visibility = SessionStateEntryVisibility.Private;
this.runspace = RunspaceFactory.CreateRunspace(defaultSessionState);
this.runspace.Open();
Vedere anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per