我有一个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:mypathbinmypowershellscript.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 ""
}
当脚本创建条目时,命令运行并弹出一个窗口几秒钟。它仍然有效,但只有在登录时才有效。如果我手动切换设置,它在注销时也能正常工作。
我尝试过/考虑过的事情:
- 已将用户更改为NETWORKSERVICE或SYSTEM,但这些用户在执行查询时无法使用SQL进行身份验证
- 我找到了一个开关
-logontype ServiceAccount
,但似乎不起作用 - 我尝试使用"Principal"部分:
#$principal = New-ScheduledTaskPrincipal -GroupID "BUILTINAdministrators"
,但也会出现错误 - 最后,我不能简单地提供密码,因为这将在不同的盒子上运行,这些盒子有不同的管理员密码(或我设置的任何管理员使用)
看到这篇文章,我无法确定我需要什么:如何设置schedule.service;无论用户是否登录都运行";在Powershell中?
此外,微软似乎说,只要有一个委托人,无论用户是否登录,它都可以运行任务,但对我来说不起作用:
详细描述New-ScheduledTaskPrincipal cmdlet创建对象,该对象包含计划任务主体。使用计划任务主体在指定的安全上下文下运行任务账户使用计划任务主体时,任务调度器可以运行该任务,无论该帐户是否已登录。
在此处找到:https://technet.microsoft.com/en-us/library/jj649825.aspx
Thx。
我做了更多的搜索,得到了一些好的例子。
function createschedule {
$startdatetime = (get-date).AddMinutes(1).ToString("HH:mm")
$jobname = "My bestest Schedule"
$repeat = (New-TimeSpan -Minutes 1)
$action = New-ScheduledTaskAction –Execute "$pshomepowershell.exe" -Argument '-file "C:mypathbinmypowershellscript.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 ""
}
我相信我的问题是,除非使用了完整的密码,否则无法设置"无论用户是否登录都运行"。使用上面的代码,我会提示输入凭据(这非常适合我的用例),并用于注册。设置"无论用户是否登录都运行"现在设置正确。
您可以直接将SCHTASKS.exe
与以下命令一起使用吗。
$newtask = {SCHTASKS /create /v1 /s $ComputerName /ru "Administrator" /rp "MyPlanTextPass" /sc once /tn "My BesTest Schedule" /st "23:00:00" /tr "C:TempTest.bat"}
Invoke-Command $newtask
我没有其他任务调度cmdlet来尝试其他任何东西,所以我想我会把它作为一个选项。