环境:Server 2019 域控制器。
我有一个简单的脚本,可以梳理我的 AD 用户并禁用过去 35 天内未登录的任何人(组织策略)。看起来像这样:
Get-ADUser -Filter * -Properties Name,Lastlogontimestamp,PasswordNeverExpires | Where-Object {([datetime]::FromFileTime($_.lastlogontimestamp) -le (Get-Date).adddays(-35)) -and ($_.passwordNeverExpires -ne "true") } | Disable-ADAccount
如果我手动运行它,它会起作用 - 遍历整个过程,找到 35 天以上未使用过的人并将其关闭。
我最初尝试使用 Task Scheduler 直接调用此脚本,但它不起作用 - 任务将永远“运行”但脚本永远不会执行,因为我知道尚未使用的用户帐户(这是一个得到在手动运行中标记并且我重新启用以测试预定版本)不会重新禁用。
我尝试修改脚本以关闭执行策略(然后在最后重新打开),但这也无济于事。
我确实找到了对我有一点帮助的指南: https ://community.spiceworks.com/how_to/17736-run-powershell-scripts-from-task-scheduler
我没有调用脚本,而是调用 powershell,然后将 Set-ExecutionPolicy Bypass 和脚本的位置(现在位于 C:\ 上)传递给它。这是一个轻微的改进,因为虽然脚本仍然没有实际运行(晴雨表帐户没有再次禁用),但任务最终停止并声称它成功运行(0x1 代码)。
凭据对于它运行的域管理员帐户是正确的,并且它被设置为以最高权限运行(无论我是否登录,尽管我在测试这个的整个过程中都登录了)。
我不知所措——每个单独的元素似乎实际上都在“工作”——脚本完全起作用,调度程序执行并“完成”——但组合产品却没有。
我哪里错了?我在使用批处理文件时没有遇到过类似的问题,所以我怀疑在使用 PowerShell 执行此操作时我忽略了另一个因素。
好吧,我好像明白了。我使用的文章有点误导。
与文章不同,我的“Arguments”字段不能简单地写成:
Set-ExecutionPolicy Bypass "C:\script.ps1"
相反,您还必须使用 -File 参数,因此“Arguments”框显示为:
Set-ExceutionPolicy Bypass -File "C:\script.ps1"
当我这样做时,它以代码 0x0(实际成功)结束,应该禁用的帐户实际上已禁用。计划任务运行大约需要 3 分 20 秒(而早期的故障似乎是无限的)。