Запланированная задача для скрипта Powershell

Запланированная задача для скрипта Powershell

Итак, я пытаюсь запустить скрипт powershell по расписанию. Каждое утро в 6 утра, повторять каждый час дня. Вот сам скрипт:

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

Теперь скрипт работает безупречно, когда я сам его запускаю. Но похоже, что скрипт не запустится должным образом, когда его выполнение запланировано. Я думаю, что политика выполнения постоянно спрашивает, безопасно ли запускать скрипт перед его запуском. Если кто-то еще согласен, что это может быть причиной того, что скрипт не может запуститься сам по себе, не могли бы вы предоставить мне решение, как обойти этот барьер?

решение1

Где находится запланированная задача? На GPO или на локальной машине? Скрипт и машина, на которой он должен запускаться, находятся в одной сети?

Попробуйте составить график следующим образом (если вы еще этого не сделали):

Programm/Script: PowerShell.exe

Arguments: -ExecutionPolicy Bypass -Command "& 'FilePathToScript.ps1'"

Редактировать: Я также не совсем уверен, нужно ли устанавливать AD-PS-Module на рабочей станции, где вы хотите запустить скрипт, поскольку может случиться так, что команда Set-ADUserне будет найдена.

решение2

Политику выполнения легко проверить, можете ли вы запустить ее как скрипт, когда вы вошли в систему обычным образом? Если нет, то 'set-execution policy remotesigned', запущенный из административного сеанса PowerShell, установит ее глобально для сервера.

Пользователь, который выполняет запланированную задачу, должен иметь права «Logon As Batch» на машине, на которой она запущена. Учитывая, что это модуль AD, я предполагаю, что вы запускаете это на контроллере домена, в этом случае вам нужно будет изменить GPO контроллера домена по умолчанию, чтобы назначить право «Log on as Batch» вашему пользователю. Если это запущено на рабочей станции или сервере-участнике с RSAT, вам нужно использовать локальную политику безопасности, чтобы назначить это право (SecPol.MSC).

Пользователь, запускающий скрипт, должен иметь доступ к Active Directory на уровне, на котором он может изменять объекты пользователя. Обычно, если вы входите в контроллер домена, у вас будет администратор домена, который предоставит вам это право, но если вы создали учетную запись службы, у нее может не быть нужных разрешений. Вам нужно будет изучить требуемый уровень разрешений и применить его к соответствующим областям вашего домена AD. Будьте осторожны с этим.

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

Если вам необходимо более подробно изучить вопрос, вам может помочь вкладка «История запланированных задач» или средство просмотра событий.

решение3

Политика выполнения распространяется на всю машину. Если она работает интерактивно, то вряд ли это станет проблемой при запуске в качестве запланированной задачи.

Чего вам здесь не хватает, так это информации. Вы не получите никакой информации с двумя командами и без регистрации. И вы не загружаете модуль Active Directory, так что это может объяснить некоторые вещи.

Вот пример того, как запустить скрипт PowerShell в качестве запланированной задачи и записать вывод:

Program/Script: PowerShell  
Arguments:  
-NonInteractive -WindowStyle minimized -c "powershell -c C:\Apps\AppName\SomeScript.ps1 -verbose > C:\Apps\AppName\Logs\SomeScript.log 2>&1"  

Вот пример загрузки модуля Active Directory:

$startTime = Get-Date
$logDateFormat = "yyyy-MM-dd HH:mm:ss"
[console]::WriteLine("{0} Loading Active Directory Module", [datetime]::Now.ToString($logDateFormat))
import-module ActiveDirectory  

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {  
    [console]::WriteLine("{0} Clearing workstations for user: {1}", [datetime]::Now.ToString($logDateFormat), $_)
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

$endTime = Get-Date
[console]::WriteLine("{0} Finished.  Time Required: {1}", [datetime]::Now.ToString($logDateFormat), $endTime.Subtract($startTime).ToString())

решение4

Это будет что-то вроде этой программы/скрипта Powershell.exe Аргумент и путь

 -ExecutionPolicy Bypass -File "C:\alert.ps1"

введите описание изображения здесь

Связанный контент