#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://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