Как создать самозаверяющий сертификат и использовать его для подписи моего скрипта powershell?

Итак, я исследовал / гуглил последние 2 часа, и я практически на грани слез...

Я не могу использовать New-SelfSignedCertificate, так как я работаю в Windows 7. Я не могу использовать makecert из-за ошибки, которая не позволяет мне установить SDK для Windows 7, так как думает, что у меня есть предварительная версия .NET 4, а у меня нет. Попытка установить .NET 4 сообщила мне, что у меня есть новая или лучшая версия.

Я попытался взломать реестр, чтобы обойти это, но, к сожалению, это не сработало.

Я скачал этот https://gallery.technet.microsoft.com/scriptcenter/Self-signed-certificate-5920a7c6#content

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

Я думаю, что мне удалось создать сертификат (хотя я не уверен, что сделал это правильно).

Из того, что я могу сказать, мне нужно применить к нему пароль или ключ сейчас, а затем экспортировать его? Я до сих пор не уверен, как конкретно подписать свой сценарий, чтобы другие могли выполнять его как «Подписано».

Спасибо, парни.

В качестве альтернативы все это может быть ненужным, если кто-нибудь знает, как я могу получить относительные пути .ps1, работающие в файле .exe?

Сценарий отлично работает как .ps1, но как только я компилирую его в .exe с помощью PowerGUI, эти строки не работают.

. .\Import-XLS.ps1
$OutFile = ".\TEST$(get-date -Format dd-MM).txt"
$Content = Import-XLS '.\TEST.xlsx'

Вместо этого я получаю такие вещи, как «Термин '.\Import-XLS.ps1' не распознается как имя командлета вместе с некоторой ссылкой на папку Appdata\Local\Temp\QuestSoftware\PowerGUI\.

Итак, я предполагаю, что PowerGUI делает что-то странное, но я не знаю, как еще преобразовать .ps1 в .exe. В зависимости от ответа на основной вопрос, я могу официально представить новый вопрос для .exe.

Спасибо, парни.


person XViper    schedule 07.07.2016    source источник
comment
Подписание сценария самозаверяющим сертификатом не сделает сценарий «доверенным» на машинах, которые не предоставили этот конкретный сертификат.   -  person bluuf    schedule 07.07.2016
comment
Будет, если они используют Set-ExecutionPolicy RemoteSigned, верно? Некоторым из тех, кто хотел использовать этот сценарий, не понравилась идея снятия защиты до уровня, позволяющего запускать неподписанные удаленные сценарии.   -  person XViper    schedule 08.07.2016


Ответы (2)


Поэтому я решил эту проблему с помощью комбинации двух вещей.

Split-Path $MyInvocation.MyCommand.Path

а также

[System.AppDomain]::CurrentDomain.BaseDirectory}

Мне нужно было использовать оба, так как первый работал в .ps1, но не в скомпилированном .exe, а второй работал в скомпилированном .exe, но не в .ps1.

Поскольку .exe-файл, скомпилированный PowerGUI, имеет согласованное имя папки пути, в итоге я использовал следующее.

$ScriptPath = Split-Path $MyInvocation.MyCommand.Path
if ($ScriptPath -match 'Quest Software') {$ScriptPath = [System.AppDomain]::CurrentDomain.BaseDirectory}

Я также включил функцию в .exe (но в этом не было необходимости). Затем я использовал $OutFile = "$ScriptPath\<Filename>.txt" и $Content = Import-XLS "$ScriptPath\<Filename>.xlsx"

Это означает, что теперь я могу использовать .exe вместо того, чтобы пытаться получить рабочий сертификат для скрипта. А также возможность быстро тестировать изменения, пока это все еще .ps1.

Я надеюсь, что это будет полезно для других, использующих PowerGUI для создания .exe в будущем, которым также необходимо использовать относительные пути.

Спасибо тем, кто помогал и советовал.

person XViper    schedule 08.07.2016
comment
Удивительно, это сработало для меня, но мне пришлось использовать [AppDomain] вместо [System.AppDomain] - person Iain Smith; 19.09.2016

Так что я не использовал PowerGUI для создания файлов .exe из скриптов, так что это своего рода выстрел в темноте, но я предполагаю, что он просто не реализует внешние файлы с точечным поиском, если это единственное, что мешает вам развернуть code, почему бы просто не скопировать функции из Import-XLS.ps1 в тело вашего скрипта?

person Mike Garuccio    schedule 07.07.2016
comment
Привет, Майк. Да, в конце концов я попробовал это, но файлы $Outfile и $Content по-прежнему не работают. Я обошел это, установив абсолютный путь, но это делает скрипт действительно негибким. Существуют ли другие известные способы создания .exe? (или я должен задать новый вопрос для этого?) Спасибо. - person XViper; 08.07.2016
comment
В качестве альтернативы, если бы я мог использовать какой-то вариант $ScriptPath = Split-Path $MyInvocation.MyCommand.Path, тогда используйте $ScriptPath\$OutFile = "\TEST.txt" $Content = Import-XLS '"$ScriptPath\TEST.xlsx" Но я тоже не могу заставить это работать. - person XViper; 08.07.2016
comment
если он потерпит неудачу в вещах, отличных от точечного источника, я бы не стал слишком углубляться в это, все равно будет больно работать. но вернемся к подписанию сценария после его импорта в хранилище сертификатов подробнее об этом здесь это должно быть так же просто, как запустить Set-AuthenticodeSignature и указать правильные параметры подробнее об что здесь - person Mike Garuccio; 08.07.2016
comment
Но это по-прежнему будет работать только с людьми, которые добавили вас в качестве доверенного корня. если вы хотите, чтобы люди могли запускать ваши сценарии, не делая ничего, кроме щелчка правой кнопкой мыши, вам понадобится сертификат, подписанный компанией, которая может предоставить доверенные корневые сертификаты. есть много провайдеров, которых вы можете найти с помощью быстрого поиска в Google что-то вроде ssl-сертификата. - person Mike Garuccio; 08.07.2016
comment
Удалось решить мою проблему. Отправка ответа сейчас. Хотя спасибо за помощь и советы. Обязательно изучу информацию об этом сертификате. Огромное спасибо. - person XViper; 08.07.2016