about_Language_Modes

Deskripsi singkat

Menjelaskan mode bahasa dan efeknya pada sesi PowerShell.

Deskripsi panjang

Mode bahasa sesi PowerShell menentukan elemen bahasa PowerShell mana yang dapat digunakan dalam sesi.

PowerShell mendukung mode bahasa berikut:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (diperkenalkan di PowerShell 3.0)
  • NoLanguage

Apa itu mode bahasa?

Mode bahasa menentukan elemen bahasa yang diizinkan dalam sesi.

Mode bahasa adalah properti konfigurasi sesi (atau "titik akhir") yang digunakan untuk membuat sesi. Semua sesi yang menggunakan konfigurasi sesi tertentu memiliki mode bahasa konfigurasi sesi.

Semua sesi PowerShell memiliki mode bahasa. Sesi dibuat menggunakan konfigurasi sesi pada komputer target. Mode bahasa yang diatur dalam konfigurasi sesi menentukan mode bahasa sesi. Untuk menentukan konfigurasi sesi PSSession, gunakan parameter ConfigurationName cmdlet yang membuat sesi.

Dimulai di PowerShell 7.3, Anda dapat menjalankan pwsh dengan parameter ConfigurationFile . Ini memungkinkan Anda memulai PowerShell menggunakan konfigurasi tertentu.

Menemukan mode bahasa sesi

Anda dapat menemukan mode bahasa dari sesi FullLanguage atau ConstrainedLanguage dengan mendapatkan nilai properti LanguageMode dari status sesi.

Contohnya:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

Namun, dalam sesi dengan RestrictedLanguage mode dan NoLanguage , Anda tidak dapat menggunakan operator akses anggota (.) untuk mendapatkan nilai properti. Sebaliknya, pesan kesalahan mengungkapkan mode bahasa.

Saat Anda menjalankan $ExecutionContext.SessionState.LanguageMode perintah dalam RestrictedLanguage sesi, PowerShell mengembalikan pesan kesalahan PropertyReferenceNotSupportedInDataSection dan VariableReferenceNotSupportedInDataSection .

  • PropertyReferenceNotSupportedInDataSection: Referensi properti tidak diizinkan dalam mode bahasa terbatas atau bagian Data.
  • VariableReferenceNotSupportedInDataSection: Variabel yang tidak dapat direferensikan dalam mode bahasa terbatas atau bagian Data sedang direferensikan.

Saat Anda menjalankan $ExecutionContext.SessionState.LanguageMode perintah dalam NoLanguage sesi, PowerShell mengembalikan pesan kesalahan ScriptsNotAllowed .

  • ScriptsNotAllowed: Sintaks tidak didukung oleh runspace ini. Ini mungkin karena dalam mode tanpa bahasa.

Menemukan mode bahasa konfigurasi sesi

Saat konfigurasi sesi dibuat menggunakan file konfigurasi sesi, konfigurasi sesi memiliki properti LanguageMode . Anda dapat menemukan mode bahasa dengan mendapatkan nilai properti LanguageMode .

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

Pada konfigurasi sesi lain, Anda dapat menemukan mode bahasa secara tidak langsung dengan menemukan mode bahasa sesi yang dibuat menggunakan konfigurasi sesi.

Mengatur mode bahasa

Mode bahasa dalam sesi PowerShell dapat diatur melalui variabel bawaan $ExecutionContext .

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

Namun, melakukan ini hanya berguna untuk bereksperimen dengan mode bahasa. Mode bahasa dimaksudkan untuk memberikan keamanan tambahan ke sesi PowerShell untuk konteks tertentu.

Mode bahasa diatur saat Anda menggunakan kebijakan kontrol aplikasi sistem atau membuat konfigurasi sesi.

Menggunakan kebijakan kontrol aplikasi sistem

PowerShell secara otomatis berjalan dalam ConstrainedLanguage mode saat berjalan di bawah kebijakan kontrol aplikasi sistem. Kebijakan kontrol aplikasi yang terdeteksi adalah AppLocker dan Windows Defender Application Control (WDAC) pada platform Windows.

PowerShell menerapkan pembatasan lain selain mode bahasa saat mendeteksi kebijakan kontrol aplikasi. Misalnya, ada batasan tambahan untuk sumber titik dan impor modul berdasarkan kebijakan.

Saat sesi PowerShell dimulai di bawah kebijakan, sesi tersebut berjalan dalam ConstrainedLanguage mode. Mode ini memungkinkan pengalaman shell interaktif yang dapat digunakan sambil membatasi akses ke fitur dan API yang dapat disalahgunakan oleh aktor jahat. Pengguna dapat menjalankan cmdlet dan perintah asli dan memiliki akses ke elemen bahasa dasar. Akses ke API PowerShell, .NET, dan COM dibatasi.

Modul berbasis skrip atau skrip apa pun yang dijalankan dalam sesi ini berjalan dalam ConstrainedLanguage mode. Namun, modul berbasis skrip atau skrip apa pun yang diizinkan oleh kebijakan berjalan dalam FullLanguage mode tanpa batasan apa pun. Dengan cara ini, sistem yang dikunci oleh kebijakan dapat memiliki skrip yang dipercaya oleh kebijakan dan berjalan dengan beberapa batasan.

Menggunakan konfigurasi sesi

PowerShell jarak jauh secara opsional mendukung pembuatan konfigurasi sesi kustom. Anda dapat mengatur mode bahasa yang Anda inginkan untuk konfigurasi kustom tersebut. Konfigurasi PowerShell Just Enough Administration (JEA) menggunakan NoLanguage mode untuk membatasi sesi hanya untuk pemanggilan perintah. Dengan JEA, sesi jarak jauh dapat dibatasi untuk pengguna tertentu. Pengguna JEA terbatas untuk menjalankan serangkaian perintah yang ditentukan dan tidak dapat langsung mengakses API, sistem file, atau sumber daya sistem lainnya.

Untuk informasi selengkapnya, lihat Konfigurasi Sesi JEA dan New-PSSessionConfigurationFile.

Fitur dan batasan mode bahasa

Bagian ini menjelaskan mode bahasa dalam sesi PowerShell.

FullLanguage Mode

Mode mengizinkan FullLanguage semua elemen bahasa dalam sesi. FullLanguage adalah mode bahasa default untuk sesi default pada semua versi Windows.

RestrictedLanguage Mode

Dalam RestrictedLanguage mode, pengguna dapat menjalankan perintah (cmdlet, fungsi, perintah CIM, dan alur kerja), tetapi tidak dapat menggunakan blok skrip. Mode ini juga digunakan untuk memproses manifes modul yang dimuat oleh Import-Module.

Dimulai di PowerShell 7.2, New-Object cmdlet dinonaktifkan dalam mode saat penguncian sistem dikonfigurasi RestrictedLanguage .

Secara default, hanya variabel berikut yang diizinkan dalam RestrictedLanguage mode:

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

Manifes modul dimuat dalam RestrictedLanguage mode dan dapat menggunakan variabel tambahan ini:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Variabel lingkungan apa pun, seperti $ENV:TEMP

Hanya operator perbandingan berikut yang diizinkan:

  • -eq (sama dengan)
  • -gt (lebih besar dari)
  • -lt (kurang dari)

Pernyataan penugasan, referensi properti, dan panggilan metode tidak diizinkan.

ConstrainedLanguage Mode

ConstrainedLanguage mode dirancang untuk memungkinkan elemen bahasa dasar seperti perulangan, kondisi, perluasan string, dan akses ke properti objek. Pembatasan mencegah operasi yang dapat disalahgunakan oleh aktor jahat.

Mode ini ConstrainedLanguage mengizinkan semua cmdlet dan subset elemen bahasa PowerShell, tetapi membatasi jenis objek yang dapat digunakan.

Fitur ConstrainedLanguage mode adalah sebagai berikut:

  • Semua cmdlet dalam modul Windows berfungsi penuh dan memiliki akses lengkap ke sumber daya sistem, kecuali sebagaimana disebutkan.
  • Semua elemen bahasa skrip PowerShell diizinkan.
  • Semua modul yang disertakan dalam Windows dapat diimpor dan semua perintah yang dijalankan ekspor modul dalam sesi.
  • Add-Type Cmdlet dapat memuat rakitan yang ditandatangani, tetapi tidak dapat memuat kode C# arbitrer atau API Win32.
  • New-Object Cmdlet hanya dapat digunakan pada jenis yang diizinkan (tercantum di bawah).
  • Hanya jenis yang diizinkan yang dapat digunakan di PowerShell. Jenis lain tidak diizinkan. Konversi jenis diizinkan, tetapi hanya ketika hasilnya adalah jenis yang diizinkan.
  • Parameter cmdlet yang mengonversi input string ke jenis hanya berfungsi ketika jenis yang dihasilkan adalah jenis yang diizinkan.
  • Metode ToString() dan metode .NET dari jenis yang diizinkan dapat dipanggil.
  • Pengguna bisa mendapatkan semua properti dari jenis yang diizinkan. Pengguna dapat mengatur nilai properti hanya pada jenis yang diizinkan.

Jenis .NET berikut diizinkan dalam ConstrainedLanguage mode. Pengguna bisa mendapatkan properti, memanggil metode, dan mengonversi objek ke jenis ini.

Tipe yang Diizinkan:

  • [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]

Hanya jenis objek COM berikut yang diizinkan:

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

NoLanguage Mode

Mode PowerShell NoLanguage menonaktifkan bahasa pembuatan skrip PowerShell sepenuhnya. Anda tidak dapat menjalankan skrip atau menggunakan variabel. Anda hanya dapat menjalankan perintah dan cmdlet asli.

Dimulai di PowerShell 7.2, New-Object cmdlet dinonaktifkan dalam mode saat penguncian sistem dikonfigurasi NoLanguage .

Lihat juga