【问题标题】:Powershell run job at startup with admin rights using ScheduledJobPowershell 在启动时使用 ScheduledJob 以管理员权限运行作业
【发布时间】:2016-04-25 16:59:07
【问题描述】:

为了减轻我的一些工作,我创建了一个 powershell 脚本,它需要:

  1. 在启动时运行。
  2. 以管理员权限运行,因为它必须写入 c:\program 文件夹。

我像这样使用 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 系统,但行为仍然是名称。我正在附上此作业的任务计划程序窗口的屏幕截图。

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

提前致谢!!

【问题讨论】:

  • 如果勾选“以最高权限运行”会怎样​​?
  • 即使这样也行不通
  • 尝试从您的作业触发器中删除 -RandomDelay 参数。只需使用 -AtStartup 看看它是否有效。
  • 您是否对 ScheduledTask 开放而不是 ScheduledJob?作业可以以 SYSTEM 而不是您的用户帐户运行吗?如果是这样,我相信我有适合您的解决方案。
  • 我的答案在这里被删除,因为它是相同的。所以,我只能建议看看我的答案here,因为它确实在做这件事。

标签: windows powershell startup


【解决方案1】:

这是我使用的已经投入生产的代码。如果它不适合您,您的系统肯定有其他问题。

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."
    }
}

【讨论】:

  • 如果新的任务主体是SYSTEM,这是否意味着由自动化作业创建的文件将归SYSTEM所有?我想以我自己的身份在启动时运行一个 powershell 脚本,但具有提升的管理员权限。我这样做的手动方式是在以我自己身份登录时以管理员权限运行 powershell shell,然后执行脚本。
  • 这对我有用,-Principal 解决了我的问题。我试图通过 powershell 为帐户管理员创建一个任务,并以普通用户身份登录。即使从任务计划程序手动执行任务也没有运行,并且一直说“任务尚未运行。 (0x41303)”在“上次运行结果”中。预定作业也一样。如果我在任务计划程序中进行编辑,它不会要求输入密码。添加主要参数修复它。添加“-Credential Administrator”也适用于计划作业,但通过 powershell 创建任务时会提示密码。
  • @KoryGill 我制作了一个名为msgbox.exe 的小程序,我的任务计划程序显示正在运行0x41301,但没有出现消息框。是关于程序还是只是消息框实用程序本身?
  • @arberg 这个呢
  • @turmuka 我不认为以系统/服务帐户运行的计划任务有一个用户可以看到任何 UI 的桌面。搜索该错误表明该任务可能正在运行,我的猜测是该应用程序只是坐在那里等待(但没有人可以与之交互以关闭它)。
【解决方案2】:

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

【讨论】:

【解决方案3】:

如果你想摆脱“电池”的废话,添加

-DontStopIfGoingOnBatteries -AllowStartIfOnBatteries

到 New-ScheduledTaskSettingsSet 选项。

因此,在 Kory Gill 的回答中,$settings 变为:

$settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -DontStopIfGoingOnBatteries -AllowStartIfOnBatteries

因此将创建任务以摆脱电池限制。

如果您只想修改现有任务,可以这样做:

Set-ScheduledTask -taskname "taskName" -settings $(New-ScheduledTaskSettingsSet -DontStopIfGoingOnBatteries -AllowStartIfOnBatteries)

或来自 cmd:

powershell -executionpolicy bypass Set-ScheduledTask -taskname "taskName" -settings $(New-ScheduledTaskSettingsSet -DontStopIfGoingOnBatteries -AllowStartIfOnBatteries)

【讨论】:

    【解决方案4】:

    请在任务计划程序中选中“以最高权限运行”复选框,然后重试。目前在上面的截图中它是未选中的。

    我在下面用红色圈出了它,以供您参考:

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2011-07-24
      • 2013-07-24
      • 1970-01-01
      • 2012-08-03
      • 2014-05-18
      • 2012-11-07
      • 2011-09-19
      • 2013-09-22
      相关资源
      最近更新 更多