3 votes

Comment puis-je invoquer un processus en avant-plan à partir d'un job PowerShell en arrière-plan ?

Je travaille sur un script PowerShell qui fournit une sortie console et redémarre le système plusieurs fois pendant le fonctionnement du script. Dès qu'il démarre, il s'enregistre en tant que tâche planifiée afin de pouvoir reprendre là où il s'est arrêté après les redémarrages :

$JobArgs = @(
    $ScriptPath
    ($ArgumentList -join ' ')
)

$JobScript = {
    param(
        [string] $ScriptPath,
        [string] $Arguments
    )

    $PSArgs = @(
        '-NoExit'
        '-NoLogo'
        '-NoProfile'
        "-File $ScriptPath $Arguments"
    )

    Start-Process powershell.exe -ArgumentList $PSArgs -Wait
}

$AtLogonTrigger = New-JobTrigger -AtLogOn -User $LoginUser

$JobProperties = @{
    'Name'               = $JobName
    'Trigger'            = $AtLogonTrigger
    'ScheduledJobOption' = New-ScheduledJobOption -RunElevated
    'ScriptBlock'        = $JobScript
    'ArgumentList'       = $JobArgs
}

$Job = Register-ScheduledJob @JobProperties -ErrorAction Stop

Cependant, bien que cela fasse ce que je veux, cela se fait en arrière-plan alors que je préférerais que la fenêtre PowerShell soit visible. Il ne semble pas non plus qu'il s'agisse d'une caractéristique intrinsèque de PowerShell ; il suffit de lancer la commande notepad.exe via Start-Process fournit également une instance cachée du bloc-notes.

Bien que je sois conscient que je ne devrais probablement pas me fier à la sortie de la console, c'est suffisant pour mes besoins.

Existe-t-il un moyen d'invoquer un processus de premier plan à partir d'un travail en arrière-plan ?

2voto

Todd Points 2342

Ce comportement est voulu. Les tâches PowerShell et les tâches planifiées de Windows s'exécutent en arrière-plan (Session 0) et ne doivent pas/ne doivent pas interagir avec le bureau de l'utilisateur.

Les tâches PowerShell ne sont en fait que des tâches planifiées de Windows, que vous pouvez trouver à l'adresse suivante :

\Microsoft\Windows\PowerShell\ScheduledJobs

La seule façon d'exécuter une tâche planifiée pour interagir avec la session de bureau est de définir : Run only when user is logged on

Avec schtasks.exe vous utiliseriez le /IT commutateur

Le site ScheduledJobOptions dans les cmdlets PowerShell ne semblent pas vous permettre de le spécifier.

Vous pouvez donc essayer de trouver manuellement les tâches planifiées correspondant à votre job PowerShell et modifier cette propriété.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X