about_Language_Modes

Descrizione breve

Illustra le modalità del linguaggio e il relativo effetto sulle sessioni di PowerShell.

Descrizione lunga

La modalità del linguaggio di una sessione di PowerShell determina quali elementi del linguaggio di PowerShell possono essere usati nella sessione.

PowerShell supporta le modalità di linguaggio seguenti:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (introdotto in PowerShell 3.0)
  • NoLanguage

Che cos'è una modalità del linguaggio?

La modalità lingua determina gli elementi del linguaggio consentiti nella sessione.

La modalità del linguaggio è una proprietà della configurazione della sessione (o "endpoint") usata per creare la sessione. Tutte le sessioni che usano una configurazione di sessione specifica hanno la modalità della lingua della configurazione della sessione.

Tutte le sessioni di PowerShell hanno una modalità di linguaggio. Le sessioni vengono create usando le configurazioni di sessione nel computer di destinazione. La modalità lingua impostata nella configurazione della sessione determina la modalità di lingua della sessione. Per specificare la configurazione di sessione di una sessione PSSession, usare il parametro ConfigurationName dei cmdlet che creano una sessione.

A partire da PowerShell 7.3, è possibile eseguire pwsh con il parametro ConfigurationFile . In questo modo è possibile avviare PowerShell usando una configurazione specifica.

Individuazione della modalità di linguaggio di una sessione

È possibile trovare la modalità di linguaggio di una FullLanguage sessione o ConstrainedLanguage recuperando il valore della proprietà LanguageMode dello stato della sessione.

Ad esempio:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

Tuttavia, nelle sessioni con RestrictedLanguage e NoLanguage modalità non è possibile usare l'operatore di accesso ai membri (.) per ottenere i valori delle proprietà. Il messaggio di errore rivela invece la modalità lingua.

Quando si esegue il $ExecutionContext.SessionState.LanguageMode comando in una RestrictedLanguage sessione, PowerShell restituisce i messaggi di errore PropertyReferenceNotSupportedInDataSection e VariableReferenceNotSupportedInDataSection .

  • PropertyReferenceNotSupportedInDataSection: i riferimenti alle proprietà non sono consentiti in modalità lingua limitata o in una sezione Dati.
  • VariableReferenceNotSupportedInDataSection: variabile a cui non è possibile fare riferimento in modalità linguaggio con restrizioni o viene fatto riferimento a una sezione Dati.

Quando si esegue il $ExecutionContext.SessionState.LanguageMode comando in una NoLanguage sessione, PowerShell restituisce il messaggio di errore ScriptsNotAllowed .

  • ScriptsNotAllowed: la sintassi non è supportata da questo spazio di esecuzione. Questo potrebbe essere dovuto al fatto che è in modalità senza linguaggio.

Individuazione della modalità lingua di una configurazione di sessione

Quando viene creata una configurazione di sessione usando un file di configurazione della sessione, la configurazione della sessione ha una proprietà LanguageMode . È possibile trovare la modalità lingua ottenendo il valore della proprietà LanguageMode .

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

In altre configurazioni di sessione è possibile trovare indirettamente la modalità lingua individuando la modalità lingua di una sessione creata usando la configurazione della sessione.

Impostazione della modalità lingua

La modalità del linguaggio in una sessione di PowerShell può essere impostata tramite la variabile predefinita $ExecutionContext .

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

Tuttavia, questa operazione è utile solo per sperimentare le modalità del linguaggio. Le modalità del linguaggio sono destinate a fornire una maggiore sicurezza alle sessioni di PowerShell per contesti specifici.

Le modalità di linguaggio vengono impostate quando si usano criteri di controllo delle applicazioni di sistema o si crea una configurazione di sessione.

Uso di criteri di controllo delle applicazioni di sistema

PowerShell viene eseguito automaticamente in ConstrainedLanguage modalità quando è in esecuzione con criteri di controllo delle applicazioni di sistema. I criteri di controllo delle applicazioni rilevati sono AppLocker e Windows Defender Application Control (WDAC) nelle piattaforme Windows.

PowerShell applica altre restrizioni oltre alle modalità del linguaggio quando rileva un criterio di controllo delle applicazioni. Ad esempio, esistono restrizioni aggiuntive per l'importazione di dot-sourcing e moduli in un criterio.

Quando una sessione di PowerShell viene avviata con un criterio, viene eseguita in ConstrainedLanguage modalità . A partire da PowerShell 7.4, la visualizzazione del banner di avvio include un messaggio che indica che è in esecuzione in tale modalità. In questo modo gli utenti possono avere un'esperienza interattiva della shell utilizzabile, l'esecuzione di cmdlet e comandi nativi, nonché l'accesso agli elementi del linguaggio di base. Tuttavia, l'utente non può accedere a PowerShell, .NET o API COM che potrebbero essere abusate da un attore malintenzionato.

Qualsiasi script o modulo basato su script eseguito in questa sessione viene eseguito in ConstrainedLanguage modalità . Tuttavia, qualsiasi modulo basato su script o script consentito dai criteri viene eseguito in FullLanguage modalità senza vincoli. In questo modo, un sistema bloccato dai criteri può avere script considerati attendibili dai criteri ed eseguiti con pochi vincoli.

Uso di una configurazione di sessione

La comunicazione remota di PowerShell supporta facoltativamente la creazione di configurazioni di sessione personalizzate. È possibile impostare la modalità lingua desiderata per la configurazione personalizzata. Le configurazioni JEA (Just Enough Administration) di PowerShell usano NoLanguage la modalità per limitare le sessioni solo alle chiamate ai comandi. Con JEA, la sessione remota può essere limitata a utenti specifici. Gli utenti JEA sono limitati all'esecuzione di un set definito di comandi e non possono accedere direttamente alle API, al file system o ad altre risorse di sistema.

Per altre informazioni, vedere Configurazioni di sessione JEA e New-PSSessionConfigurationFile.

Funzionalità e limitazioni della modalità del linguaggio

Questa sezione descrive le modalità del linguaggio nelle sessioni di PowerShell.

FullLanguage modo

La FullLanguage modalità consente tutti gli elementi del linguaggio nella sessione. FullLanguage è la modalità lingua predefinita per le sessioni predefinite in tutte le versioni di Windows.

RestrictedLanguage modo

In RestrictedLanguage modalità gli utenti possono eseguire comandi (cmdlet, funzioni, comandi CIM e flussi di lavoro), ma non possono usare blocchi di script. Questa modalità viene usata anche per elaborare i manifesti dei moduli caricati da Import-Module.

A partire da PowerShell 7.2, il cmdlet è disabilitato in RestrictedLanguage modalità quando è configurato il New-Object blocco del sistema.

Per impostazione predefinita, in modalità sono consentite RestrictedLanguage solo le variabili seguenti:

  • $PSCulture
  • $PSUICulture
  • $True
  • $False
  • $Null

I manifesti del modulo vengono caricati in RestrictedLanguage modalità e possono usare queste variabili aggiuntive:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Qualsiasi variabile di ambiente, ad esempio $ENV:TEMP

Sono consentiti solo gli operatori di confronto seguenti:

  • -eq (uguale)
  • -gt (maggiore di)
  • -lt (minore di)

Le istruzioni di assegnazione, i riferimenti alle proprietà e le chiamate ai metodi non sono consentite.

ConstrainedLanguage modo

ConstrainedLanguage la modalità è progettata per consentire elementi del linguaggio di base, ad esempio cicli, condizionali, espansione di stringhe e accesso alle proprietà degli oggetti. Le restrizioni impediscono operazioni che potrebbero essere abusate da un attore malintenzionato.

La ConstrainedLanguage modalità consente tutti i cmdlet e un subset di elementi del linguaggio di PowerShell, ma limita i tipi di oggetto che possono essere usati.

Le funzionalità della ConstrainedLanguage modalità sono le seguenti:

  • Tutti i cmdlet nei moduli di Windows sono completamente funzionali e dispongono dell'accesso completo alle risorse di sistema, ad eccezione di quanto indicato.
  • Tutti gli elementi del linguaggio di scripting di PowerShell sono consentiti.
  • Tutti i moduli inclusi in Windows possono essere importati e tutti i comandi che i moduli esportano vengono eseguiti nella sessione.
  • Il Add-Type cmdlet può caricare assembly firmati, ma non può caricare codice C# arbitrario o API Win32.
  • Il New-Object cmdlet può essere usato solo sui tipi consentiti (elencati di seguito).
  • In PowerShell possono essere usati solo i tipi consentiti. Altri tipi non sono consentiti. La conversione dei tipi è consentita, ma solo quando il risultato è un tipo consentito.
  • I parametri dei cmdlet che converteno l'input stringa in tipi funzionano solo quando il tipo risultante è un tipo consentito.
  • È possibile richiamare il ToString() metodo e i metodi .NET dei tipi consentiti.
  • Gli utenti possono ottenere tutte le proprietà dei tipi consentiti. Gli utenti possono impostare i valori delle proprietà solo sui tipi consentiti.

I tipi .NET seguenti sono consentiti in ConstrainedLanguage modalità . Gli utenti possono ottenere proprietà, richiamare metodi e convertire oggetti in questi tipi.

Tipi consentiti:

  • [adsi]
  • [adsisearcher]
  • [Alias]
  • [AllowEmptyCollection]
  • [AllowEmptyString]
  • [AllowNull]
  • [ArgumentCompleter]
  • [ArgumentCompletions]
  • [array]
  • [bigint]
  • [bool]
  • [byte]
  • [char]
  • [cimclass]
  • [cimconverter]
  • [ciminstance]
  • [CimSession]
  • [cimtype]
  • [CmdletBinding]
  • [cultureinfo]
  • [datetime]
  • [decimal]
  • [double]
  • [DscLocalConfigurationManager]
  • [DscProperty]
  • [DscResource]
  • [ExperimentAction]
  • [Experimental]
  • [ExperimentalFeature]
  • [float]
  • [guid]
  • [hashtable]
  • [int]
  • [int16]
  • [int32]
  • [int64]
  • [ipaddress]
  • [IPEndpoint]
  • [long]
  • [mailaddress]
  • [Microsoft.PowerShell.Commands.ModuleSpecification]
  • [NoRunspaceAffinity]
  • [NullString]
  • [Object[]]
  • [ObjectSecurity]
  • [ordered]
  • [OutputType]
  • [Parameter]
  • [PhysicalAddress]
  • [pscredential]
  • [pscustomobject]
  • [PSDefaultValue]
  • [pslistmodifier]
  • [psobject]
  • [psprimitivedictionary]
  • [PSTypeNameAttribute]
  • [ref]
  • [regex]
  • [sbyte]
  • [securestring]
  • [semver]
  • [short]
  • [single]
  • [string]
  • [SupportsWildcards]
  • [switch]
  • [timespan]
  • [uint]
  • [uint16]
  • [uint32]
  • [uint64]
  • [ulong]
  • [uri]
  • [ushort]
  • [ValidateCount]
  • [ValidateDrive]
  • [ValidateLength]
  • [ValidateNotNull]
  • [ValidateNotNullOrEmpty]
  • [ValidateNotNullOrWhiteSpace]
  • [ValidatePattern]
  • [ValidateRange]
  • [ValidateScript]
  • [ValidateSet]
  • [ValidateTrustedData]
  • [ValidateUserDrive]
  • [version]
  • [void]
  • [WildcardPattern]
  • [wmi]
  • [wmiclass]
  • [wmisearcher]
  • [X500DistinguishedName]
  • [X509Certificate]
  • [xml]

Sono consentiti solo i tipi di oggetto COM seguenti:

  • Scripting.Dictionary
  • Scripting.FileSystemObject
  • VBScript.RegExp

NoLanguage modo

La modalità PowerShell NoLanguage disabilita completamente il linguaggio di scripting di PowerShell. Non è possibile eseguire script o usare variabili. È possibile eseguire solo comandi e cmdlet nativi.

A partire da PowerShell 7.2, il cmdlet è disabilitato in NoLanguage modalità quando è configurato il New-Object blocco del sistema.

Vedi anche