about_Language_Modes
Description courte
Explique les modes de langage et leur effet sur les sessions PowerShell.
Description longue
Le mode de langue d’une session PowerShell détermine quels éléments du langage PowerShell peuvent être utilisés dans la session.
PowerShell prend en charge les modes de langage suivants :
FullLanguage
RestrictedLanguage
ConstrainedLanguage
(introduit dans PowerShell 3.0)NoLanguage
Qu’est-ce qu’un mode linguistique ?
Le mode de langue détermine les éléments de langue autorisés dans la session.
Le mode de langage est une propriété de la configuration de session (ou « point de terminaison ») utilisée pour créer la session. Toutes les sessions qui utilisent une configuration de session particulière ont le mode de langue de la configuration de session.
Toutes les sessions PowerShell ont un mode de langage. Les sessions sont créées à l’aide des configurations de session sur l’ordinateur cible. Le mode de langue défini dans la configuration de session détermine le mode de langue de la session. Pour spécifier la configuration de session d’une session PSSession, utilisez le paramètre ConfigurationName des applets de commande qui créent une session.
Recherche du mode de langue d’une session
Vous pouvez trouver le mode de langue d’une FullLanguage
ou ConstrainedLanguage
de session en obtenant la valeur de la propriété LanguageMode de l’état de session.
Par exemple :
$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
Toutefois, dans les sessions avec RestrictedLanguage
et NoLanguage
les modes, vous ne pouvez pas utiliser l’opérateur d’accès membre (.
) pour obtenir des valeurs de propriété.
Au lieu de cela, le message d’erreur révèle le mode de langue.
Lorsque vous exécutez la $ExecutionContext.SessionState.LanguageMode
commande dans une RestrictedLanguage
session, PowerShell retourne les messages d’erreur PropertyReferenceNotSupportedInDataSection et VariableReferenceNotSupportedInDataSection .
- PropertyReferenceNotSupportedInDataSection : les références de propriété ne sont pas autorisées en mode de langage restreint ou en section Données.
- VariableReferenceNotSupportedInDataSection : variable qui ne peut pas être référencée en mode de langage restreint ou une section Données est référencée.
Lorsque vous exécutez la $ExecutionContext.SessionState.LanguageMode
commande dans une NoLanguage session, PowerShell retourne le message d’erreur ScriptsNotAllowed .
- ScriptsNotAllowed : La syntaxe n’est pas prise en charge par cet espace d’exécution. Cela peut être dû au fait qu’il est en mode sans langue.
Recherche du mode de langue d’une configuration de session
Lorsqu’une configuration de session est créée à l’aide d’un fichier de configuration de session, la configuration de session a une propriété LanguageMode . Vous pouvez trouver le mode de langue en obtenant la valeur de la propriété LanguageMode .
(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage
Sur d’autres configurations de session, vous pouvez trouver le mode de langue indirectement en recherchant le mode de langue d’une session créée à l’aide de la configuration de session.
Définition du mode de langue
Le mode de langage d’une session PowerShell peut être défini via la variable intégrée $ExecutionContext
.
$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
Toutefois, cela n’est utile que pour expérimenter les modes de langage. Les modes de langage sont destinés à fournir une sécurité ajoutée aux sessions PowerShell pour des contextes spécifiques.
Les modes de langage sont définis lorsque vous utilisez une stratégie de contrôle d’application système ou créez une configuration de session.
Utilisation d’une stratégie de contrôle d’application système
PowerShell s’exécute automatiquement en ConstrainedLanguage
mode lorsqu’il s’exécute sous une stratégie de contrôle d’application système. Les stratégies de contrôle d’application détectées sont AppLocker et Windows Defender Application Control (WDAC) sur les plateformes Windows.
PowerShell applique d’autres restrictions en plus des modes de langage lorsqu’il détecte une stratégie de contrôle d’application. Par exemple, il existe des restrictions supplémentaires pour l’approvisionnement en points et l’importation de modules dans le cadre d’une stratégie.
Lorsqu’une session PowerShell est démarrée sous une stratégie, elle s’exécute en ConstrainedLanguage
mode. Ce mode permet une expérience d’interpréteur de commandes interactive utilisable tout en limitant l’accès aux fonctionnalités et AUX API susceptibles d’être utilisées par un acteur malveillant. Les utilisateurs peuvent exécuter des applets de commande et des commandes natives et avoir accès aux éléments de langage de base. L’accès aux API PowerShell, .NET et COM est restreint.
Tout module basé sur un script ou basé sur un script exécuté dans cette session s’exécute en ConstrainedLanguage
mode. Toutefois, tout script ou module basé sur un script autorisé par la stratégie s’exécute en FullLanguage
mode sans contraintes. De cette façon, un système verrouillé par stratégie peut avoir des scripts approuvés par la stratégie et s’exécuter avec quelques contraintes.
Utilisation d’une configuration de session
La communication à distance PowerShell prend éventuellement en charge la création de configurations de session personnalisées.
Vous pouvez définir le mode de langue souhaité pour cette configuration personnalisée.
Les configurations PowerShell Just Enough Administration (JEA) utilisent NoLanguage
le mode pour limiter les sessions aux appels de commande uniquement. Avec JEA, la session à distance peut être limitée à des utilisateurs spécifiques. Les utilisateurs JEA sont limités à l’exécution d’un ensemble défini de commandes et ne peuvent pas accéder directement aux API, au système de fichiers ou à d’autres ressources système.
Pour plus d’informations, consultez configurations de session JEA et New-PSSessionConfigurationFile.
Fonctionnalités et limitations du mode langage
Cette section décrit les modes de langage dans les sessions PowerShell.
FullLanguage mode
Le FullLanguage
mode autorise tous les éléments de langage dans la session.
FullLanguage
est le mode de langue par défaut pour les sessions par défaut sur toutes les versions de Windows.
RestrictedLanguage mode
En RestrictedLanguage
mode, les utilisateurs peuvent exécuter des commandes (applets de commande, fonctions, commandes CIM et workflows), mais ne peuvent pas utiliser de blocs de script. Ce mode est également utilisé pour traiter les manifestes de modules chargés par Import-Module
.
À compter de PowerShell 7.2, l’applet de commande est désactivée en RestrictedLanguage
mode lorsque le New-Object
verrouillage du système est configuré.
Par défaut, seules les variables suivantes sont autorisées en RestrictedLanguage
mode :
$PSCulture
$PSUICulture
$True
$False
$Null
Les manifestes de module sont chargés en RestrictedLanguage
mode et peuvent utiliser ces variables supplémentaires :
$PSScriptRoot
$PSEdition
$EnabledExperimentalFeatures
- Toutes les variables d’environnement, comme
$ENV:TEMP
Seuls les opérateurs de comparaison suivants sont autorisés :
-eq
(égal)-gt
(supérieur à)-lt
(inférieur à)
Les instructions d’affectation, les références de propriété et les appels de méthode ne sont pas autorisés.
ConstrainedLanguage mode
ConstrainedLanguage
Le mode est conçu pour autoriser les éléments de langage de base tels que les boucles, les conditions, l’expansion de chaîne et l’accès aux propriétés d’objet. Les restrictions empêchent les opérations qui pourraient être abusées par un acteur malveillant.
Le ConstrainedLanguage
mode autorise toutes les applets de commande et un sous-ensemble d’éléments de langage PowerShell, mais limite les types d’objets qui peuvent être utilisés.
Les fonctionnalités du ConstrainedLanguage
mode sont les suivantes :
- Toutes les applets de commande dans les modules Windows sont entièrement fonctionnelles et ont un accès complet aux ressources système, sauf indication contraire.
- Tous les éléments du langage de script PowerShell sont autorisés.
- Tous les modules inclus dans Windows peuvent être importés et toutes les commandes que les modules exportent s’exécutent dans la session.
- Dans PowerShell Workflow, vous pouvez écrire et exécuter des flux de travail de script (flux de travail écrits dans le langage PowerShell).
- Les flux de travail XAML ne sont pas pris en charge et vous ne pouvez pas exécuter XAML dans un flux de travail de script à l’aide
Invoke-Expression -Language XAML
de . En outre, les flux de travail ne peuvent pas appeler d’autres flux de travail, bien que les flux de travail imbriqués soient autorisés. - L’applet
Add-Type
de commande peut charger des assemblys signés, mais elle ne peut pas charger de code C# arbitraire ou d’API Win32. - L’applet
New-Object
de commande ne peut être utilisée que sur les types autorisés (répertoriés ci-dessous). - Seuls les types autorisés peuvent être utilisés dans PowerShell. Les autres types ne sont pas autorisés. La conversion de type est autorisée, mais uniquement lorsque le résultat est un type autorisé.
- Les paramètres d’applet de commande qui convertissent l’entrée de chaîne en types fonctionnent uniquement lorsque le type résultant est un type autorisé.
- La
ToString()
méthode et les méthodes .NET des types autorisés peuvent être appelées. - Les utilisateurs peuvent obtenir toutes les propriétés des types autorisés. Les utilisateurs peuvent définir les valeurs des propriétés uniquement sur les types autorisés.
Les types .NET suivants sont autorisés en ConstrainedLanguage
mode. Les utilisateurs peuvent obtenir des propriétés, appeler des méthodes et convertir des objets en ces types.
Types autorisés :
[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]
[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]
[ValidatePattern]
[ValidateRange]
[ValidateScript]
[ValidateSet]
[ValidateTrustedData]
[ValidateUserDrive]
[version]
[void]
[WildcardPattern]
[wmi]
[wmiclass]
[wmisearcher]
[X500DistinguishedName]
[X509Certificate]
[xml]
Seuls les types d’objets COM suivants sont autorisés :
Scripting.Dictionary
Scripting.FileSystemObject
VBScript.RegExp
NoLanguage mode
Le mode PowerShell désactive complètement le langage de script PowerShell NoLanguage
.
Vous ne pouvez pas exécuter des scripts ou utiliser des variables. Vous pouvez uniquement exécuter des commandes natives et des cmdlets.
À compter de PowerShell 7.2, l’applet de commande est désactivée en NoLanguage
mode lorsque le New-Object
verrouillage du système est configuré.