Question Forcer l'exécution de programme

Plus d'informations
il y a 16 ans 4 mois #5584 par LAPO
Bonjour,

Le powershell m'interssant, je me suis lancé dans un autre script. ;)
Après les imprimantes, les programmes.
Le but de ce script est de démarrer un programme lorsque un autre est lancé.(ça j'ai réussi enfin je pense :unsure: )
Le problème est qu'il faut lancer le script à la main.

Je voudrai donc qu'il y ai comme un service qui tourne en permanance et qui vérifie que le programme est lancé ou pas.

Voici le script que j'ai commencé à faire.

[code:1]#######################################################################
#
# Lancement programme lors de l'exécutution d'un autre
#
#######################################################################

#Récupération des process en cours d'exécution
Get-Process | ForEach{

#Vérification si le programme ONENOTE est lancé
if($_.ProcessName -eq 'ONENOTE')
{

#Si ONENOTE est lancer alors on vérifie que notepad++ n'est pas lancé
Get-Process | ForEach{
if($_.ProcessName -ne 'notepad++'){

#Si notepad++ n'est pas lancé on l'exécute
Start-Process 'C:\Program Files\Notepad++\notepad++.exe'
}
}
}
}[/code:1]

ONENOTE et notpad++ ne sont que des exemples !

N.B : Sur le même principe peut-on empécher quelqu'un d'accéder à un programme tant qu'un autre n'est pas lancé.

Merci d'avance,<br><br>Message édité par: Arnaud, à: 12/11/09 00:28

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5588 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Exécution de programme
Salut,
avant d'aller plus loin, quelle version de PowerShell utilises-tu ?
Il va vous falloir le préciser désormais.
tsunamidream écrit:

Le but de ce script est de démarrer un programme lorsque un autre est lancé.

Si je comprend bien, tu veux réagir à un événement particulier qui est l'exécution d'un process, c'est bien ça ?

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5611 par LAPO
Réponse de LAPO sur le sujet Re:Exécution de programme
Salut,

Je pense que je suis en v1.0 (c'est le powershell fourni avec windows 7 ;) ).

Le but de ce script est effectivement de réagir à un événement de type exécution d'un process.

Une autre petite chose : (encore :ohmy: )
J'ai un script qui s'exécute tout les jours pour vérifier l'espace disque dispo sur les serveurs. Le problème est qu'il lui faut un User/Password du domaine pour fonctionner correctement.
J'ai utilisé \&quot;Get-Credential\&quot; mais il me demande à chaque fois le User/Password. J'aimerai que ce soit prè-enregistrer !

Merci.
Cordialement,

P.S : J'ai commencé à lire le livre, j'espère donc m'améloirer rapidement.:)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5613 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Exécution de programme
tsunamidream écrit:

Je pense que je suis en v1.0 (c'est le powershell fourni avec windows 7 ;) ).

Dns ce cas, c'est la v2. Voir la variable automatique $PSVersionTable.

tsunamidream écrit:

Le but de ce script est effectivement de réagir à un événement de type exécution d'un process

D'accord, mais quand tu dis :
tsunamidream écrit:

Je voudrai donc qu'il y ai comme un service qui tourne en permanance et qui vérifie que le programme est lancé ou pas.

Tu veux que cela soit hors PowerShell ou tu t'autorises à exécuter PowerShell ? Et dans un process dédié ou pas ?
Dans le premier cas WMI peut t'aider, voir le chapitre 10.2.1 Création d’un client basé sur le provider CommandLineEventConsumer .

Dans le second cas, en v2 tu peux coupler WMI et les events.
Mais cela sera du code \&quot;avancé\&quot;, rien de complexe, faut juste savoir où tu mets les pieds ;)

tsunamidream écrit:

Une autre petite chose

Tu devrais ouvrir un autre post dédié.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5616 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Exécution de programme
Une première approche en V2 :
[code:1]
#Si CMD est lancé alors on vérifie que notepad est lancé
if ((Get-Process -name 'Cmd' -ea \&quot;SilentlyContinue\&quot;«») -ne $null)
{ #oui, on démarre notepad++ s'il n'est pas lancé
if ((Get-Process -name 'notepad' -ea \&quot;SilentlyContinue\&quot;«») -eq $null)
{ Start-Process 'notepad.exe'}
}

$Query = \&quot;select * from __InstanceCreationEvent within 1 where targetinstance isa 'Win32_Process' and targetinstance.name=Notepad.exe\&quot;
$sbAction={
#Evénement déclenché
Write-Warning \&quot;Sender\&quot;
#type de $args[0] =System.Management.ManagementEventWatcher
Write-Properties $args[0]
Write-Warning \&quot;EventArguments Context\&quot;
#type de $args[1] =EventArrivedEventArgs System.Management.ManagementEventWatcher
Write-Properties $args[1].Context
Write-Warning \&quot;EventArguments NewEvent\&quot;
Write-Properties $args[1].NewEvent
Write-Warning \&quot;EventArguments NewEvent\&quot;
Write-Properties $args[1].NewEvent.TargetInstance
}

Register-WMIEvent -query \&quot;Select * From __InstanceCreationEvent within 3 Where TargetInstance ISA 'Win32_Process'\&quot; -sourceIdentifier \&quot;NouveauProcess\&quot; –action ($sbAction -as [Scriptblock])
[/code:1]
Le code et l'affichage du scriptblock $sbAction est verbeux à dessein.
Le premier problème est que ce n'est pas vraiment synchrone, cf. pooling, le second c'est que la requête spécifiée pour Register-WMIEvent ne tient pas compte du filtre sur le nom de process. L'événement est déclenché pour chaque process, en tout cas sur mon poste Xp sp3+ Posh V2. je n'ai pas testé sous Windows 7.

Du coup je me suis dit qu'essayer une approche dotnet ne serais pas inutile :
[code:1]
#----A la dotnet sous PowerShell
#Lire les remarques sur la page suivante :
# community.bartdesmet.net/blogs/bart/arch...2006/08/30/4366.aspx
$sbPI={
Unregister-Event \&quot;ProcessInfo.Exited\&quot; -ea \&quot;SilentlyContinue\&quot;
$ProcessInfo=Start-Process \&quot;notepad.exe\&quot;
Register-ObjectEvent $ProcessInfo Exited -SourceIdentifier ProcessInfo.Exited –action ($sbPI -as [Scriptblock])
}

#Démarre \&quot;l'auto surveillance\&quot;
&amp;$sbPI
#Si on ferme PS ce mécanisme est rompu.
[/code:1]
:woohoo:
C'est à valider, mais j'ai un faible pour cette concision.

Un grand bravo à l'équipe de dev de PowerShell !
PowerShell v2? Un shell avec des gros morceaux de puissance dedans :P

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.048 secondes
Propulsé par Kunena