PowerShell.exe -Обход политики выполнения — заголовок в скрипте

#powershell #executionpolicy

#powershell #политика выполнения

Вопрос:

Я пытаюсь легко ByPass активировать ExecutionPolicy . Я понимаю, что одним простым решением было создать runme.ps1 и script.ps1 , и в runme.ps1 я могу Bypass ExecutionPolicy и вызвать script.ps1 . Есть ли какой-нибудь способ поместить это в «заголовок» скрипта и заставить его вызывать себя во время Bypass редактирования ExecutionPolicy ?

runme.ps1:

 PowerShell.exe -ExecutionPolicy Bypass -File "C:tmpscript.ps1"
  

script.ps1:

 Write-Host "Hello World"
PAUSE
  

В настоящее время я работаю над какой-то логикой типа «flag» или «tmpfile» и вызываю сам скрипт, но мне было интересно, есть ли известный / лучший способ или даже возможный способ сделать это заголовком во всех моих скриптах, чтобы конечные пользователи могли просто «запускать w / powershell» без подсказок.

Добавление к ответу с уточнениями по ExecutionPolicy приветствуется, но давайте сосредоточимся на вопросе.

Обсуждение ExecutionPolicy должно быть сосредоточено на «Security Stack Exchange», ссылка на соответствующий пост приведена здесь:

https://security.stackexchange.com/questions/118553/whats-the-purpose-of-executionpolicy-settings-in-powershell-if-the-bypass

https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy /:

Однако важно понимать, что этот параметр никогда не предназначался для контроля безопасности. Вместо этого это было предназначено для того, чтобы администраторы не могли прострелить себе ногу.

Комментарии:

1. Рассматривали ли вы возможность просто изменить политику на уровне компьютера или пользователя на RemoteSigned (или Unrestricted )?

2. Вы не можете изменить политику выполнения скриптов изнутри скрипта!!! 😉 … это похоже на проблему с курицей и яйцом. 😉 Вам также придется запустить первый скрипт с этим параметром -ep ByPass .

3. adjusting every end users machines is not an option -Как так, с какой средой вы работаете?

4. @FreeSoftwareServers Представьте, что вы загружаете кучу скриптов из Интернета, чтобы читать и учиться, но затем вы случайно нажимаете на один из них, и оказывается, что это вредоносная программа. Разве не было бы неплохо, если бы ваш компьютер сказал: «Вы только что скачали этот код из Интернета, может быть, нам не следует его запускать?» и вам пришлось бы сознательно приступить к его выполнению, если бы вы действительно этого хотели? Для этого и предназначена Политика выполнения. Предотвращение вас (и всех остальных) от случайных сбоев. Именно поэтому вы можете так легко его обойти — он работает так, как задумано.

5. Also, have you ever worked in a Corporation? Good luck trying to get that policy approved and implemented.. вы можете указать, для кого вы хотите снизить уровень безопасности, а для кого нет… именно так работает большинство сред Windows в наши дни. 😉 В любом случае … обычно вы развертываете скрипт либо с решением для развертывания программного обеспечения, либо с групповыми политиками, и там вы можете установить политику выполнения так, как вам нужно.

Ответ №1:

Вы можете создать какой-нибудь доверенный лаунчер (cmd-файл или exe-файл), который будет запускать powershell с --ExecutionPolicy ByPass флагом. Или даже вы можете изменить поведение double-click действия, чтобы всегда запускать PowerShell с флагом политики обхода.

Однако настройки на компьютере могут быть изменены системным администратором в MachinePolicyExecutionPolicy или UserPolicyExecutionPolicy , и вы не сможете переопределить их обычным способом.

ExecutionPloicy настроен на 4 1 уровнях, с приоритетом от высокого до низкого:

 > Get-ExecutionPolicy -List

MachinePolicy (Group Policy)
   UserPolicy (Group Policy)
      Process (Configured using powershell -ExecutionPolicy flag for new process only)
  CurrentUser (User settings)
 LocalMachine (Computer settings)
  

Когда вы запускаете PowerShell с флагом обхода, вы фактически устанавливаете политику выполнения на Process уровне, которая переопределяет настройки CurrentUser и LocalMachine , но может быть усилена на уровне UserPolicy или MachinePolicy , управляемом локальными или доменными групповыми политиками.


Лучший способ — настроить пользовательские политики с помощью групповой политики, чтобы разрешить запуск только AllSigned или RemoteSigned скриптов, сгенерировать сертификат New-SelfSignedCertificate -Type CodeSigning сроком на 100 лет, развернуть его с помощью объекта групповой политики как Trusted Publisher для каждого компьютера и подписывать с помощью Set-AuthenticodeSignature каждого скрипта, который вы развертываете для пользователей.

Комментарии:

1. Сегодня я просмотрел настройки моей организации, но интересно узнать, что они могут быть переопределены политикой «выше», поэтому мои усилия могут быть сведены на нет. Мне было бы интересно узнать, как это (# 12) выполняется этим правилом, хотя …> blog.netspi.com /…

2. Это ненормальная функциональность, я бы рекомендовал избегать этого. Просто обратитесь в свой ИТ-отдел, чтобы он подписал ваши скрипты один раз или предоставил вам сертификат подписи для этой цели.

3. Я бы никогда не рекомендовал развертывать сертификат 100yr для чего-либо…. Лучше использовать настройки безопасности по умолчанию

Ответ №2:

TLDR;

 PowerShell.exe -ExecutionPolicy Bypass -File "C:circumventindustrystandard.ps1" 2>amp;1>$null
  

Я хотел поделиться скриптами и иметь возможность сказать «щелкните правой кнопкой мыши и запустите w / powershell», что уже хуже, чем пакетные скрипты, где я говорю «дважды щелкните файл» (люди всегда это понимают!).

Решение пришло ко мне, потому что у меня было PAUSE в моем основном скрипте для чтения выходных данных консоли, и я заметил, что после вызова моего основного скрипта script.ps1 я получил дополнительное PAUSE приглашение от «основного / родительского» скрипта. Что заставило меня понять, что родительский скрипт смог продолжить работу после вызова дочернего скрипта. Следовательно, call nonexistent script and pipe output to null! и продолжайте весело.

Пример сценария:

Следующий скрипт не запустился бы через «щелкните правой кнопкой мыши, запустите w / PowerShell» после новой перезагрузки, и я получил стандартное «Приглашение политики выполнения»:

script.ps1

 Write-Host "Calling Scripts? No Problem!"
PAUSE
  

После новой перезагрузки сработало следующее:

 PowerShell.exe -ExecutionPolicy Bypass -File "C:circumventindustrystandard.ps1" 2>amp;1>$null
ECHO "This Script Won't Run Without Line 1" 
ECHO "I had fun to try to circumvent an industry standard" 
ECHO "I Learned a lot about PowerShell ExecutionPolicy"
C:tmpscript.ps1
PAUSE
  

Результат:

 This Script Won't Run Without Line 1
I had fun to try to circumvent an industry standard
I Learned a lot about PowerShell ExecutionPolicy
Calling Scripts? No Problem!
Press Enter to continue...:
  

Обновление основываясь на комментарии @BACON, это действительно возможно только с помощью «запустить w / powershell» через «контекстное меню». Я попытался установить «powershell» в качестве приложения по умолчанию для .ps1 и это не только не сработало, но и в контекстном меню была удалена опция «запускать с / powershell»!

К счастью, у конечных пользователей будут настройки по умолчанию и / или системные администраторы уже будут знать, как решить проблему.

То, что я изначально не тестировал, но хотел узнать, насколько «обходным» было это решение на самом деле, — попробуйте использовать только PowerShell.exe -ExecutionPolicy Bypass в заголовке. Это привело к тому, что скрипт не был запущен, поэтому ему должен быть присвоен -File , но не имеет никакого эффекта, если файл не существует, и позволяет сценарию продолжить выполнение.

Комментарии:

1. Но что запускает эту PowerShell.exe команду? В конце $null предлагается сценарий PS, так как же это выполняется? Весь смысл политик выполнения заключается в том, чтобы потребовать от пользователя / администратора подтвердить свой ответ на вопрос «Вы уверены, что хотите это выполнить?», выполнив преднамеренное, сознательное действие где-то по ходу выполнения. Это может быть интерактивное выполнение содержимого скрипта, изменение политики или переопределение политики, как вы делаете с новым PowerShell.exe экземпляром. Здесь нет ничего «обходного» или «обойденный»; это просто игра в рамках правил того, как работают политики выполнения.

2. Правильно… За исключением того, что я полностью обошел запрос «Вы уверены, что хотите это выполнить?». Я так смущен, как вы могли себе представить, что это ничего не обходит.

3. Но что запускает это PowerShell.exe команда? = «щелкните правой кнопкой мыши и запустите w / powershell» @BACON

4. Я не говорил, что это будет буквальное приглашение «Вы уверены, что хотите это выполнить?». Посмотрите help about_Run_With_PowerShell и значение HKEY_CLASSES_ROOTSystemFileAssociations.ps1ShellCommand , чтобы увидеть, как это работает. Это Run with PowerShell не является действием по умолчанию для .ps1 файла и требует, чтобы контекстное меню соответствовало тому, что я уже сказал: «преднамеренному, сознательному действию» пользователя. Причина, по которой это ничего не обходит, заключается в том, что нет повышения привилегий , это документированные функции , и «обход» не означает, что «все работает точно так, как задумано».

5. @BACON static.skaip.org/img/emoticons/180×180/f6fcff/headbang.gif