Итак, я пытаюсь запустить сценарий PowerShell по расписанию. Каждое утро в 6 часов утра повторяйте каждый час дня. Вот сам сценарий:
Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {
Set-AdUser -Identity $_ -LogOnWorkstations $null
}
Теперь скрипт работает безупречно, когда я его выполняю сам. Но кажется, что скрипт не будет работать должным образом, когда его выполнение запланировано. Я думаю, что политика выполнения продолжает спрашивать, безопасно ли запускать скрипт до его запуска. Если кто-то еще согласен с тем, что это может быть причиной того, что скрипт не запускается сам по себе, не могли бы вы предоставить мне решение для обхода этого барьера?
Где запланированное задание? На GPO или на локальной машине? Находятся ли сценарий и машина, на которой он должен выполняться, в одной сети?
Попробуйте запланировать это так (если вы еще этого не сделали):
Programm/Script: PowerShell.exe
Arguments: -ExecutionPolicy Bypass -Command "& 'FilePathToScript.ps1'"
Изменить: также я не совсем уверен, что у вас должен быть установлен AD-PS-модуль на рабочей станции, где вы хотите запустить скрипт, потому что это может быть команда Set-ADUser
не может быть найден.
Политику выполнения легко проверить, можете ли вы запустить ее как скрипт, когда вы вошли в систему в обычном режиме? Если нет, то «set-Execution policy remotesigned», запуск из административного сеанса PowerShell установит это глобально для сервера HTE.
Пользователь, выполняющий запланированную задачу, должен иметь права «Вход в систему как пакетный» для машины, на которой она выполняется. учитывая, что это модуль AD, я предполагаю, что вы запускаете его на контроллере домена, и в этом случае вам нужно будет изменить объект групповой политики контроллера домена по умолчанию, чтобы назначить право «Вход в систему как пакетный» для вашего пользователя. Если это работает на рабочей станции или рядовом сервере с RSAT, вам необходимо использовать локальную политику безопасности, чтобы назначить это право (SecPol.MSC).
Пользователь, запускающий сценарий, должен иметь доступ к Active Directory до уровня, на котором он может изменять объекты пользователей. Обычно, если вы входите в систему на контроллере домена, у вас будет администратор домена, который даст вам это право, но если вы создали учетную запись службы, она может не иметь необходимых разрешений. Вам нужно будет изучить требуемый уровень разрешений и применить его к соответствующим областям вашего домена AD. Осторожнее с этим.
Могу поспорить, что это был вход в систему как пакетный, он меня ловил несколько раз и неочевидно, когда он вас останавливает.
Если вам нужно дополнительно изучить историю запланированных задач, вам может помочь вкладка «История запланированных задач» и программа просмотра событий.
Это будет что-то вроде этой программы / скрипта Powershell.exe
Аргумент и путь
-ExecutionPolicy Bypass -File "C:\alert.ps1"
Политика выполнения распространяется на всю машину. Если он работает в интерактивном режиме, маловероятно, что это будет проблемой при запуске как запланированной задачи.
Здесь вам не хватает информации. Вы не получите никакой информации с двумя командами и без регистрации. И вы не загружаете модуль 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())