Register-ScheduledJob 作为系统帐户(无需传入凭据)

red*_*888 5 windows powershell jobs scheduled-tasks

我相信Register-ScheduledTask您可以指定-User "System"或执行以下操作:

$principal = New-ScheduledTaskPrincipal -UserId SYSTEM -LogonType ServiceAccount -RunLevel Highest
Run Code Online (Sandbox Code Playgroud)

我该怎么做Register-ScheduledJob

此命令将运行本地管理员的上下文,因此它有权执行此操作。我只是在 cmdlet 中没有看到这个选项。

以下是如何使用计划任务 cmdlet 执行此操作的示例

编辑:windows 是否通过设计使这成为不可能?如果我打开一个交互式 PS 会话作为系统(使用 psexec)并尝试创建一个计划作业,我会收到一个错误:

PS C:\Windows\system32> Register-ScheduledJob -Name systemsssss -ScriptBlock {'s
dfsdfsdfsd'}
Register-ScheduledJob : An error occurred while registering scheduled job
definition systemsssss to the Windows Task Scheduler.  The Task Scheduler
error is: (32,4):UserId:.
At line:1 char:1
+ Register-ScheduledJob -Name systemsssss -ScriptBlock {'sdfsdfsdfsd'}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Power...edJobDefini
   tion:ScheduledJobDefinition) [Register-ScheduledJob], ScheduledJobExceptio
  n
    + FullyQualifiedErrorId : CantRegisterScheduledJobDefinition,Microsoft.Pow
   erShell.ScheduledJob.RegisterScheduledJobCommand
Run Code Online (Sandbox Code Playgroud)

当以本地管理员帐户运行时,同样的命令工作正常

it3*_*3xl 7

首先使用Register-ScheduledJob创建 PowerShell 作业。

然后使用Set-ScheduledTask将启动帐户更改为本地系统或任何其他内置帐户,即SYSTEMLOCAL SERVICENETWORK SERVICE等。

使用以下 PS 脚本。或者从我的GitHub下载Gist
代码是不言自明的(我相信)。
如果您想检查它是如何工作的,您可以在管理帐户下运行它多次。

顺便说一句,我更喜欢使用作业 ( Register-ScheduledJob) 而不是任务,因为作业允许我嵌入 PowerShell 脚本块(字符串)而不是使用外部脚本文件。看看-ScriptBlock下面。

还要注意-RunElevated。这是必须的。

$ErrorActionPreference = 'Stop'
Clear-Host

#### Start of Main Logic ###########################

$taskName = "my_PowerShell_job"

$accountId = "NT AUTHORITY\SYSTEM";
#$accountId = "NT AUTHORITY\LOCAL SERVICE";

$task = Get-ScheduledJob -Name $taskName  -ErrorAction SilentlyContinue
if ($task -ne $null)
{
    Unregister-ScheduledJob $task  -Confirm:$false
    Write-Host " @ The old ""$taskName"" PowerShell job has been unregistered"; Write-Host;
}

# Uncomment the following exit command to only delete your job.
# exit;

# Shchedule your job. Using of -AtStartup as an example.
$trigger = New-JobTrigger -AtStartup;

$options = New-ScheduledJobOption -StartIfOnBattery  -RunElevated;

Write-Host " @ Registering of ""$taskName"" job";
Register-ScheduledJob -Name $taskName  -Trigger $trigger  -ScheduledJobOption $options `
    -ScriptBlock {
        # Put your code here.
        Write-Host Your job has been launched!;
    }


$principal = New-ScheduledTaskPrincipal -UserID $accountId `
    -LogonType ServiceAccount  -RunLevel Highest;

$psJobsPathInScheduler = "\Microsoft\Windows\PowerShell\ScheduledJobs";
$someResult = Set-ScheduledTask -TaskPath $psJobsPathInScheduler `
    -TaskName $taskName  -Principal $principal

#### End of Main Logic ###########################

Write-Host;
Write-Host " @ Let's look at running account of ""$taskName"" PowerShell job"
$task = Get-ScheduledTask -TaskName $taskName
$task.Principal

Write-Host " @ Let's start ""$taskName"" manually"
Start-Job -DefinitionName $taskName | Format-Table

Write-Host " @ Let's proof that ""$taskName"" PowerShell job has been launched"; Write-Host;
Start-Sleep -Seconds 3
Receive-Job -Name $taskName
Write-Host;
Run Code Online (Sandbox Code Playgroud)


Tim*_*ntz 0

抱歉,声誉低于 50 时无法发表评论。

您可以使用组策略将其作为启动脚本运行吗?这将作为本地系统帐户运行。此 cmdlet 看起来没有 runas 的 -verb 参数。

查看: https: //technet.microsoft.com/en-us/library/hh849755.aspx,在 -ScheduledJobOption 下有一个设置 RunElevated=$False,这是默认设置。如果您将其设置为 true ,它会以管理员身份运行吗?

我没试过,可能有用。

希望这可以帮助。

谢谢,蒂姆。