我有一个Powershell脚本来添加新的计划任务。它用于启动PS1文件,其中包括对本地SQL框和远程SQL框的一些SQL查询。
如果此脚本创建了计划,我必须手动进行一次更改才能生效:我必须设置选项"运行用户是否登录"。
这是功能:
function createschedule {
$startdatetime = (get-date).AddMinutes(1).ToString("HH:mm")
$taskName = "My Bestest Schedule"
$action = New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument '-file "C:\mypath\bin\mypowershellscript.ps1"'
$trigger = New-ScheduledTaskTrigger -Once -At $startdatetime
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable
echo ""
echo "Adding Basic parameterized task..."
Register-ScheduledTask -TaskName $taskName -Trigger $trigger -Action $action -Setting $settings -User "Administrator" -description "Sitewatch v2 Collector" -RunLevel 1 | Out-null
$trigger.RepetitionInterval = (New-TimeSpan -Minutes 1)
$trigger.RepetitionDuration = (New-TimeSpan -Days 1000)
echo "Adding trigger to the new task..."
Set-ScheduledTask $taskName -Trigger $trigger | Out-Null
echo ""
}
当脚本创建条目时,该命令会运行并弹出一个窗口几秒钟。它仍然有效,但只有在登录时才能使用。如果我手动切换设置,它可以正常退出。
我尝试/考虑的事情:
-logontype ServiceAccount
有一个开关,但似乎无法正常工作#$principal = New-ScheduledTaskPrincipal -GroupID "BUILTIN\Administrators"
但也有错误看看这篇文章,我无法确定我需要什么:How to set schedule.service "Run whether user is logged on or not" in Powershell?
此外,微软似乎只是说拥有一个Principal,无论用户是否登录,它都可以运行任务,但它对我不起作用:
详细说明New-ScheduledTaskPrincipal cmdlet创建一个 包含计划任务主体的对象。使用计划任务 在指定的安全上下文下运行任务的principal 帐户。使用计划任务主体时,任务计划程序可以 无论该帐户是否已登录,都可以运行该任务。
在此处找到:https://technet.microsoft.com/en-us/library/jj649825.aspx
THX。
答案 0 :(得分:3)
我做了一些搜索并得到了一些很好的例子。
function createschedule {
$startdatetime = (get-date).AddMinutes(1).ToString("HH:mm")
$jobname = "My bestest Schedule"
$repeat = (New-TimeSpan -Minutes 1)
$action = New-ScheduledTaskAction –Execute "$pshome\powershell.exe" -Argument '-file "C:\mypath\bin\mypowershellscript.ps1"'
$duration = ([timeSpan]::maxvalue)
$trigger = New-ScheduledTaskTrigger -Once -At $startdatetime -RepetitionInterval $repeat -RepetitionDuration $duration
$msg = "Enter the username and password that will run the task";
$credential = $Host.UI.PromptForCredential("Task username and password",$msg,"$env:userdomain\$env:username",$env:userdomain)
$username = $credential.UserName
$password = $credential.GetNetworkCredential().Password
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd
Register-ScheduledTask -TaskName $jobname -Action $action -Trigger $trigger -RunLevel Highest -User $username -Password $password -Settings $settings | out-null
echo ""
}
我认为我的问题是“运行是否用户登录”无法设置,除非真正的用户使用完整的密码。使用上面的代码,我提示输入凭据(这是我的用例的理想选择),并用于注册。 “是否登录用户运行”设置现在已正确设置。
答案 1 :(得分:0)
您可以直接使用SCHTASKS.exe
命令,如下所示。
$newtask = {SCHTASKS /create /v1 /s $ComputerName /ru "Administrator" /rp "MyPlanTextPass" /sc once /tn "My BesTest Schedule" /st "23:00:00" /tr "C:\Temp\Test.bat"}
Invoke-Command $newtask
我没有其他任务安排cmdlet尝试任何其他任务,所以我想我会把它作为一个选项。