PowerShell: Ошибка Cannot dot-source this command because it was defined in a different language mode

Запускаю скрипт через PowerShell ISE, получаю ошибку:

D:\Distr-free\System\Tweaks\PowerShell\current.ps1 : Cannot dot-source this command because it was defined in a different language mode. To invoke this command without importing its contents, omit the ‘.’ operator.
+ CategoryInfo : InvalidOperation: (:) [current.ps1], NotSupportedException
+ FullyQualifiedErrorId : DotSourceNotSupported,current.ps1

Тогда я выполняю в консоле ISE такой cmdlet:

PS C:\Windows\system32> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

Получается, что ISE запущена в режиме ограничения (ConstrainedLanguage).

Убил кучу времени, прочёсывая инет. В основном там ссылались на конфликты (запреты) Software Restriction Policy или AppLocker. У меня конечно настроен SRP, но он тут не при чем — логов в EventViewer нет, я перепроверял все десятки раз! Так казалось мне сначала…

Наткнулся на совет — не использовать сложный код. Меня это вообще никак не устраивало, поэтому я продолжил поиски решения. Воспользовался Process Monitor и мне удалось отловить кое-что интересное:
PowerShell: Ошибка Cannot dot-source this command because it was defined in a different language mode
На скриншоте видно, что при запуске PowerShell ISE, он пытается СОЗДАТЬ следующий файл:
__PSScriptPolicyTest_oovfbya1.gl2.ps1
Создав файл, ISE смотрит, что можно с ним делать и по результатам решает, в каком режиме работать. При этом SRP не выдавал никакого лога о блокировке!
Поскольку файл сразу же удаляется, я не знаю, что там внутри, может вообще ничего нет, поэтому я не могу настроить SRP на разрешение по HASH.

Оставлять разрешения на запуск всех файлов из ВРЕМЕННОЙ папки я тоже не хочу, поэтому дам разрешение для этих файлов по маске:

C:\Users\<USER>\AppData\Local\Temp\__PSScriptPolicyTest_????????.???.ps1

Правило Software Restriction Policies для PowerShell ISE будет таким:

PowerShell: Ошибка Cannot dot-source this command because it was defined in a different language mode

Правило SRP для PowerShell ISE

Если файл .ps1 запрещён, то ISE пытается сделать проверку для файлов .psm1, так что помимо .ps1 нужно добавить в белый список расширение .psm1:
C:\Users\<USER>\AppData\Local\Temp\__PSScriptPolicyTest_????????.???.psm1

Проблема решена:

PS C:\Windows\system32> $ExecutionContext.SessionState.LanguageMode
FullLanguage

Разрешив запуск скриптов PowerShell (пусть даже по маске) из временной папки, мы сделали брешь в безопасности компа, нужно её прикрыть. Для этого можно включить разрешение на запуск только подписанных скриптов:
gpedit.mscComputer ConfigurationAdministrative TemplatesWindows ComponentsWindows PowerShellTurn on Script ExecutionEnabledAllow only signed scripts
Правда, если консоль ISE запущена под обычным пользователем, то запустить неподписанный скрипт не получится, так что лучше выставить политику «Allow local scripts and remote signed scripts»

Только мне непонятно, почему разработчики выбрали такой неоднозначный способ проверки политики…

Вообще, если не все события SRP попадают в журнал, можно было включить расширенный журнал (если знать, что проблема с правилами SRP):

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers -Name LogFileName -Value 'C:\Users\Denis\Documents\saferlog.txt'

При этом расширенный лог будет записываться не в Журнал событий, а в файл «C:\Users\Denis\Documents\saferlog.txt»
Отключить этот режим можно так:

Remove-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers -Name LogFileName


Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments