Powershell使用ScheduledJob在启动时使用管理员权限运行作业

时间:2016-04-25 16:59:07

标签: windows powershell startup

为了简化我的一些工作,我创建了一个PowerShell脚本,需要:

  1. 在启动时运行。
  2. 以管理员权限运行,因为必须在c:\ program files文件夹中写入。
  3. 我使用PowerShell创建了启动服务,如下所示:

    function MakeStartupService
    {
        Write-Host "Adding script as a startup service"
        $trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:15
        Try
        {
          Register-ScheduledJob -Trigger $trigger -FilePath "absolute_path" -Name "Job-name" -EA Stop
        }
        Catch [system.exception]
        {
            Write-Host "Looks like an existing startup service exists for the same. Overwriting existing job"
            Unregister-ScheduledJob "Job-name"
            Register-ScheduledJob -Trigger $trigger -FilePath "absolute_path" -Name "Job-name"
        }
    }
    

    作业已成功注册为启动服务,并且在任务计划程序中可见。如果我使用Start-Job -DefinitionName Job-name启动它,或者通过右键单击任务计划程序启动它,它可以正常工作,但它不会在Windows启动时启动。

    目前我正在我的个人Windows 10系统上测试这个,并检查了另一个Windows 10系统,但行为仍然是名称。我正在为此作业添加任务调度程序窗口的屏幕截图。 enter image description here

    对不起,如果这个问题听起来重复或愚蠢(我是powershell的初学者),但请相信我,我在网上找到的解决方案都没有为此工作。

    提前致谢!!

4 个答案:

答案 0 :(得分:13)

这是我正在使用的生产代码。如果它对您不起作用,您的系统必须还有其他功能。

function Invoke-PrepareScheduledTask
{
    $taskName = "UCM_MSSQL"
    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
    if ($task -ne $null)
    {
        Unregister-ScheduledTask -TaskName $taskName -Confirm:$false 
    }

    # TODO: EDIT THIS STUFF AS NEEDED...
    $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File "C:\Invoke-MYSCRIPT.ps1"'
    $trigger = New-ScheduledTaskTrigger -AtStartup -RandomDelay 00:00:30
    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8

    $principal = New-ScheduledTaskPrincipal -UserId SYSTEM -LogonType ServiceAccount -RunLevel Highest

    $definition = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger -Settings $settings -Description "Run $($taskName) at startup"

    Register-ScheduledTask -TaskName $taskName -InputObject $definition

    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue

    # TODO: LOG AS NEEDED...
    if ($task -ne $null)
    {
        Write-Output "Created scheduled task: '$($task.ToString())'."
    }
    else
    {
        Write-Output "Created scheduled task: FAILED."
    }
}

答案 1 :(得分:1)

如果有效,则不是脚本问题。将其分配给SYSTEM帐户或创建单独的服务帐户,而不是显示的Gagan帐户。确保服务帐户具有"作为批处理作业运行的权限"在您的本地安全策略中。

答案 2 :(得分:0)

请选中" 以最高权限运行"的复选框。对于任务计划程序中的任务,请重试。目前在上面的屏幕截图中,它未经检查。

我在下面用红色圈出来以方便您的参考: checkbox required checked

答案 3 :(得分:0)

以下是来自Microsoft的博客文章,如果您的计划任务未运行,您可以查看该文章:https://blogs.technet.microsoft.com/askperf/2015/02/18/help-my-scheduled-task-does-not-run/

正如其他答案中所提到的,它也说:

  
      
  • 尝试使用SYSTEM帐户运行脚本
  •