使用 ScheduledJob 以管理员权限启动时的 Powershell 运行 作业
Powershell run job at startup with admin rights using ScheduledJob
为了简化我的一些工作,我创建了一个 powershell 脚本,它需要:
- 运行 启动时。
- 运行 具有管理员权限,因为它必须写入 c:\program files 文件夹。
我像这样使用 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 系统中进行了测试,但行为仍然存在。我附上了这项工作的任务调度程序 window 的屏幕截图。
抱歉,如果这个问题听起来重复或愚蠢(我是 powershell 的初学者),但请相信我,none 我在网上找到的解决方案对此有效。
提前致谢!!
请在任务计划程序中为该任务勾选“运行 具有最高权限”复选框,然后重试。目前在上面的屏幕截图中它是未选中的。
为了方便大家参考,我在下面用红圈圈了起来:
如果有效,则不是脚本问题。将其分配给 SYSTEM 帐户或创建一个单独的服务帐户而不是显示的 Gagan 帐户。确保服务帐户在您的本地安全策略中具有 "Permission to run as batch job"。
这是我使用的已经在生产中的代码。如果它不适合你,你的系统肯定有其他问题。
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."
}
}
如果您想摆脱“使用电池”的废话,请添加
-DontStopIfGoingOnBatteries -AllowStartIfOnBatteries
到 New-ScheduledTaskSettings 设置选项。
因此,在 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)
为了简化我的一些工作,我创建了一个 powershell 脚本,它需要:
- 运行 启动时。
- 运行 具有管理员权限,因为它必须写入 c:\program files 文件夹。
我像这样使用 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 系统中进行了测试,但行为仍然存在。我附上了这项工作的任务调度程序 window 的屏幕截图。
抱歉,如果这个问题听起来重复或愚蠢(我是 powershell 的初学者),但请相信我,none 我在网上找到的解决方案对此有效。
提前致谢!!
请在任务计划程序中为该任务勾选“运行 具有最高权限”复选框,然后重试。目前在上面的屏幕截图中它是未选中的。
为了方便大家参考,我在下面用红圈圈了起来:
如果有效,则不是脚本问题。将其分配给 SYSTEM 帐户或创建一个单独的服务帐户而不是显示的 Gagan 帐户。确保服务帐户在您的本地安全策略中具有 "Permission to run as batch job"。
这是我使用的已经在生产中的代码。如果它不适合你,你的系统肯定有其他问题。
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."
}
}
如果您想摆脱“使用电池”的废话,请添加
-DontStopIfGoingOnBatteries -AllowStartIfOnBatteries
到 New-ScheduledTaskSettings 设置选项。
因此,在 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)