Comment créé un service

Le
Jac
Bonjour j'ai un problème depuis plusieurs semaines que je n'arrive pas à
régler. Lorsque les usagers se log dans windows xp sp2 desfois le process
explorer.exe ne roule pas et on ne voit pas aucun icône et le taskbar. J'ai
essayé plusieurs trucs trouvé sur des forums à ce sujet sans succès.
J'avais pensé faire un service qui vérifie lorsqu'on se log si le process
explorer.exe fonctionne ou pas. Si il ne fonctionne pas alors on le lance.

J'ai utilisé le language autoit pour cela alors voici mon code


-
#include "ServiceControl.au3"

$servicename = "VerifyExplorer"
$ServiceExist = RegRead("HKLMSYSTEMCurrentControlSetServices" &
$servicename,"DisplayName")

IF $ServiceExist <> "VerifyExplorer" Then
_CreateService("", $servicename, $servicename,
"C:Verify_Explorersrvany.exe", "LocalSystem", "", 0x110)
RegWrite("HKLMSYSTEMCurrentControlSetServices" & $servicename &
"Parameters", "Application", "REG_SZ", @ScriptFullPath)
RegWrite("HKLMSYSTEMCurrentControlSetServices" & $servicename, "Type",
"REG_DWORD", 0x110)
EndIf

While Not ProcessExists("explorer.exe")
Run("explorer.exe")
Sleep(5000);
WEnd
Exit
-

Si je termine le process "explorer.exe" et que je lance se script, tout
fonctionne à merveille. Les icônes reviennent et la taskbar aussi. Mais si
je démarre le service, le process "explorer.exe" démarre mais il ne se passe
rien. Aucun icône et/ou taskbar apparait

Merci de m'aider

JF
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
moi
Le #673531
Salut,

Si je termine le process "explorer.exe" et que je lance se script,
tout fonctionne à merveille. (...)


Cela me semble normal :
TU lances le script qui lance, "en ton nom" explorer.exe

Mais si je démarre le service, le process "explorer.exe" (...)


est lancé par le service qui tourne sous l'autorité de l'utilisateur
SYSTEM
( je présume)
donc explorer ne tourne pas "pour toi" mais pour "system"
qui n'en a par ailleurs pas besoin et sans doute rien à faire ...

Donc l'idée risque de devenir une usine à gaz
puisque cela doit fonctionner pour un utilisateur à priori inconnu
utilisateur dont tu ignore aussi le mot de passe.
Le service ne peut donc pas lancer un processus à la place de
l'utilisateur...

Il me semble plus judicieux de chercher
pourquoi explorer.exe ne se lance pas à l'ouverture de session...
C'est plus que très suspect.

HB

Gilles LAURENT
Le #673530
"moi" news:
| Salut,

Bonsoir,

|| Si je termine le process "explorer.exe" et que je lance se script,
|| tout fonctionne à merveille. (...)
|
| Cela me semble normal :
| TU lances le script qui lance, "en ton nom" explorer.exe

Tout à fait !

|| Mais si je démarre le service, le process "explorer.exe" (...)
|
| est lancé par le service qui tourne sous l'autorité de l'utilisateur
| SYSTEM
| donc explorer ne tourne pas "pour toi" mais pour "system"
| qui n'en a par ailleurs pas besoin et sans doute rien à faire ...

Tout à fait !

| Donc l'idée risque de devenir une usine à gaz
| puisque cela doit fonctionner pour un utilisateur à priori inconnu
| utilisateur dont tu ignore aussi le mot de passe.
| Le service ne peut donc pas lancer un processus à la place de
| l'utilisateur...

En utilisant les API Win32 de permutation d'autorité / d'identité
(OpenProcessToken, DuplicateTokenEx, ImpersonateLoggedOnUser ...), un
service démarré sous l'autorité LocalSystem ou privilégié est en mesure
de lancer un processus sous l'autorité de l'utilisateur connecté
localement.

| Il me semble plus judicieux de chercher
| pourquoi explorer.exe ne se lance pas à l'ouverture de session...
| C'est plus que très suspect.

Tout à fait !

--
Gilles LAURENT
http://glsft.free.fr
Gilles LAURENT
Le #673528
"Jac" news:
| Bonjour,

Bonsoir,

| j'ai un problème depuis plusieurs semaines que je n'arrive
| pas à régler. Lorsque les usagers se log dans windows xp sp2 desfois
| le process explorer.exe ne roule pas et on ne voit pas aucun icône et
| le taskbar. J'ai essayé plusieurs trucs trouvé sur des forums à ce
| sujet sans succès. J'avais pensé faire un service qui vérifie
| lorsqu'on se log si le process explorer.exe fonctionne ou pas. Si il
| ne fonctionne pas alors on le lance.

Essayez de créer la clé de registre suivante :
HKLMSoftwareMicrosoftWindows NTCurrentVersionWinlogon
AutoRestartShell REG_DWORD (1)

Cela devrait forcer le redémarrage automatique du shell (explorer.exe
par défaut) après incident. Il est cependant indispensable de chercher
la cause du problème ... Je pense que cette clé est toujours valide sous
XP SP2 (à vérifier tout de même)

--
Gilles LAURENT
http://glsft.free.fr
M.Claveau
Le #673527
Bonsoir !

En complément de ce qui est été très justement dit, je rappelle, en
complément de l'instruction RUN d'AutoIt, l'instruction RUNASSET, qui
permet de choisir le compte utilisé pour lancer une application.

Pour plus de détails, voir l'aide en ligne.






--
@-salutations

Michel Claveau
moi
Le #673526
Notre ami Gilles LAURENT tapota :

(...)

En utilisant les API Win32 de permutation d'autorité / d'identité
(OpenProcessToken, DuplicateTokenEx, ImpersonateLoggedOnUser ...),
un
service démarré sous l'autorité LocalSystem ou privilégié est en
mesure de lancer un processus sous l'autorité de l'utilisateur
connecté localement.

(...)


Bon [soir | jour],

Je n'ai jamais utilisé ça ...
mais ça peut servir ...
pas uniquement pour un service, d'ailleurs ...

( j'ai qq idées de cas qui rendraient cette technique pratique...)

C'est sans doute un peu "technique" , non ?

HB

Jac
Le #673331
Bonjour Gilles

pouvez-vous me dire comment faire pour utilisé cela

En utilisant les API Win32 de permutation d'autorité / d'identité
(OpenProcessToken, DuplicateTokenEx, ImpersonateLoggedOnUser ...), un
service démarré sous l'autorité LocalSystem ou privilégié est en mesure
de lancer un processus sous l'autorité de l'utilisateur connecté
localement.


Je sais qu'il faut que je trouve le problème mais j'aimerais avoir une
solution temporaire pour que les usagers arrête de m'achaler avec ce
problème

Merci à tous de votre aide

JF


"Gilles LAURENT" news:enxN$
"moi" news:
| Salut,

Bonsoir,

|| Si je termine le process "explorer.exe" et que je lance se script,
|| tout fonctionne à merveille. (...)
|
| Cela me semble normal :
| TU lances le script qui lance, "en ton nom" explorer.exe

Tout à fait !

|| Mais si je démarre le service, le process "explorer.exe" (...)
|
| est lancé par le service qui tourne sous l'autorité de l'utilisateur
| SYSTEM
| donc explorer ne tourne pas "pour toi" mais pour "system"
| qui n'en a par ailleurs pas besoin et sans doute rien à faire ...

Tout à fait !

| Donc l'idée risque de devenir une usine à gaz
| puisque cela doit fonctionner pour un utilisateur à priori inconnu
| utilisateur dont tu ignore aussi le mot de passe.
| Le service ne peut donc pas lancer un processus à la place de
| l'utilisateur...

En utilisant les API Win32 de permutation d'autorité / d'identité
(OpenProcessToken, DuplicateTokenEx, ImpersonateLoggedOnUser ...), un
service démarré sous l'autorité LocalSystem ou privilégié est en mesure
de lancer un processus sous l'autorité de l'utilisateur connecté
localement.

| Il me semble plus judicieux de chercher
| pourquoi explorer.exe ne se lance pas à l'ouverture de session...
| C'est plus que très suspect.

Tout à fait !

--
Gilles LAURENT
http://glsft.free.fr




Jacques Barathon [MS]
Le #673089
"Jac" news:
Bonjour Gilles

pouvez-vous me dire comment faire pour utilisé cela

En utilisant les API Win32 de permutation d'autorité / d'identité
(OpenProcessToken, DuplicateTokenEx, ImpersonateLoggedOnUser ...), un
service démarré sous l'autorité LocalSystem ou privilégié est en mesure
de lancer un processus sous l'autorité de l'utilisateur connecté
localement.


Est-ce qu'un simple script d'ouverture de session ne permettrait pas
d'effectuer le test - et le cas échéant de lancer le process Explorer - dans
le contexte de l'utilisateur qui ouvre la session?

Jacques

Gilles LAURENT
Le #673088
"Jacques Barathon [MS]" message de
news:%
| Est-ce qu'un simple script d'ouverture de session ne permettrait pas
| d'effectuer le test - et le cas échéant de lancer le process Explorer
| - dans le contexte de l'utilisateur qui ouvre la session?

Solution pouvant être couplée à un watchdog WMI. Le script d'exemple
ci-dessous s'entête à redémarrer la calculatrice (calc.exe) lorsqu'une
instance de celle-ci est fermée. Le script doit être lancé sous
l'autorité de l'utilisateur connecté via par exemple un script
d'ouverture de session (logonscript ou gpo)

+++ Usage
> WScript WatchDog.vbs

--- Coupez ici : WatchDog.vbs ---
Sub Event_OnObjectReady (o, oAsyncContext)
If o.TargetInstance.Name = "calc.exe" Then
CreateObject ("WScript.Shell").Run (o.TargetInstance.CommandLine)
End If
End Sub

Set oWmi = GetObject("winmgmts:")
Set oEvent = WScript.CreateObject ("WbemScripting.SWbemSink", "Event_")
oWmi.ExecNotificationQueryAsync oEvent, _
"SELECT * FROM __InstanceDeletionEvent WITHIN 1" & _
"WHERE TargetInstance ISA 'Win32_Process'"

' boucle infinie
' tout repose maintenant sur les évènements WMI
While True: WScript.Sleep (1000*60): Wend
--- Coupez ici : WatchDog.vbs ---

--
Gilles LAURENT
http://glsft.free.fr
Jac
Le #673085
Bonjour Gilles, j'ai mis le code que vous m'avez donné dans un fichier .vbs
et rien ne se passe

Merci de m'aider


"Gilles LAURENT" news:%
"Jacques Barathon [MS]" message de
news:%
| Est-ce qu'un simple script d'ouverture de session ne permettrait pas
| d'effectuer le test - et le cas échéant de lancer le process Explorer
| - dans le contexte de l'utilisateur qui ouvre la session?

Solution pouvant être couplée à un watchdog WMI. Le script d'exemple
ci-dessous s'entête à redémarrer la calculatrice (calc.exe) lorsqu'une
instance de celle-ci est fermée. Le script doit être lancé sous
l'autorité de l'utilisateur connecté via par exemple un script
d'ouverture de session (logonscript ou gpo)

+++ Usage
> WScript WatchDog.vbs

--- Coupez ici : WatchDog.vbs ---
Sub Event_OnObjectReady (o, oAsyncContext)
If o.TargetInstance.Name = "calc.exe" Then
CreateObject ("WScript.Shell").Run (o.TargetInstance.CommandLine)
End If
End Sub

Set oWmi = GetObject("winmgmts:")
Set oEvent = WScript.CreateObject ("WbemScripting.SWbemSink", "Event_")
oWmi.ExecNotificationQueryAsync oEvent, _
"SELECT * FROM __InstanceDeletionEvent WITHIN 1" & _
"WHERE TargetInstance ISA 'Win32_Process'"

' boucle infinie
' tout repose maintenant sur les évènements WMI
While True: WScript.Sleep (1000*60): Wend
--- Coupez ici : WatchDog.vbs ---

--
Gilles LAURENT
http://glsft.free.fr




Jacques Barathon [MS]
Le #673084
"Jac" news:%
Bonjour Gilles, j'ai mis le code que vous m'avez donné dans un fichier
.vbs et rien ne se passe


Le script d'ouverture de session pourrait contenir le code suivant (pas du
VBScript, du simple batch comme les aime Michel):

--- test-explorer.cmd ---
tasklist /fi "imagename eq explorer.exe" | find "explorer"
if errorlevel 1 explorer
--- test-explorer.cmd ---

A tester. Il peut y avoir un problème de temporisation, et peut-être
devras-tu ajouter une boucle qui ne se termine qu'une fois le process
Explorer effectivement lancé.

Jacques

Publicité
Poster une réponse
Anonyme