[...] Service.au3 + Users connecté

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

[...] Service.au3 + Users connecté

#1

Message par stevanovich »

Bonjour à tous.
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 !!!
Modifié en dernier par Tlem le lun. 23 nov. 2015 18:31, modifié 1 fois.
Raison : Suppression de la coloration (réservée aux forums spécifiques)
Cordialement.
----------------------------
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [...] Service.au3 + Users connecté

#2

Message par jguinch »

Pour savoir si un utilisateur est connecté, tu peux lister les process explorer.exe avec ProcessList. Si tu veux connaitre le nom de l'utilisateur, tu peux utiliser _WinAPI_GetProcessUser
Pour l'ouverture de l'application dans la session tu user connecté, je ne sais pas trop. Moi j'essaierais du côté de _WinAPI_OpenProcessToken et _WinAPI_CreateProcessWithToken
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
stevanovich
Niveau 3
Niveau 3
Messages : 33
Enregistré le : dim. 17 janv. 2010 07:47
Localisation : Bretagne
Status : Hors ligne

Re: [...] Service.au3 + Users connectés

#3

Message par stevanovich »

jguinch a écrit :Pour savoir si un utilisateur est connecté,...
Merci pour ta réponse, je travail sur ta proposition, voici déjà un premier jus :

Code : Tout sélectionner

#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <WinAPI.au3>
#include <WinAPIProc.au3>

#RequireAdmin

Dim $MainLog = @ScriptDir & "\processlist.log"

Example()

Func Example()
    ; Run Notepad

    ; Display a list of Notepad processes returned by ProcessList.
    Local $aProcessList = ProcessList("explorer.exe")
    For $i = 1 To $aProcessList[0][0]
       $aData = _WinAPI_GetProcessUser($aProcessList[$i][1])
       logprint($aProcessList[$i][0] & "PID: " & $aProcessList[$i][1] & " User:" &  $aData[0] & " Domain:" &  $aData[1] & @CRLF )

    Next

    ; Close the Notepad window using the handle returned by WinWait.
    WinClose($hWnd)
 EndFunc   ;==>Example

 Func logprint($text, $nolog = 0)
    If $nolog Then
        MsgBox(0, "MyService", $text, 1)
    Else
        If Not FileExists($MainLog) Then FileWriteLine($MainLog, "Log created: " & @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
        FileWriteLine($MainLog, @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " [" & @AutoItPID & "] >> " & $text)
    EndIf
    Return 0
;~ ConsoleWrite($text & @CRLF)
EndFunc   ;==>logprint
 
Et voici les retours en chargeant les résultats de différents .exe

Code : Tout sélectionner

Log created: 2015/11/23 23:16:53
2015/11/23 23:16:53 [4692] >> winlogon.exePID: 2792 User:AUTORITE NT
2015/11/23 23:16:53 [4692] >> winlogon.exePID: 1712 User:AUTORITE NT
2015/11/23 23:19:20 [5672] >> winlogon.exePID: 2792 User:Système Domain:AUTORITE NT
2015/11/23 23:19:20 [5672] >> winlogon.exePID: 1712 User:Système Domain:AUTORITE NT
2015/11/23 23:20:04 [504] >> chrome.exePID: 1916 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 520 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 6000 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 3804 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 3276 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 2564 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 6068 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 5892 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 4652 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 5324 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 3856 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 4736 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 1228 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 3560 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 5032 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 4888 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 4712 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:20:04 [504] >> chrome.exePID: 4128 User:stevanovich Domain:MONPCAMOI
2015/11/23 23:22:21 [5788] >> explorer.exePID: 5356 User:stevanovich Domain:MONPCAMOI
 
Pourquoi 2 winlogon ?
Deux sessions ouvertes ... aucuns moyens de différencier les 2 ! ?
Deux explorer ... mais qu'un seul afficher, celui de la session en cours .
Tout ça mérite d'être analyser en profondeur, et aussi en tant que service, là, c'est du brut de fonderie.

En attendant, merci pour vos éventuelles suggestions .
Modifié en dernier par orax le mar. 24 nov. 2015 00:05, modifié 1 fois.
Raison : Suppression de la coloration syntaxique (réservée aux forums spécifiques)
Cordialement.
----------------------------
Répondre