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. Dimulai di PowerShell 7.4, tampilan banner start up menyertakan pesan yang menunjukkan bahwa spanduk berjalan dalam mode tersebut. Ini memungkinkan pengguna untuk memiliki pengalaman shell interaktif yang dapat digunakan, menjalankan cmdlet dan perintah asli, serta akses ke elemen bahasa dasar. Tetapi pengguna tidak dapat mengakses API PowerShell, .NET, atau COM yang dapat disalahgunakan oleh aktor jahat.
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 modus
Mode mengizinkan FullLanguage
semua elemen bahasa dalam sesi.
FullLanguage
adalah mode bahasa default untuk sesi default pada semua versi Windows.
RestrictedLanguage modus
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 modus
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 modus
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
.