none
Запуск f2.ps1 из f1.ps1 и вывод в лог. RRS feed

  • Вопрос

  • Здравствуйте! 

    Есть 3 файла. 

    Main.ps1 \ Sec1.ps1 \ Sec2.ps1

    Подскажите, как из main.ps1 запускать Sec1.ps1 или Sec2.ps1 с параметром ExecutionPolicy ByPass и результаты вывода - сливать в \\shara\file.log (ДОПИСЫВАЯ, а не заменяя файл)

    Спасибо.

    2 сентября 2015 г. 15:55

Ответы

  • Удалось подписать скрипт! НО! 

    Сделать это получается только на машине с AD CA. Т.е. там, где созданный сертификат находится в папке cert:CurrentUser\my т.е. в CurrentUser -> Personal -> Certificates

    И только тогда корректно работает подпись, когда в объект $cert мы "впихнем" сертификат именно из этой папки. т.е.: 

    $cert = @(dir cert:\CurrentUser\My -codesigning)[0]

    Осталось разобраться как распространить сертификат в CurrentUser\My и понять надо ли это вообще делать. Или подписывать исключительно на одном сервере. 

    Далее по задаче буду пробовать реализовывать свою схему. 

    p.s. даже поместив вручную (на локальной машине) необходимый сертификат в контейнер CurrentUser\My - и попытавшись выполнить команду указанную выше - $cert остается пустым... Не понимаю почему, но пока есть возможность подписи только на AD CA


    • Помечено в качестве ответа TheShestov 4 сентября 2015 г. 10:59
    • Изменено TheShestov 4 сентября 2015 г. 11:09
    4 сентября 2015 г. 10:59
  • Удалось реализовать задуманное. 

    Для тех, кому интересно решение для кейса: "Создать скрипт. Подписать скрипт. Выполнить запуск скрипта в GPO на компьютерах после загрузки системы" - я написал 3 статьи в своем блоге, как заметку для себя. На основе тех данных, которые мне давали в этой ветке и ссылках с других ресурсов. Всем спасибо! 

    Вот эти статьи: 

    GPO AD: Computer Startup scripts and Powershell (часть 1: Создание. Запуск)

    GPO AD: Computer Startup scripts and Powershell (часть 2: Создание своего сертификата. Подпись скриптов)

    GPO AD: Computer Startup scripts and Powershell (часть 3: PsExec. Ловим ошибки)

    • Помечено в качестве ответа TheShestov 10 сентября 2015 г. 12:02
    10 сентября 2015 г. 12:02
  • # In Main.ps1 
    & "C:\temp\fp1.ps1"
    & "C:\temp\fp2.ps1"
    # In Fp1.ps1
    "$(get-date -uformat {%H:%M}) something in fp1"
    start-sleep 5
    # In Fp2.ps1
    "$(get-date -uformat {%H:%M}) something in fp2"
    start-sleep 5

    run in CMD or in Run...

    powershell -executionpolicy bypass -command "c:\temp\main.ps1 | out-file c:\temp\log.log -append"
    

    in c:\temp\log.log

    20:01 something in fp1
    20:02 something in fp2
    
    Я правильно вопрос понял?


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа TheShestov 3 сентября 2015 г. 10:25
    2 сентября 2015 г. 17:05
    Модератор
  • Vector BCO, спасибо.

    Не совсем так. 

    Запускаться планируется main.ps1 из оснастки Startup Script in GPO. Т.е. напрямую указывая на main.ps1

    т.е. подозреваю, что в качестве исполняемого файла там будет прописано powershell.exe

    а в аргументах, например -File "%path%\main.ps1" (хотя пока тоже не уверен, что именно там написать)

    А вот что должно быть написано в main.ps1, чтобы запустить скрипты Fp1.ps1 и Fp2.ps1 

    а) для того, чтобы они запустились с наивысшими правами. т.к. там внутри работа с папкой C:\Program files

    б) для того, чтобы результаты их работы и выводы, в т.ч. Write-Host "текст" вышли в лог файл путем добавления в конец файла, а не заменой. 

    а если в main.ps1 будет так, как Вы написали: 

    C:\temp\fp1.ps1 - то кажется это просто откроет эти файлы в редакторе. 

    Надеюсь ясно объяснил кейс. 

    в startup скриптах есть пункт запуска powershell скриптов

    1) вам нужно 1 в startup скриптах зайти на вкладку powershell открыть расположение и скопировать туда скрипт

    2) выбрать его

    3) в политике настроить executionpolicy (это передается не как параметр а в настройках самой политики)

    4) скрипт будет выполняться от имени системы (читай: с наивысшими правами)

    5) | out-file \\shara\file.log -append выведет всё содержимое ответа в файл *

    Пример

    # In Main.ps1 
    & "C:\temp\fp1.ps1" | out-file \\shara\file.log -append
    & "C:\temp\fp2.ps1" | out-file \\shara\file.log -append

    * возможны проблемы с правами, так как скрипт будет выполнятся через политику вам нужно настроить права на шару и NTFS права на папку (Share - Everyone:Full control; NTFS - Domain computers:ReadWrite)

    6) Write-Host перехватить проблема, так как этот командлет выводит результат исключительно в консоль лучше его убрать тогда все будет проще

    Вроде так )


    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 2 сентября 2015 г. 18:30
    • Помечено в качестве ответа TheShestov 3 сентября 2015 г. 10:25
    2 сентября 2015 г. 18:29
    Модератор
  • 1) есть вариант подписания скриптов (all signed / remote sigmned) в таком случае будут выполняться подписанные скрипты (нужен центр сертификации, и подписание всех скриптов вашим сертификатом)

    батники и vbs выполняются вполне спокойно по дефолту так что сказать что PoSh это прям дыра будет преувеличением если не применяются меры по предотвращению выполнения других выполняемых файлов

    про подписание скриптов есть много статей (мне больше всего понравилась статья Вадима Подданса в его блоге, если интересно могу поискать)

    если кратко то тут вам нужно судить самому насколько у вас заморочена безопасность

    2) Пройтись по скриптам и заменить write-host на "" (ничего)

    Write-Host "Some text" ~ "Some text", только без write-host это можно перехватить и записать например в лог (без лишних заморочек)

    Про заморочки когда то Казун писал (если интересно, то могу поискать)


    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 3 сентября 2015 г. 9:51
    • Помечено в качестве ответа TheShestov 3 сентября 2015 г. 10:25
    3 сентября 2015 г. 9:49
    Модератор

Все ответы

  • # In Main.ps1 
    & "C:\temp\fp1.ps1"
    & "C:\temp\fp2.ps1"
    # In Fp1.ps1
    "$(get-date -uformat {%H:%M}) something in fp1"
    start-sleep 5
    # In Fp2.ps1
    "$(get-date -uformat {%H:%M}) something in fp2"
    start-sleep 5

    run in CMD or in Run...

    powershell -executionpolicy bypass -command "c:\temp\main.ps1 | out-file c:\temp\log.log -append"
    

    in c:\temp\log.log

    20:01 something in fp1
    20:02 something in fp2
    
    Я правильно вопрос понял?


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа TheShestov 3 сентября 2015 г. 10:25
    2 сентября 2015 г. 17:05
    Модератор
  • Vector BCO, спасибо.

    Не совсем так. 

    Запускаться планируется main.ps1 из оснастки Startup Script in GPO. Т.е. напрямую указывая на main.ps1

    т.е. подозреваю, что в качестве исполняемого файла там будет прописано powershell.exe

    а в аргументах, например -File "%path%\main.ps1" (хотя пока тоже не уверен, что именно там написать)

    А вот что должно быть написано в main.ps1, чтобы запустить скрипты Fp1.ps1 и Fp2.ps1 

    а) для того, чтобы они запустились с наивысшими правами. т.к. там внутри работа с папкой C:\Program files

    б) для того, чтобы результаты их работы и выводы, в т.ч. Write-Host "текст" вышли в лог файл путем добавления в конец файла, а не заменой. 

    а если в main.ps1 будет так, как Вы написали: 

    C:\temp\fp1.ps1 - то кажется это просто откроет эти файлы в редакторе. 

    Надеюсь ясно объяснил кейс. 

    2 сентября 2015 г. 17:27
  • Vector BCO, спасибо.

    Не совсем так. 

    Запускаться планируется main.ps1 из оснастки Startup Script in GPO. Т.е. напрямую указывая на main.ps1

    т.е. подозреваю, что в качестве исполняемого файла там будет прописано powershell.exe

    а в аргументах, например -File "%path%\main.ps1" (хотя пока тоже не уверен, что именно там написать)

    А вот что должно быть написано в main.ps1, чтобы запустить скрипты Fp1.ps1 и Fp2.ps1 

    а) для того, чтобы они запустились с наивысшими правами. т.к. там внутри работа с папкой C:\Program files

    б) для того, чтобы результаты их работы и выводы, в т.ч. Write-Host "текст" вышли в лог файл путем добавления в конец файла, а не заменой. 

    а если в main.ps1 будет так, как Вы написали: 

    C:\temp\fp1.ps1 - то кажется это просто откроет эти файлы в редакторе. 

    Надеюсь ясно объяснил кейс. 

    в startup скриптах есть пункт запуска powershell скриптов

    1) вам нужно 1 в startup скриптах зайти на вкладку powershell открыть расположение и скопировать туда скрипт

    2) выбрать его

    3) в политике настроить executionpolicy (это передается не как параметр а в настройках самой политики)

    4) скрипт будет выполняться от имени системы (читай: с наивысшими правами)

    5) | out-file \\shara\file.log -append выведет всё содержимое ответа в файл *

    Пример

    # In Main.ps1 
    & "C:\temp\fp1.ps1" | out-file \\shara\file.log -append
    & "C:\temp\fp2.ps1" | out-file \\shara\file.log -append

    * возможны проблемы с правами, так как скрипт будет выполнятся через политику вам нужно настроить права на шару и NTFS права на папку (Share - Everyone:Full control; NTFS - Domain computers:ReadWrite)

    6) Write-Host перехватить проблема, так как этот командлет выводит результат исключительно в консоль лучше его убрать тогда все будет проще

    Вроде так )


    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 2 сентября 2015 г. 18:30
    • Помечено в качестве ответа TheShestov 3 сентября 2015 г. 10:25
    2 сентября 2015 г. 18:29
    Модератор
  • как-то слишком заморочено. 

    скрипты будет лежать в sysvol

    Но сейчас даже ключевой вопрос в другом. Как-же мне тестировать работу скриптов, без GPO 

    Иначе: запустив powershell и из него запускать иные скрипты с необходимыми параметрами. Неужели нет вариантов?

    2 сентября 2015 г. 18:45
  • Это только выглядит заморочено

    политика выполнение выставляется разово на все домен (можно и не на вес дело ваше)

    есть варианты выполнения я это показал

    если хотите можно использовать и 

    powershell -command "c:\temp\main.ps1 | out-file c:\temp\log.log -append"

    но это излишне


    The opinion expressed by me is not an official position of Microsoft

    2 сентября 2015 г. 19:00
    Модератор
  • Vector BCO, спасибо большое. Завтра буду тестировать Ваши советы. 

    По факту - обязательно отмечу ответы! 


    2 сентября 2015 г. 19:02
  • 1. Политику нашел. Параметр "Разрешить выполнение всех скриптов" - звучит, как приговор и черную дыру в безопасности. Подумываю о варианте Разрешить локальные скрипты, а в период выполнения - копировать их в какой-нибудь "temp" на машине, затем удалять. Или есть какие-то мысли на этот счет? 

    2. Какой можно найти аналог решения Write-Host ? У Main скрипта (который будет инициирован GPO Script Startup) будет возможность выставлять параметры логирования. Следовательно по пути ветки сценариев - у меня были расписаны некоторые подсказки того, что все-же происходило, по ходу условий или циклов. Есть какие-то решения? 

    3 сентября 2015 г. 9:33
  • 1) есть вариант подписания скриптов (all signed / remote sigmned) в таком случае будут выполняться подписанные скрипты (нужен центр сертификации, и подписание всех скриптов вашим сертификатом)

    батники и vbs выполняются вполне спокойно по дефолту так что сказать что PoSh это прям дыра будет преувеличением если не применяются меры по предотвращению выполнения других выполняемых файлов

    про подписание скриптов есть много статей (мне больше всего понравилась статья Вадима Подданса в его блоге, если интересно могу поискать)

    если кратко то тут вам нужно судить самому насколько у вас заморочена безопасность

    2) Пройтись по скриптам и заменить write-host на "" (ничего)

    Write-Host "Some text" ~ "Some text", только без write-host это можно перехватить и записать например в лог (без лишних заморочек)

    Про заморочки когда то Казун писал (если интересно, то могу поискать)


    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 3 сентября 2015 г. 9:51
    • Помечено в качестве ответа TheShestov 3 сентября 2015 г. 10:25
    3 сентября 2015 г. 9:49
    Модератор
  • 1) подписывать скрипты не вариант?
    3 сентября 2015 г. 9:56
  • еще к стати, если копировать а дальше удалять то вам то их копировать тоже нужно

    Разве что батником это делать но это как то сильно наворочено


    The opinion expressed by me is not an official position of Microsoft

    3 сентября 2015 г. 10:17
    Модератор

  • Про заморочки когда то Казун писал (если интересно, то могу поискать)


    The opinion expressed by me is not an official position of Microsoft


    Интересно :) 

    Блог Вадима нашел ( http://www.sysadmins.lv/blog-en/categoryview/powershell.aspx ) инфы там много, но наверное ту статью, что вы имели ввиду - не нашел пока. 

    Относительно подписи - теоретически - неплохая мысль. Практически - ощущение, что на это уйдет еще одна "кучка" времени. хотя AD CS имеется. 

    За Write-Host - спасибо. не знал, что это выйдет все в лог. Отлично работает, спасибо!

    3 сентября 2015 г. 10:24
  • еще к стати, если копировать а дальше удалять то вам то их копировать тоже нужно

    Разве что батником это делать но это как то сильно наворочено


    The opinion expressed by me is not an official position of Microsoft

    Не очень понял Вашу мысль. 

    Планируемая логика такая: 

    1. Политика на разрешение локальных или подписанных. 

    2. Запуск Main.ps1 инициируется GPO (следовательно с наивысшими правами)

    3. Main.ps1 копирует необходимые сценарии в %temp% -> запускает их из %temp% -> удаляет их из %temp% 

    3 сентября 2015 г. 10:28
  • еще к стати, если копировать а дальше удалять то вам то их копировать тоже нужно

    Разве что батником это делать но это как то сильно наворочено


    The opinion expressed by me is not an official position of Microsoft

    Не очень понял Вашу мысль. 

    Планируемая логика такая: 

    1. Политика на разрешение локальных или подписанных. 

    2. Запуск Main.ps1 инициируется GPO (следовательно с наивысшими правами)

    3. Main.ps1 копирует необходимые сценарии в %temp% -> запускает их из %temp% -> удаляет их из %temp% 

    С 2м пунктом будут вопросы так как этот скрипт так же попадает под политику выполнения скриптов, и если он будет неподписан - не выполнится

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

    Обсуждение про write-host тут


    The opinion expressed by me is not an official position of Microsoft

    3 сентября 2015 г. 11:47
    Модератор
  • Решил заморочиться с сертификатами, учитывая, что AD CA уже имеется. 

    1. Не понял какой вариант сертификата экспортировать, после его создания. Т.к. речь там идет про открытую часть сертификата. Файл с раширением .cer .При экспорте всего 2 варианта: Der encoded binary X.509 или Base-64 encoded X.509 - выбрал первый вариант DER.... 

    Ок. получил на руки файлик. 

    Иду по шагам из СТАТЬИ Вадима дойдя до этапа распространения в GPO - поймал некий ступор. 

    а) у меня не было политики Software Resriction Policies . Я ее создал. Ничего не трогая - в Additional Rules добавил файл этого сертификата. 

    б) открыв назначенные типы файлов - ужаснулся списку и не понял к чему он там. (т.е. Exe cmd и прочее, но нет ps1) удалил все - добавил ps1

    Вроде бы как все. Пора подписывать. Set-AuthenticodeSignature $file $cert

    где $cert = @(dir cert:\CurrentUser\My -codesigning)[0]

    Однако, у меня свежесозданный сертификат лежит не там, а в cert:\CurrentUser\TrustedPublisher и на codesigning не откликается! Ок. Решил внаглую впихнуть в переменную, с указанием имени. Получилось. Но подписать не дает! 

    Set-AuthenticodeSignature : Не удается преобразовать "System.Object[]" в тип "System.Security.Cryptography.X509Certificates.X509Certificate2", необходимый для параметра "Certificat
    e". Указанный метод не поддерживается.

    Психанул! Поставил в GPO для ExecutionPolicy параметр Unrestricted

    Попробовал запустить скрипт, а он Подтверждение спрашивает! "Действительно хотите запустить....?" Ну где справедливость?!

    Help! Хотя-бы по любому из вариантов! 

    3 сентября 2015 г. 15:33
  • Политику выполнения попробуйте "bypass"

    Тип сертификата (шаблон) должен быть codesign детали смогу уточнить завтра (нужно поклацать и вспомнить)

    По результатам отпишусь


    The opinion expressed by me is not an official position of Microsoft

    3 сентября 2015 г. 21:19
    Модератор
  • Политику выполнения попробуйте "bypass"

    Тип сертификата (шаблон) должен быть codesign детали смогу уточнить завтра (нужно поклацать и вспомнить)

    По результатам отпишусь


    The opinion expressed by me is not an official position of Microsoft

    Unrestricted в моем случае является Bypass. иных параметров Разрешить все - в ад нету. 

    Буду ждать ваши комменты. 

    p.s. тип шаблона был сделан именно codesign
    • Изменено TheShestov 3 сентября 2015 г. 21:27
    3 сентября 2015 г. 21:26
  • Удалось подписать скрипт! НО! 

    Сделать это получается только на машине с AD CA. Т.е. там, где созданный сертификат находится в папке cert:CurrentUser\my т.е. в CurrentUser -> Personal -> Certificates

    И только тогда корректно работает подпись, когда в объект $cert мы "впихнем" сертификат именно из этой папки. т.е.: 

    $cert = @(dir cert:\CurrentUser\My -codesigning)[0]

    Осталось разобраться как распространить сертификат в CurrentUser\My и понять надо ли это вообще делать. Или подписывать исключительно на одном сервере. 

    Далее по задаче буду пробовать реализовывать свою схему. 

    p.s. даже поместив вручную (на локальной машине) необходимый сертификат в контейнер CurrentUser\My - и попытавшись выполнить команду указанную выше - $cert остается пустым... Не понимаю почему, но пока есть возможность подписи только на AD CA


    • Помечено в качестве ответа TheShestov 4 сентября 2015 г. 10:59
    • Изменено TheShestov 4 сентября 2015 г. 11:09
    4 сентября 2015 г. 10:59
  • Если рутовый сертификат есть на конечных машинах то больше действий не требуется

    Запросить сертификат вы можете через оснастку сертификатов (MMC - добавить - Сертификаты - Пользователь - Запросить сертификат...)

    Подписывать скрипты вы можете на разных машинах но сертификат должен быть получен в ваше хранилище сертификатов

    ПС Не написал раньше так как СА  перегружается в связи с установкой обнов...


    The opinion expressed by me is not an official position of Microsoft


    4 сентября 2015 г. 11:06
    Модератор
  • Если рутовый сертификат есть на конечных машинах то больше действий не требуется

    Запросить сертификат вы можете через оснастку сертификатов (MMC - добавить - Сертификаты - Пользователь - Запросить сертификат...)

    Подписывать скрипты вы можете на разных машинах но сертификат должен быть получен в ваше хранилище сертификатов

    ПС Не написал раньше так как СА  перегружается в связи с установкой обнов...


    The opinion expressed by me is not an official position of Microsoft


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

    Хотя тесты с подписанным и не подписанным - уже прошел и пока что запуск скрипта с шары работает как надо, без лишних уведомлений :) ExecutionPolicy при этом в RemoteSigned

    4 сентября 2015 г. 14:16
  • Удалось реализовать задуманное. 

    Для тех, кому интересно решение для кейса: "Создать скрипт. Подписать скрипт. Выполнить запуск скрипта в GPO на компьютерах после загрузки системы" - я написал 3 статьи в своем блоге, как заметку для себя. На основе тех данных, которые мне давали в этой ветке и ссылках с других ресурсов. Всем спасибо! 

    Вот эти статьи: 

    GPO AD: Computer Startup scripts and Powershell (часть 1: Создание. Запуск)

    GPO AD: Computer Startup scripts and Powershell (часть 2: Создание своего сертификата. Подпись скриптов)

    GPO AD: Computer Startup scripts and Powershell (часть 3: PsExec. Ловим ошибки)

    • Помечено в качестве ответа TheShestov 10 сентября 2015 г. 12:02
    10 сентября 2015 г. 12:02