VSCode переопределяет PowerShell ExecutionPolicy - PullRequest
2 голосов
/ 13 апреля 2020

При использовании Get-ExecutionPolicy -list в VSCode для PowerShell v5 x64 & x86 он возвращает следующее:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process          Bypass
  CurrentUser       Undefined
 LocalMachine       Undefined

При использовании той же команды в VSCode и консоли PowerShell v7 возвращается:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process    RemoteSigned
  CurrentUser       Undefined
 LocalMachine    RemoteSigned

Есть 2 записи реестра, которые устанавливают ExecutionPolicy (Первоначально: ByPass)

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command      REG_SZ  "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process RemoteSigned }; & '%1'" 
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\0\Command        REG_SZ  "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process RemoteSigned }; & '%1'"

Эти 2 записи изначально были установлены для Установить политику выполнения на ByPass, и я установил эти 2 записи вручную в RemoteSigned. (почему эти 2 записи в реестре и почему они были настроены для обхода?!).

Для реестра PowerShell не заданы дополнительные политики, кроме этих 2 записей. Установка их в RemoteSigned, казалось, сделала свое дело для v7, но не для v5.

При проверке ExecutionPolicy в консоли PowerShell v5 все они не определены.

при проверке vscode-powershell. В журнале говорится, что он запускает PowerShell с аргументами:
PowerShell args: -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command Import-Module ...

Я вижу, что расширение PowerShell vscode устанавливает некоторые из этих параметров в следующем файле: C: \ Users \ UserName .vscode \ extensions \ ms-vscode.powershell-2020.3.0 \ out \ src \ process. js
Но я не уверен, что это правильный файл для внесения этих изменений.

Я хочу иметь возможность проверить / установить для параметра ExecutionPolicy для VSCode значение RemoteSigned при запуске языкового сервера, где я могу это сделать?

Кроме того, почему в реестре есть 2 записи, которые устанавливают ExecutionPolicy ByPass, когда ExecutionPolicy не равно AllSigned. Это могло произойти после установки Chocolatey с помощью их однострочного установщика: Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

Я не использую никаких профилей.

Я знаю, это немного грязно, извините за это, мой главный вопрос где VSCode устанавливает ExecutionPolicy при запуске языкового сервера и могу ли я это изменить. При проведении какого-либо расследования я обнаружил, что существует 2 записи реестра, которые устанавливают, что ExecutionPolicy должен обходить, почему этот стандарт выглядит как проблема безопасности. (что могло быть вызвано установкой шоколада, не уверен)

1 Ответ

1 голос
/ 13 апреля 2020

Расширение PowerShell для Визуальный код учитывает параметры постоянной политики выполнения [1] для любой версии / редакции PowerShell, которую он настроил для использования (см. этот ответ ); для управления этими настройками используйте Set-ExecutionPolicy из соответствующей версии / издания.

  • Например, чтобы постоянно устанавливать политику для текущего пользователя на RemoteSigned, запустите
    Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

Если вы хотите переопределить постоянно настроенную политику в коде Visual Studio, добавьте команду Set-ExecutionPolicy в файл $PROFILE как используется расширением PowerShell :

  • В интегрированной консоли PowerShell выполните psedit $PROFILE, чтобы открыть файл для редактирования.
  • Добавить Set-ExecutionPolicy -Scope Process RemoteSigned к файлу.

Что касается ваш вопрос :

Так как HKEY_CLASSES_ROOT является составным представлением HKEY_CURRENT_USER\Software\Classes и HKEY_LOCAL_MACHINE\Software\Classes, существует только одна запись в этом случае, доступ к которой можно получить с помощью любого ключевого пути.

Однако эта запись не контролирует постоянные политики выполнения для Windows PowerShell; вместо этого это удобное определение команды context-menu , которое позволяет вам запускать файл *.ps1 непосредственно из проводника или с рабочего стола. В качестве функции безопасности команда обеспечивает, чтобы действующая политика выполнения только для создаваемого процесса (-Scope Process) была как минимум такой же строгой, как RemoteSigned.


[1] Необязательное чтение: где редакции PowerShell хранят свои постоянные (не-GPO) постоянные параметры политики выполнения :

Следующее относится только к Windows * , поскольку политики выполнения принципиально не поддерживаются на платформах, подобных Unix.

Примечание:

  • Как показано в вашем вопросе, выполните Get-ExecutionPolicy -List, чтобы просмотреть все действующие политики для всех областей:

    • Настройки в более точных c областях - если определены - имеют приоритет; то есть наиболее конкретная область действия c, в которой не указано Undefined, - это область действия текущего процесса.

    • Групповые политики ( настройки на основе GPO ) - т.е. области действия UserPolicy и MachinePolicy, которые нельзя установить с помощью Set-ExecutionPolicy - can override the CurrentUser , LocalMachine и Process областей; в частности, это означает, что даже ad-ho c пытается переопределить политику выполнения с помощью параметра -Scope Process Bypass / -ExecutionPolicy Bypass CLI .

  • Вы должны использовать Set-ExecutionPolicy для изменения постоянных настроек вместо непосредственного изменения этих местоположений.

PowerShell [Core] (версия 6 или выше) сохраняет настройки в .json файлах :

  • Политика текущего пользователя (Scope -CurrentUser; файл может не существовать) :

    • "$([Environment]::GetFolderPath('MyDocuments'))/powershell/powershell.config.json"
  • Правила машины (Scope -LocalMachine):

    • "$PSHOME\powershell.config.json"
    • Обратите внимание, что имя файла root равно powershell, хотя фактическое исполняемое имя файла root равно pwsh:

Windows PowerShell (версия до 5.1) сохраняет настройки в реестре (ключи не существуют, если вы никогда не запускаете Set-ExecutionPolicy или если вы запускаете Set-ExecutionPolicy для установки политики области на Undefined):

  • * 1 162 * Политика текущего пользователя (-Scope CurrentUser): HKCU:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell, значение ExecutionPolicy

    • И 32-разрядные, и 64-разрядные исполняемые файлы PowerShell видят одно и то же значение, поскольку для HKCU (HKEY_CURRENT_USERS) ульи не указываются c.
  • Политика машины (-Scope LocalMachine) : HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell, значение ExecutionPolicy

    • Предупреждение : 32-битные и 64-битные исполняемые файлы видят разные значения, потому что 32-битные приложения имеют отдельные HKEY_LOCAL_MACHINE\Software улей.
...