因此,我尝试按计划运行 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
执行策略很容易检查,您可以在正常登录时将其作为脚本运行吗?如果不能,则从管理 powershell 会话运行的“set-execution policy remotesigned”将为 hte 服务器全局设置该策略。
执行计划任务的用户需要对运行该任务的计算机具有“以批处理身份登录”权限。鉴于这是一个 AD 模块,我假设您在域控制器上运行它,在这种情况下,您将需要修改默认域控制器 GPO 以将“以批处理身份登录”权限分配给您的用户。如果这是在具有 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())