Exécution de l'application GUI à distance dans Powershell
nous avons un composant personnalisé qui enveloppe certaines des fonctionnalités de powershell afin qu'il puisse être utilisé frim BizTalk 2006. Pour la plupart des opérations (vérification d'un chemin de fichier, copie ou déplacement d'un fichier) cela fonctionne très bien. Cependant, nous avons le besoin de démarrer une application GUI à distance pour faire un peu de traitement. Le composant lui-même gère la connexion à la boîte distante, tout ce que nous avons à faire est de définir quelques paramètres et ensuite de lui dire d'exécuter une commande
Start-Process -FilePath "path to exe" -ArgumentList "arguments for exe" -WorkingDirectory "workingdir for exe"
La question est: Si nous l'exécuter à partir d'un ligne de commande powershell sur la boîte elle-même, cela fonctionne bien. Cependant, lorsque nous l'activons à distance (à partir de BizTalk, à partir d'un harnais d'essai, même en utilisant une ligne de commande Powershell à distance et une connexion via Start-PSSession), cette application s'exécute brièvement puis sort sans faire quoi que ce soit. Je soupçonne que parce que l'exe en question a besoin d'une interface graphique pour exécuter le processus, c'est cela qui pose problème. J'ai tout essayé, y compris-NoNewWindow et-WindowStyle mais en vain. Toute aide pour que cela fonctionne serait très appréciée.
Note: Nous n'avons pas accès à la source de l'application que nous essayons d'exécuter car il s'agit d'une ancienne application win32, et aucune version par lots ou en ligne de commande de cette application n'a été fournie.
2 réponses
en utilisant les méthodes standard PowerShell (WinRM, WMI) vous ne pouvez pas lancer des applications avec GUI. La seule solution que je connaisse est d'utiliser PsExec from SysInternals (ou d'autres outils similaires). Il peut lancer des applications qui présentent GUI à l'utilisateur. Votre ligne de commande ressemble à ceci:
& ".\psexec" -accepteula -i "\computername" -u "domain\username" -p "password" "command line"
-accepteula
- accepter silencieusement CLUF.-i
- allow GUI.
D'autres solutions sont plus hacky, y compris l'ajout à distance de tâches à la planificateur.
depuis que je suis tombé sur ceci récemment, voici ma solution en utilisant la suggestion de Discord d'ajouter une tâche à distance. J'ai préféré le "hack" plutôt que d'avoir à configurer un outil séparé.
function Start-Process-Active
{
param
(
[System.Management.Automation.Runspaces.PSSession]$Session,
[string]$Executable,
[string]$Argument,
[string]$WorkingDirectory,
[string]$UserID,
[switch]$Verbose = $false
)
if (($Session -eq $null) -or ($Session.Availability -ne [System.Management.Automation.Runspaces.RunspaceAvailability]::Available))
{
$Session.Availability
throw [System.Exception] "Session is not availabile"
}
Invoke-Command -Session $Session -ArgumentList $Executable,$Argument,$WorkingDirectory,$UserID -ScriptBlock {
param($Executable, $Argument, $WorkingDirectory, $UserID)
$action = New-ScheduledTaskAction -Execute $Executable -Argument $Argument -WorkingDirectory $WorkingDirectory
$principal = New-ScheduledTaskPrincipal -userid $UserID
$task = New-ScheduledTask -Action $action -Principal $principal
$taskname = "_StartProcessActiveTask"
try
{
$registeredTask = Get-ScheduledTask $taskname -ErrorAction SilentlyContinue
}
catch
{
$registeredTask = $null
}
if ($registeredTask)
{
Unregister-ScheduledTask -InputObject $registeredTask -Confirm:$false
}
$registeredTask = Register-ScheduledTask $taskname -InputObject $task
Start-ScheduledTask -InputObject $registeredTask
Unregister-ScheduledTask -InputObject $registeredTask -Confirm:$false
}
}