无法设置“运行用户是否登录”

时间:2015-02-13 19:25:37

标签: sql powershell task scheduler

我有一个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 ""
}

当脚本创建条目时,该命令会运行并弹出一个窗口几秒钟。它仍然有效,但只有在登录时才能使用。如果我手动切换设置,它可以正常退出。

我尝试/考虑的事情:

  • 将用户更改为NETWORKSERVICE或SYSTEM,但在执行查询时无法通过SQL进行身份验证
  • 我发现-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。

2 个答案:

答案 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尝试任何其他任务,所以我想我会把它作为一个选项。