Je reviens vers vous après moultes années d'absence .
Voilà, je vais tenter d'expliquer la problèmatique qui m'amène a vous :
Je travail sur la création d'un service qui me permet d'effectuer tout un tas de chose en tâche de fond, sans interface utilisateur.
Mon service utilise les droits d'administration, et est démarré automatiquement au démarrage de l'OS.
Je trace tous mes évènements dans un fichier log, qui me permet de débugger (ou presque).
Bla bla bla , donc j'y arrive, la première problématique, qui n'est pas des moindre, je cherche à savoir si un utilisateur est connecté, j'avais dans un premier temps pensé utilisé les macros @username, oui, mais non, c'est un service, donc, mon @username est "Systèm", et donc ....
Dois-je prendre le problème dans l'autre sens, exécuter un fichier à l'ouverture du login qui trace les utilisateurs connectés ?
J'ai effectué quelques recherche avec mon ami gg, mais les réponses trouvées me font peur, j'arrive sur des truc _WinAPI_EnumDesktopWindows et je ne vois pas très bien ou cela va m'enmené , ou tout du moins, mes lacunes en informatique me rattrapent ...
Cerise sur la gâteau ... je cherche à lancer une application depuis le service , dans deux cas de figures , sur utilisateur connecté , et/ou non connecté (d'ou ma première demande) j'utilise la méthode _WinAPI_CreateDesktop qui fonctionne bien sur un utilisateur connecté , j'ai un joli fond orange , ou bleu , mais reste invisible sur l'écran de login, cependant l'exe fonctionne bien mais devient inaccessible ?? trop étrange.
Ce serait du à une protection de windows afin qu'une appli ne puisse interragir avec l'écran du login, mais bon ... elle tourne quand même .
Donc, comment puis-je préciser la session active ou pas sur laquelle j'envoie l'execution de mon fichier calc.exe ???
Voici le code d'envoie :
Code : Tout sélectionner
Func _Create_Desktop2()
Dim $hPrevStation = _WinAPI_GetProcessWindowStation()
logprint(" _Create_Desktop2 $hPrevStation:" & $hPrevStation)
Dim $hStation = _WinAPI_OpenWindowStation("WinSta0", $WINSTA_ALL_ACCESS)
logprint(" _Create_Desktop2 $hStation:" & $hStation)
If _WinAPI_SetProcessWindowStation($hStation) Then
logprint(" _Create_Desktop2 Current Window Station is WinSta0!")
EndIf
Dim $pText = _WinAPI_CreateString('default')
Dim $tProcess = DllStructCreate($tagPROCESS_INFORMATION)
Dim $tStartup = DllStructCreate($tagSTARTUPINFO)
DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
DllStructSetData($tStartup, 'Desktop', $pText)
If _WinAPI_CreateProcess('', @SystemDir & '\calc.exe', 0, 0, 0, $CREATE_NEW_PROCESS_GROUP, 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then
logprint(" _Create_Desktop2 attente !")
sleep(5000)
;~ ProcessWaitClose(DllStructGetData($tProcess, 'ProcessID'))
EndIf
_WinAPI_FreeMemory($pText)
If _WinAPI_SetProcessWindowStation($hPrevStation) Then
logprint(" _Create_Desktop2 Original Window Station restored!")
EndIf
EndFunc
Merki à vous !!!