Невозможно выполнить сценарий PowerShell, используя параметр «Запуск с Powershell» - PullRequest
0 голосов
/ 10 июня 2018

Привет! Я написал простой скрипт powershell для:

  1. Создание ярлыка IE для сайта
  2. Отключение проверки безопасности смешанного кода для панели управления Java
  3. Добавитьнесколько сайтов в качестве доверенных сайтов

Сценарий работает нормально, когда я вручную копирую и вставляю его в powershell.
Однако, когда я сохраняю его как файл .ps1 и«Run with Powershell» - он не выполняется (изменения не вносятся).

Я попытался изменить политику выполнения на Обход, но она по-прежнему не выполняется.

enter image description here

Есть мысли о том, как я могу получить.Сценарий ps1 для выполнения с помощью «Выполнить с Powershell»?

Это так, чтобы мои пользователи могли просто запустить этот сценарий без необходимости копировать и вставлять в powershell.

Спасибо, Asif

Вот полный скрипт для справки:

& powershell.exe -executionpolicy bypass -file C:\Users\AZahir\Desktop\ps2.ps1

$Shell = New-Object -ComObject ("WScript.Shell")
$ShortCut = $Shell.CreateShortcut($env:USERPROFILE + "\Desktop\Jacada.lnk")
$ShortCut.TargetPath = "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
$ShortCut.Arguments = "http://facebook.com"
$ShortCut.WorkingDirectory = "C:\Program Files (x86)\Internet Explorer";
$ShortCut.WindowStyle = 1;
$ShortCut.IconLocation = "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
$ShortCut.Save()

Add-Content -Path "$env:USERPROFILE\AppData\LocalLow\Sun\Java\Deployment\deployment.properties" -Value ('deployment.security.mixcode=DISABLE')


Set-Location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Set-Location ZoneMap\Domains
New-Item bpoazusargdb01d
Set-Location bpoazusargdb01d
New-ItemProperty . -Name http -Value 2 -Type DWORD

Set-Location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Set-Location ZoneMap\Domains
New-Item "172.30.1.3"
Set-Location "172.30.1.3"
New-ItemProperty . -Name http -Value 2 -Type DWORD

Set-Location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Set-Location ZoneMap\Domains
New-Item "172.30.1.49"
Set-Location "172.30.1.49"
New-ItemProperty . -Name http -Value 2 -Type DWORD

Set-Location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Set-Location ZoneMap\Domains
New-Item "172.30.1.89"
Set-Location "172.30.1.89"
New-ItemProperty . -Name http -Value 2 -Type DWORD

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Оставляя мой оригинальный ответ ниже, но с тех пор я нашел более эффективный способ без копии файла:

# 2>NUL & @powershell -nop -ep bypass "(gc '%~f0')-join[Environment]::NewLine|iex" && @EXIT /B 0

Это должно быть включено в качестве первой строки сценария powershell, сохраненного как .cmd файл.

Разбивка:

# 2>NUL &

Это обрабатывает пакетную часть нашего файла, чтобы мы могли получить эту функцию исполнения клика.Поскольку # не является именем файла или командой, он выдает ошибку, которую мы игнорируем с помощью 2>NUL, и переходим к следующей команде с помощью &.

@powershell ...

Это наш вызов , захват содержимого файла (gc: Get-Content) и выполнение их (iex: Invoke-Expression).Мы используем @, чтобы команда не отображалась в кли.

&& EXIT /B 0

Это корректно завершит работу сценария, если не было выдано ошибок.


Если ваша единственная цельчтобы у пользователя была возможность щелкнуть по ярлыку для запуска сценария powershell, это можно сделать с помощью вставки содержимого сценария в этот заголовок (сохраненный как myscript.cmd или как вы хотите его назвать):

::<#
@ECHO OFF
REM /3360348/sozdanie-ispolnyaemogo-faila-exe-iz-skripta-powershellanswer-4629494
REM https://blogs.msdn.microsoft.com/zainala/2008/08/05/using-0-inside-the-batch-file-to-get-the-file-info/

SET "pwsh=%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe"
SET "args=-NoProfile -NoLogo -ExecutionPolicy Bypass -Command"
SET "cmd="@(Get-Content -Path '%~f0') -replace '^^::'^|Set-Content -Path '%~dpn0.ps1';. '%~dpn0.ps1' %*""

%pwsh% %args% %cmd%

DEL "%~dpn0.ps1" /Q /F
EXIT
::#>

Проще говоря, он обрабатывает политику выполнения и сохраняет себя как скрипт powershell после замены частей пакета в качестве комментария блока.

0 голосов
/ 10 июня 2018

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

Используйте файл bat рядом.

include

PowerShell.exe -executionpolicy bypass -file "%~dp0ps2.ps1"

enter image description here

Удалить ниже из вашего сценария powershel.

& powershell.exe -executionpolicy bypass -file C:\Users\AZahir\Desktop\ps2.ps1

Когда пользователь дважды щелкает файл bat, он запускает ps2.ps1.

При запуске я не вижу ошибок.Это создает ярлык и рег ключи.В случае, если вы пытаетесь запустить его во второй раз, он выдаст ошибки, говорящие о наличии ключей reg ..

Также целесообразно использовать """ вместо " подробнее Какпередать msi ArgumentList с $ ScriptDir с пробелами в powershell?

, иначе ваши пользователи могут столкнуться с трудностями при запуске вашего скрипта, если они поместят этот скрипт в путь с таким пробелом, как c:\new folder\

...