Question
Forcer l'exécution de programme
- LAPO
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 23
- Remerciements reçus 0
il y a 16 ans 4 mois #5584
par LAPO
Forcer l'exécution de programme a été créé 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
)
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
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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 4 mois #5588
par Laurent Dardenne
Tutoriels PowerShell
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:
avant d'aller plus loin, quelle version de PowerShell utilises-tu ?
Il va vous falloir le préciser désormais.
tsunamidream écrit:
Si je comprend bien, tu veux réagir à un événement particulier qui est l'exécution d'un process, c'est bien ça ?Le but de ce script est de démarrer un programme lorsque un autre est lancé.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- LAPO
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 23
- Remerciements reçus 0
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
)
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é \"Get-Credential\" 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.
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
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é \"Get-Credential\" 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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 4 mois #5613
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Exécution de programme
tsunamidream écrit:
tsunamidream écrit:
tsunamidream écrit:
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 \"avancé\", rien de complexe, faut juste savoir où tu mets les pieds
tsunamidream écrit:
Dns ce cas, c'est la v2. Voir la variable automatique $PSVersionTable.Je pense que je suis en v1.0 (c'est le powershell fourni avec windows 7
).
tsunamidream écrit:
D'accord, mais quand tu dis :Le but de ce script est effectivement de réagir à un événement de type exécution d'un process
tsunamidream écrit:
Tu veux que cela soit hors PowerShell ou tu t'autorises à exécuter PowerShell ? Et dans un process dédié ou pas ?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.
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 \"avancé\", rien de complexe, faut juste savoir où tu mets les pieds
tsunamidream écrit:
Tu devrais ouvrir un autre post dédié.Une autre petite chose
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 4 mois #5616
par Laurent Dardenne
Tutoriels PowerShell
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 \"SilentlyContinue\"«») -ne $null)
{ #oui, on démarre notepad++ s'il n'est pas lancé
if ((Get-Process -name 'notepad' -ea \"SilentlyContinue\"«») -eq $null)
{ Start-Process 'notepad.exe'}
}
$Query = \"select * from __InstanceCreationEvent within 1 where targetinstance isa 'Win32_Process' and targetinstance.name=Notepad.exe\"
$sbAction={
#Evénement déclenché
Write-Warning \"Sender\"
#type de $args[0] =System.Management.ManagementEventWatcher
Write-Properties $args[0]
Write-Warning \"EventArguments Context\"
#type de $args[1] =EventArrivedEventArgs System.Management.ManagementEventWatcher
Write-Properties $args[1].Context
Write-Warning \"EventArguments NewEvent\"
Write-Properties $args[1].NewEvent
Write-Warning \"EventArguments NewEvent\"
Write-Properties $args[1].NewEvent.TargetInstance
}
Register-WMIEvent -query \"Select * From __InstanceCreationEvent within 3 Where TargetInstance ISA 'Win32_Process'\" -sourceIdentifier \"NouveauProcess\" –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 \"ProcessInfo.Exited\" -ea \"SilentlyContinue\"
$ProcessInfo=Start-Process \"notepad.exe\"
Register-ObjectEvent $ProcessInfo Exited -SourceIdentifier ProcessInfo.Exited –action ($sbPI -as [Scriptblock])
}
#Démarre \"l'auto surveillance\"
&$sbPI
#Si on ferme PS ce mécanisme est rompu.
[/code:1]

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
[code:1]
#Si CMD est lancé alors on vérifie que notepad est lancé
if ((Get-Process -name 'Cmd' -ea \"SilentlyContinue\"«») -ne $null)
{ #oui, on démarre notepad++ s'il n'est pas lancé
if ((Get-Process -name 'notepad' -ea \"SilentlyContinue\"«») -eq $null)
{ Start-Process 'notepad.exe'}
}
$Query = \"select * from __InstanceCreationEvent within 1 where targetinstance isa 'Win32_Process' and targetinstance.name=Notepad.exe\"
$sbAction={
#Evénement déclenché
Write-Warning \"Sender\"
#type de $args[0] =System.Management.ManagementEventWatcher
Write-Properties $args[0]
Write-Warning \"EventArguments Context\"
#type de $args[1] =EventArrivedEventArgs System.Management.ManagementEventWatcher
Write-Properties $args[1].Context
Write-Warning \"EventArguments NewEvent\"
Write-Properties $args[1].NewEvent
Write-Warning \"EventArguments NewEvent\"
Write-Properties $args[1].NewEvent.TargetInstance
}
Register-WMIEvent -query \"Select * From __InstanceCreationEvent within 3 Where TargetInstance ISA 'Win32_Process'\" -sourceIdentifier \"NouveauProcess\" –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 \"ProcessInfo.Exited\" -ea \"SilentlyContinue\"
$ProcessInfo=Start-Process \"notepad.exe\"
Register-ObjectEvent $ProcessInfo Exited -SourceIdentifier ProcessInfo.Exited –action ($sbPI -as [Scriptblock])
}
#Démarre \"l'auto surveillance\"
&$sbPI
#Si on ferme PS ce mécanisme est rompu.
[/code:1]
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
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.047 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Forcer l'exécution de programme