it-roy-ru.com

Скрипт Powershell не запускается с помощью запланированных задач

У меня есть небольшой скрипт на контроллере домена, который настроен для отправки мне по электронной почте SMTP о последнем событии безопасности 4740.

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

Сценарий выглядит следующим образом:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

$Event = Get-EventLog -LogName Security -InstanceId 4740 -Newest 5
$MailBody= $Event.Message + "`r`n`t" + $Event.TimeGenerated

$MailSubject= "Security Event 4740 - Detected"
$SmtpClient = New-Object system.net.mail.smtpClient
$SmtpClient.Host = "smtp.domain.com"
$MailMessage = New-Object system.net.mail.mailmessage
$MailMessage.from = "[email protected]"
$MailMessage.To.add("toemail.domain.com")
$MailMessage.IsBodyHtml = 1
$MailMessage.Subject = $MailSubject
$MailMessage.Body = $MailBody
$SmtpClient.Send($MailMessage)

Запланированная задача настраивается следующим образом:

RunsAs:LOCAL SYSTEM

Trigger: On event - Log: Security, Event ID: 4740

Action:  Start Program - C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

  Argument:  -executionpolicy bypass c:\path\event4740.ps1

Я также попробовал следующее:

Trigger: On event - Log: Security, Event ID: 4740

Action:  Start Program - C:\path\event4740.ps1

Согласно истории задач: задание запущено, действие начато, процесс создан, задание выполнено, задание выполнено. Я просмотрел несколько различных ссылок на сайте с одной и той же «проблемой», но все они, похоже, имеют какую-то переменную, которой у меня нет. Я также попробовал некоторые из упомянутых решений, думая, что они могут быть несколько связаны, но увы ничего не работает. Я даже пытался удалить мою запланированную задачу и сбросить ее, как указано здесь: http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task -scheduler-to-run-a-windows-powershell-script.aspx

Кто-нибудь сталкивался с этим типом ошибки раньше или знает, как обойти эту проблему?

Поиск проблемы:

Я решил попробовать позвонить .bat файл через запланированное задание. Я создал простой файл, который отображал бы текущую дату/время в отслеживаемой папке. Запустив файл вручную и выполнив задачу, вызванную событием 4740, мы достигли желаемых результатов. Изменение файла .bat вместо вызова файла .ps1 работало вручную. При активации события 4740, теперь .bat больше не будет работать.

17
ThinkSpace

Найден успешный обходной путь, который применим для моего сценария:

Не выходите, просто заблокируйте сеанс!

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

Благодаря некоторой помощи по устранению неполадок от Коул, я подумал о функции RunAs и решил попытаться обойти неработающие входы в систему.

Начиная с планировщика задач, я удалил свои созданные вручную задачи. Используя новую функцию в Server 2008 R2, я перешел к событию безопасности 4740 в средстве просмотра событий и использовал щелчок правой кнопкой мыши> Присоединить задачу к этому событию ... и следовал подсказкам, указывая на мой сценарий на странице действий. После создания Задачи я заблокировал сеанс и разорвал соединение с Консолью удаленного рабочего стола. С профилем "Заблокировано" и не вышло из системы все работает как надо.

1
ThinkSpace

Измените свое действие на:

powershell -noprofile -executionpolicy bypass -file C:\path\event4740.ps1

На сервере Windows 2008 R2: в планировщике задач на вкладке «Общие» - Убедитесь, что у пользователя «Запуск от имени» установлена ​​учетная запись с правами, необходимыми для выполнения сценария. 

Кроме того, я считаю, что у вас отключена опция «Запускать только когда пользователь вошел в систему». Измените это на «Запускать, вошел ли пользователь в систему или нет». Оставьте флажок «Не хранить пароль» отключенным, и вам, вероятно, понадобится пометить «Запуск с самыми высокими привилегиями».

26
Cole9350

Хотя вы, возможно, уже нашли решение своей проблемы, я все же собираюсь опубликовать эту заметку, чтобы помочь кому-то еще. Я столкнулся с подобной проблемой .... Я в основном использовал другую учетную запись домена для тестирования и сравнения. Задача работала нормально с проверкой «Запустить, вошел ли пользователь в систему или нет». 

Несколько вещей, чтобы иметь в виду и убедиться в:

  1. Учетная запись, используемая для выполнения задачи, должна иметь права «Вход в систему как пакетное задание» в соответствии с локальной политикой безопасности сервера (или быть членом локальной группы администраторов). Вы должны указать учетную запись, необходимую для запуска скриптов/файлов bat.
  2. Убедитесь, что вы вводите правильные символы пароля
  3. Задачи в 2008 R2 не запускаются в интерактивном режиме, особенно если вы запускаете их как «Запускать, вошел ли пользователь в систему или нет». Это, скорее всего, приведет к сбою, особенно если в сценарии вы ищете какие-либо объекты\ресурсы, специфичные для профиля пользователя, когда задача была создана, так как сеанс powershell потребует эту информацию для запуска, в противном случае она начнется и сразу же закончится . В качестве примера для определения $ Path при запуске скрипта как «Запускать, вошел ли пользователь в систему или нет», и я указываю подключенный диск. Он будет искать этот диск при запуске задачи, но поскольку учетная запись пользователя, проверенная для запуска задачи, не зарегистрирована, и в сценарии вы ссылаетесь на источник\объект, с которым он должен работать, нет, задача не будет просто прервите . сопоставленный диск (\ сервер\общий ресурс) x:\vs. фактический UNC-путь\сервер\общий ресурс
  4. Просмотрите ваши шаги, сценарий, аргументы. Иногда самая маленькая часть может иметь большое значение, даже если вы проделали этот процесс много раз. Я несколько раз пропускал символ при вводе пароля или точку с запятой, иногда при создании скрипта или задачи.

Проверьте эту ссылку, и мы надеемся, что вы или кто-то еще можете воспользоваться этой информацией: https://technet.Microsoft.com/en-us/library/cc722152.aspx

4
Prognox

Для достижения функциональности «Запуск от имени администратора» я установил флаг:

-ExecutionPolicy Bypass

Который, кажется, вступает в силу только при выполнении файлов Powershell . Поэтому я поместил свою команду в файл .ps1, запустил ее с -ExecutionPolicy Bypass, и теперь моя запланированная задача работает так, как ожидалось.

Program: Powershell.exe
Add Arguments: -ExecutionPolicy Bypass -File C:\pscommandFile.ps1
2
Case 303

В дополнение к советам, приведенным выше, я получал ошибку и нашел решение по следующей ссылке http://blog.vanmeeuwen-online.nl/2012/12/error-value-2147942523-on-scheduled.html .

Также это может помочь:

В планировщике задач щелкните свойства запланированного задания, а затем настройки.

В последнем из перечисленных вариантов: ", Если задача уже выполняется, применяется следующее правило:" Выберите "остановить существующий экземпляр" из раскрывающегося списка.

1
Denis Besic

Я думаю, что ответ на это тоже актуально:

Почему моя запланированная задача корректно обновляет свое «Время последнего выполнения» и выдает «Результат последнего запуска», равный «(0x0)», но все еще фактически не работает?

Summary: Запланированные задачи Windows 2012 делают not просмотр правильных переменных среды, включая PATH, для учетной записи, для которой задание настроено для запуска. Но вы можете проверить это, и если это происходит, и когда вы поймете, что происходит, вы можете обойти это.

1
Mike Beaton

Если у вас есть эта проблема под WIN 10, это может решить вашу проблему, как это было для меня. Обновление испортило планировщик задач.

http://answers.Microsoft.com/en-us/windows/forum/windows_10-performance/anniversary-update-version-1607-build14393-breaks/d034ab52-5d49-4b92-976a-a1355b5a6e6d?page=2

Этот комментарий решил мою проблему.

«Ваш совет о« одноразовых »задачах работает отлично - в качестве обходного пути его будет достаточно, пока MS не решит проблему. Насколько я вижу, единственное преимущество «ежедневно» - это отсутствие произвольной даты, связанной со временем выполнения. Для других может быть непонятно, почему задание должно начинаться в день Х ».

Настройки триггера «Einmal» означает «единовременно», «Sofort» означает «Сразу»

0
Hacktor teh Horrid

Пожалуйста, убедитесь, что аргументы в нижнем регистре, как указано Cole9350

0
Jasmin

У меня была очень похожая проблема, я держал окно VSC со скриптом powershell все время, когда запускал задачу расписания вручную. Просто закрыл его и он начал работать как положено.

0
Viral

В моем случае (та же проблема) помогло добавить -NoProfile в аргументы команды действия задачи и поставить галочку «Запускать с наивысшими привилегиями», потому что на моем сервере UAC включен (активен).

Подробнее об этом введите описание ссылки здесь

0
Ebodas

Если у вас нет сообщений об ошибках и вы не знаете, в чем проблема - почему сценарии PowerShell не хотят запускаться из запланированной задачи, выполните следующие шаги, чтобы получить ответ:

  1. Запустите CMD от имени пользователя, для которого задана запланированная задача, чтобы выполнить сценарий PowerShell. 
  2. Перейдите в папку, где находится сценарий PowerShell
  3. Выполните сценарий PowerShell (удалите все операторы, которые блокируют уведомления об ошибках, если таковые имеются внутри сценария, например $ ErrorActionPreference = 'silentlycontinue')

Вы должны быть в состоянии увидеть все уведомления об ошибках.

В случае с одним моим сценарием это было:

"Не удалось найти тип [System.ServiceProcess.ServiceController]. Убедитесь, что сборка, содержащая этот тип, загружена."

И в этом случае мне нужно добавить дополнительную строку в начале скрипта для загрузки отсутствующей сборки:

Add-Type -AssemblyName "System.ServiceProcess"

И следующие ошибки:

Исключение, вызывающее «GetServices» с аргументом (ами) «1»: «Не удается открыть диспетчер управления службами на компьютере». Эта операция может потребовать других привилегий ».

выберите: свойство не может быть обработано, потому что свойство "имя базы данных" уже существует

0
Tomasz Wieczorkowski

Наконец-то я бродил два дня, чтобы найти решение:

1) Сделать так, чтобы powershell.exe запускался от имени администратора

  1. щелкните правой кнопкой мыши значок powershell.exe 
  2. нажмите на свойства под сочетанием клавиш 
  3. нажмите на кнопку «вперед», проверьте запуск от имени администратора Проверено.

2) в окне планировщика задач под областью актина и следующий скрипт как новая команда

%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NonInteractive -ExecutionPolicy Bypass -noexit -File "C:\ps1\BackUp.ps1"
0
MUhammad Samiul Haq

У меня была почти такая же проблема, как эта, но немного другая на Server 2012 R2. У меня есть скрипт PowerShell в планировщике заданий, который копирует 3 файла из одного места в другое. Если я запускаю скрипт вручную из powershell, он работает как шарм. Но при запуске из планировщика задач он копирует только первые 2 маленьких файла, а затем зависает на 3-м (большой файл). И я также получаю результат «Оператор или администратор отклонил запрос». И я сделал почти все на этом форуме.

Вот сценарий и как я это исправил для меня. Может не работать для других, но на всякий случай:

Сценарий. .__ 1. Скрипт Powershell в планировщике заданий 2. Запустил, используя учетную запись домена, который является локальным администратором на сервере 3. Выбрано «Запускать, вошел ли пользователь в систему или нет» 4. Запускать с наивысшими привилегиями

Fix:. .__ 1. Мне пришлось войти на сервер, используя учетную запись домена, чтобы он создал локальный профиль в C:\Users . 2. Проверено и сделано пользователем, что пользователь имеет доступ ко всем дискам, на которые я ссылался в моем скрипте

Я считаю, что № 1 является основным решением для меня. Я надеюсь, что это работает для других там.

0
Glen

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

После того как я создал свой сценарий Power Shell (xyz.ps1), я открыл его в блокноте для последующего редактирования. Поэтому Windows установила связь между моим файлом xyz.ps1 с notepad.exe, и планировщик пытался запустить мой сценарий Power Shell (xyz.ps1) с notepad.exe в фоновом режиме, а не выполнять его в Powershell. Я обнаружил эту проблему, уделив пристальное внимание разделу «Показать все запущенные задачи» в планировщике, который показал, что notepad.exe используется для запуска сценария xyz.ps1. Чтобы убедиться в этом, я щелкнул правой кнопкой мыши по файлу xyz.ps1 в проводнике Windows, зашел в «Свойства», и он показал Блокнот напротив раздела «Открывает с». Затем я изменил «Открыть с помощью» на% SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe. Это добилось цели. Теперь планировщик должен выполнить мой xyz.ps1 с помощью powershell.exe и дать мне желаемые результаты.

Чтобы найти файл powershell.exe, обратитесь к этой статье: https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations

0
RaviB