Запускаю скрипт через 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 ISE, он пытается СОЗДАТЬ следующий файл:
__PSScriptPolicyTest_oovfbya1.gl2.ps1
Создав файл, ISE смотрит, что можно с ним делать и по результатам решает, в каком режиме работать. При этом SRP не выдавал никакого лога о блокировке!
Поскольку файл сразу же удаляется, я не знаю, что там внутри, может вообще ничего нет, поэтому я не могу настроить SRP на разрешение по HASH.
Оставлять разрешения на запуск всех файлов из ВРЕМЕННОЙ папки я тоже не хочу, поэтому дам разрешение для этих файлов по маске:
C:\Users\<USER>\AppData\Local\Temp\__PSScriptPolicyTest_????????.???.ps1
Правило Software Restriction Policies для PowerShell ISE будет таким:
C:\Users\<USER>\AppData\Local\Temp\__PSScriptPolicyTest_????????.???.psm1
Проблема решена:
PS C:\Windows\system32> $ExecutionContext.SessionState.LanguageMode FullLanguage
Разрешив запуск скриптов PowerShell (пусть даже по маске) из временной папки, мы сделали брешь в безопасности компа, нужно её прикрыть. Для этого можно включить разрешение на запуск только подписанных скриптов:
▶ ▶ ▶ ▶ ▶ ▶ ▶
Правда, если консоль 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
- Не приходит СМС для авторизации на сайте Госуслуги - 01.11.2024
- VSCode: Найти и удалить элементы xml - 29.10.2024
- WordPress: Ошибка в плагине WpDiscuz - 08.10.2024