none
Alerte lorsque un user n'est pas connecté RRS feed

  • Question

  • Bonjour à tous,

    J'ai, sur un de mes serveurs 2012R2, l'obligation d'avoir une session d'un certain utilisateur toujours ouverte (antériorité par forcement voulue). J'aimerais un moyen d'être alerté quand ce user n'est pas connecté, par mail à intervalle régulier par exemple.

    C'est très important, cela bloque la production dans mon entreprise.

    Si quelqu'un à une solution, un script ou autre, je suis preneur.

    Merci a tous !

    Cordialement

    Torpyl

    mercredi 21 octobre 2020 09:51

Réponses

  • J'ai réussit à trouver ce qui me convient, je vous le met a la suite 

    Param(
            $emailSmtpServer     = "smtp.local.com",
            $emailSmtpServerPort = "587",
            $emailSmtpUser       = "alerte@domain.com",
            $emailSmtpPass       = "Password",
            $emailFrom           = "alerte@domain.com",
            $emailTo             = "infra@domain.com",
            #$emailTo2             ="",
            $emailSubject        = "Session "user" fermée" 
        )
    
     
    
    query session /server:localhost
    
     
    
    $Resultat = query session "user" /server:localhost
    
     
    
    
    if ($Resultat)
    {
    # Ne rien faire
    }
    ELSE
    {
        $emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo )
        $emailMessage.Subject = $emailSubject
        $emailMessage.IsBodyHtml = $true
    
     
    
        $emailMessage.Body = "La session "user" semble être fermée sur le serveur, merci de controler" 
    
     
    
        $SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer, $emailSmtpServerPort )
        $SMTPClient.EnableSsl = $true
        $SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );
        $SMTPClient.Send( $emailMessage )   
    }

    Merci a tous pour votre temps et vos solution !

    Cordialement

    • Proposé comme réponse M dakhama jeudi 22 octobre 2020 14:57
    • Marqué comme réponse torpyl jeudi 22 octobre 2020 15:02
    jeudi 22 octobre 2020 13:59

Toutes les réponses

  • Bonjour,

    Vous voulez dire surveillée la personne ? Car y a des outils qui permettent de le faire.

    Nous avons pas pkus de détails sur votre cas.

    Precisez si vous voulez savoir quand il se déconnecte ? Ou il verrouille le poste ? Et comment il est connecté rdp ??


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 11:28
  • En gros c'est un compte systeme, il doit continuellement etre connecté, mais il arrive que la session soit fermée...

    J'aimerais un outils qui surveille et qui m'indique quand cette session n'est pas ouverte.

    mercredi 21 octobre 2020 11:30
  • Maintenant ce que je vous propose c'est de mettre un script a la fermeture de session.

    Apres on connaît pas votre poste dans l'entreprise ?

    Mais nous faisons pas des scripts à la demande, au moins pour moi et la plupart des membres


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi


    • Modifié M dakhama mercredi 21 octobre 2020 11:32
    mercredi 21 octobre 2020 11:31
  • je suis l'admin sys de l'entreprise..

    je ne demande pas forcément un script, peut etre une analyse de l'event viewer... j'avoue que je seche...

    mercredi 21 octobre 2020 11:34
  • Ah, ok, s'il s'agit d'un compte système, on taidera.

    Je pensais que c'était un compte utilisateur, que tu voulais surveiller


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 11:40
  • Ah non je ne surveille pas les connexions de mes users ;)

    C'est bien un compte de service qui doit etre constamment lancé... en gros il permet l'execution de tache plannifiée pour un soft metier... je deplore assez cette utilisation mais comme dit plus haut c'est une anteriorité et le presta metiers ne veut rien changer...

    mercredi 21 octobre 2020 11:42
  • Si on peut avour pkus de details, sur ce compte ?

    C'est un compte utilisateur ? Sur l'ad comment il est déclaré ?

    Que fais t-il au juste ? Lancer une applis, services ??? 

    Et vous voulez empêcher quoi ? Que la session soit verrouilker ou fermer ? Car une session ouverte ne se ferme pas toute seule sur un serveur apart s'il y a quelqu'un d'autres qui se connecte en dépassant le nombre maximul de connection, et encore


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 11:43
  • c'est un compte basique, déclaré dans l'ad avec des droits particuliers, il lance des services et des taches planifiées.

    Je ne veux rien empeché, seulement etre alerté quand la session n'est pas ouverte. En effet, certains admins peuvent se connecter avec et executer des taches, mais en aucun cas ils ne doivent fermer cette session, seulement la verrouiler... Malheureusement les consignes ne sont pas toujours respectées...

    mercredi 21 octobre 2020 11:45
  • Alors c'est facile,

    Vous partez dans les logs, vous auditez la fermeture de session, et vous attacher un script à cette événements, qui écrit quelque choses quelque part ou vous envoies un mail.


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 11:59
  • j'y ai pensé, malheureusement d'après ce que j'ai vu, si j'audit la fermeture de session, donc un événement, je serais avertit de toutes les fermetures de session, et non seulement de celle qui m'interesse.

    j'ai raison ?

    (ps : je suis une bille en script je vais devoir ecumer le web :D)

    mercredi 21 octobre 2020 12:03
  • Non, tu peux auditer la fermeture de session en filtrant sur le compte qui t'intéresse.

    Y a t-il pas un autre admin dans votre boite piur faire cela, ce n'est pas forcément un script, c'est deux lignes

    Je suis pas devant l'ordi actuellement pour tester,

    Mais regardes si  tes admins n'arrivent pas, montres nous ce que tu as trouvésur le net on pourra t'onrienter


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 13:11
  • je vais pouvoir me debrouiller pour trouver l'event, cependant je ne vois pas comme filtrer sur l'evenement specifique sur la session...

    Je trouverais bien un script d'envoi de mail par la suite...

    Il n'y a pas d'autres admin malheureusement...

    mercredi 21 octobre 2020 13:20
  • Je pense me baser sur l’événement suivant ::

    Nom du journal :Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
    Source :       Microsoft-Windows-TerminalServices-LocalSessionManager
    Date :         21/10/2020 15:27:10
    ID de l’événement :24
    Catégorie de la tâche :Aucun
    Niveau :       Information
    Mots clés :    
    Utilisateur :  Système
    Ordinateur :   Server.domain.local
    Description :
    Services Bureau à distance : session déconnectée :

    Utilisateur : domaine.local\user
    ID session : 6
    Adresse réseau source : LOCAL
    XML de l’événement :
    <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
      <System>
        <Provider Name="Microsoft-Windows-TerminalServices-LocalSessionManager" Guid="{5D896912-022D-40AA-A3A8-4FA5515C76D7}" />
        <EventID>24</EventID>
        <Version>0</Version>
        <Level>4</Level>
        <Task>0</Task>
        <Opcode>0</Opcode>
        <Keywords>0x1000000000000000</Keywords>
        <TimeCreated SystemTime="2020-10-21T13:27:10.777759500Z" />
        <EventRecordID>19093</EventRecordID>
        <Correlation ActivityID="{61A55000-55E5-1017-0000-000000000000}" />
        <Execution ProcessID="964" ThreadID="2856" />
        <Channel>Microsoft-Windows-TerminalServices-LocalSessionManager/Operational</Channel>
        <Computer>serveur.domaine.local</Computer>
        <Security UserID="S-1-5-18" />
      </System>
      <UserData>
        <EventXML xmlns="Event_NS">
          <User>domaine.local\user</User>
          <SessionID>6</SessionID>
          <Address>LOCAL</Address>
        </EventXML>
      </UserData>
    </Event>

    Cela vous semble correct ?

    mercredi 21 octobre 2020 13:32
  • Oui, tu peux filtrer avec le nom d'utilisateur

    S'il egale à : système bah faire le nécessaire


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 13:59
  • Je n'arrive pas a filtrer sur l'utilisateur via le planificateur de tache... Sur l'event directement cela m'indique chaque deconnexion pour tous les users, si je filtre sur l'utilisateur je ne recois rien...

    mercredi 21 octobre 2020 14:15
  • Ah non, 

    Tu nous filtreras que par script powershell, car le fichier généré c'est en xml

    Il faut un script lié à l'événement, qui lis l'événement, l'analyse et te prévient. 


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 14:18
  • oh la... je ne script pas le moins du monde a mon grand désarroi... il va falloir écumer le net a la recherche d'un script..

    Merci pour les infos en tout cas !

    mercredi 21 octobre 2020 14:22
  • Ecoutes j'ai une idée, filtre par rapport a l'id de session : le 6 dans ton cas

    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 14:33
  • L'événement que tu as marqué, n'est pas le bon, filtre sur l'événement d'ouverture de session.


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 14:35
  • Pourquoi l'evenement d'ouverture de session ? je cherche bien a etre alerté quand la session se ferme..

    Comment filtrer sur le sessionid ?

    mercredi 21 octobre 2020 14:36
  • J'ai trouvé, y a plus simple, crees un script et attache le à la gpo local, gpedit, dans utilisateur, script fermeture de session et le tour est joué

    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 14:36
  • C'etait effectivement ma premiere vision, mais je n'ai pas la repetition du mail tant que la session n'est pas ouverte....

    Je chercher a perfectionner..

    mercredi 21 octobre 2020 14:38
  • Y a encore plus simple, empecher la fermeture de session, en cachant le vouton qui permet de le faire

    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 14:56
  • Ce n'est pas le but recherché...
    mercredi 21 octobre 2020 14:58
  • Bonjour Torpyl

    J'ai déjà eu ce cas de figure : Un gus vient m'installer une app, puis après il lance une série de 7 fichiers .bat qui démarrent les différents modules de l'app. Si on ferme la session, ça kill l'app bien entendu. Bilan : même problématique que toi, + à chaque reboot il fallait rouvrir la session, lancer les .bat et verrouiller.  J'ai renvoyé le gus dans ces 22, en lui disant qu'il fallait faire tourner son appli et ses différents modules comme des services. C'est un serveur pas un poste de travail. Je lui ai donné une piste pour encapsuler ses app dans des vrais serviced Windows.  Il est revenu 3 semaines plus tard,  il installe l'app et 1 seul service (qui lance tous les modules). Service démarrage auto et roule. Même pas besoin de compte de domaine pour le service, SYSTEM suffisait (mais ça n'aurait pas été gênant si c'était autrement)

    Il y a plein d'outils pour ça. Je me souviens qu'il y a avait un outil dans le ressource kit qui permettait de le faire (servany ou quelque chose comme ça) sinon il y a aussi la possibilité de lancer les app en tâche planifiée et la faire tourner comme un service

    J'ai trouvé un petit lien pour illustrer cela : https://www.bogotobogo.com/Powershell/How_to_Run_Exe_as_a_Service_in_Windows_Server_2012.php

    Enfin, il y a un vieil outil DOS (sc.exe) qui existe encore (même sur un W10 20H2) qui permet de créer un service

    ex. :

    sc.exe create NewService binpath= c:\windows\system32\NewServ.exe type= share start= auto

    Plus d'info https://docs.microsoft.com/fr-fr/windows-server/administration/windows-commands/sc-create

    ou en faisant un sc /? en console

    Perso, par ordre de priorité je ferais :

    • "Va refaire ton app pour qu'elle fonctionne en tant que service". Autant supprimer le pb à la source, mais si gus est un irréductible ...
    • encapsuler l'app dans un service avec sc.exe. Facile à faire, ça prend qq minutes le temps de se familiariser avec les paramètres à passer.
    • Faire tourner l'app dans une tâche planifiée qui tournerait tout le temps ... sans avoir de session ouverte ou verrouillée. Idem que ci-dessus, mais moins élégant.

    Un admin qui laisse une session ouverte sur un serveur et il est fusillé direct. FAUTE LOURDE.

    Un admin qui verrouille une session sur un serveur (empêchant tes petits camarades de faire leur boulot en se loguant sur le serveur), c'est cours martiale. FAUTE GRAVE.

    @Medhi : OK, je dis tout le temps qu'on peut administrer à distance sans ouvrir de session locale ou en RDP, mais quelquefois, je le fais aussi. Je ne suis pas toujours en Powershell :-)

    Un admin qui ouvre une session avec un compte dit "de service" sur un serveur, c'est un aller simple et direct pour le bagne de Cayenne à casser des cailloux. Un compte de service, c'est pour les services, pas pour des personnes.  ... quoi ça n'existe plus Cayenne ? On le rouvrira pour l'occasion. FAUTE LOURDE mais facteur atténuant en sa faveur (s'il l'a fait c'est qu'il pouvait le faire. Si quelque chose ne doit pas être faite, ce ne doit pas être possible de le faire techniquement. Une simple GPO "don't logon interactivly" sur l'OU ou sont rangés les comptes de service et basta.

    J'ai entendu une voix ? Qui a dit que j'étais un extrémiste ? Non, pas du tout, on ne plaisante pas avec la sécurité.

    @torpyl : prends ça avec tout le second degré que tu pourras y mettre bien entendu.

    Cordialement

    Olivier

    Edit : Surveiller les logon/Logoff c'est tout à fait possible. Journal securité Event id 4624 (logon) et 4634 (logoff), une petite query dans un script PS qui va bien (avec envoi de mail et tout et tout) et le script en tâche planifiée qui tourne en permanence. Ca le fait aussi, mais pourquoi se donner du boulot quand on peut supprimer la cause du problème ? 


    mercredi 21 octobre 2020 16:29
  • Creer et bien configure un vrai compte de service ce n'est pas chose facile, surtout qu'avec ton commentaire olivier tu lui as licencié la moitié d'équipe looool

    En gros ce qu'il cherche c'est un script pour dépanner, sans non plus passer beaucoup de temps et changet comportement dans l'ad création compte service ou modifié l'applis etc....

    Après t'as proposé une solution que j'aurai directement appliqué en tant que consultant, mais cela necessite quelque notions


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    mercredi 21 octobre 2020 18:07
  • Il lui faut in script qui envoie un mail si la session est celle voulue, à placer dans la fermeture de session par gpo,.

    Je ferai ca après s'il le trouve pas


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi


    • Modifié M dakhama jeudi 22 octobre 2020 06:44
    mercredi 21 octobre 2020 18:08
  • trop tard Medhi :-)

    • Etape 1 : le script

    $StartTime = (Get-Date).AddMinutes(-5) # on va dire de checker les logs des 5 dernières minutes, mais c'est à ajuster en fonction de la planification $EndTime = Get-Date $Query = Get-WinEvent -FilterHashtable @{ LogName = 'Security' StartTime = $StartTime EndTime = $EndTime ID = "4634" # ca c'est fin de session } <# Ca retourne quelque chose comme ça, ici sur les ouvertures de session TimeCreated Id LevelDisplayName Message ----------- -- ---------------- ------- 07/10/2020 07:36:04 4624 Information L'ouverture de session d'un compte s'est correctement déroulée... 07/10/2020 07:36:03 4624 Information L'ouverture de session d'un compte s'est correctement déroulée... 07/10/2020 07:36:02 4624 Information L'ouverture de session d'un compte s'est correctement déroulée.... #> # check si $query n'est pas vide if ($Query) # on a quelque chose { # création du body du mail, ici je le passe sous forme texte au travers d'une Here-String $Body =@" Chers Admins, Un couillon de première a fermé la session sur notre maudit serveur. En clair,vous n'avez plus qu'à vous sortir les doigts pour rouvrir cette maudite session et relancer l'app avant que le boss nous tombe sur le dos et nous vire avec pertes et fracas. (et tout ça à cause d'un Dev' qui ne veut pas bosser) Cordialement Le bot de service "@

    # vous noterez que la présentation est conservée telle qu'écrite.

    # vous noterez que le "@ en fin doit être tout à gauche (pas de blanc)

    # ici je vais utiliser un splat pour passer tous les params. C'est surtout utile quand il ya de nombreux params à passer # ca évite d'avoir des lignes de commandes de 3 kms de long. C'est propre et lisible $MailParams =@{StmpServer = "mx.mydomain.com" # obligatoire To = "Destinataire@mydomain.com" # olligatoire From = "MailAuto@mydomain.com" # Obligatoire peut être un user bidon #cc = "lescopies@mydomain.com" # optionnel #bcc = "lescopiescachées@mydomain.com" # optionnel encoding = "UTF8" # optionnel, mais pas de pb avec les accents si on le met #port = "25" # optionnel, ne le mettre que si différent du défaut (25) priority = "Normal" # optionnel, ne le mettre que si différent du défaut (normal), soit high, ou low subjet = "ON SE BOUGE LES ADMINS ! session fermée à $(Get-Date)" # obligatoire #Attachment= Pathto\Myfile # optionnel Body = $Body # optionnel, mais c'est mieux de recevoir un mail avec pas que un sujet #BodyasHtml= # optionnel. Si passé, le Body n'est sous forme de texte mais sous forme html #credential= # optionnel. Si le compte qui exécute le script est un compte du domaine avec une boite mail, il aura les droits, sinon il faut passer les creds. } Send-MailMessage @MailParams # notez bien le @ et pas un $ comme pour une variable

    )end if

    • Etape 2 : la tache planifiée

    Une 'tite tâche planifiée qui exécute le script tous les x min (à définir et ça doit matcher avec $StartIme du script), tâche exécutée avec un compte de domaine (qui dispose d'une BAL bien entendu), en High privilèges, sans nécessiter un user connecté.

    • Etape 3: J'enfile mes basquets, je me plante devant mon PC et je scrute ma massagerie
    • Etape 4 : je cours jusqu'au serveur
    • Etape 5 : je reviens au trot, mais pas trop lentement quand même, sans passer par le distributeur de boisson, pour aller camper de nouveau devant mon PC.
    • Etape 6 : C'est la fin de journée et je me dis à la manière de celui qui tombait du 10è étage et qui à chaque étage disait "pour l'instant, ça va, pour l'instant ça va" en passant devant les fenêtres des voisins des étages inférieurs totalement pétrifiés : "quel beau métier je fais"

    Quand je vois des admins avec des milliers de mails non lus dans leur messagerie, je me dis une seule chose : "Trop de mails, tue les mails".

    Ce n''est pas une solution, c'est un cataplasme sur une jambe de bois. On vient de traiter un incident, selon la démarche ITIL. Perso, je transforme les incidents en problèmes, toujours au sens ITIL du terme, je cherche les root-causes et je leur fais la peau. Plus de source, plus de conséquence. Technique de feignant qui veut bien se creuser la tête pour ne plus avoir à traiter des trucs qui pourraient être réglés définitivement.

    Olivier

    P.S. : @Medhi. Encore un cours de powershell. :-) La leçon du jour : le splat (ou splatting) et l'utilisation d'une Here-String.

    mercredi 21 octobre 2020 19:12
  • Olivier, la ta trop dérrapé, moi je voyais un truc simple à la fermeture de session,

    Genre :

    if ($env:username -eq "système") {

    #et la on envoie le mail, pas besoin de checker les logs,

    }

    End


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi


    • Modifié M dakhama jeudi 22 octobre 2020 06:49
    jeudi 22 octobre 2020 06:48
  • Bonjour a tous,

    Tout d'abord, merci a tous pour vos reponses ! 

    @Oliv - The Frog : je partage la même vision, niveau sécurité etcc.. mais comme sous entendu, c'est une rustine en attendant. L'appli est la plus grosse applis métier, développée à l'ancienne et maintenu avec les pieds... Je fais malheureusement ce que je peux avec ce que j'ai et une refonte de l'appli n'est pas envisageable, ni même pensable... Je vais testé le script fourni dans la foulée, encore merci pour le temps passé ! 

    Après analyse du script ci-dessus, comment fais tu pour distinguer la session recherchée des autres ? car la si je comprend, c'est à chaque evenement de fin de session qu'un mail sera envoyé, donc cela concerne la session voulue, mais aussi les autres non ?

    De plus, je me pose la question d'une coupure du serveur intempestive, pas de log de fermeture ? donc pas d'avertissement ?

    Merci a tous les deux pour le temps investit à me repondre et les solutions apportées !

    Cordialement




    • Modifié torpyl jeudi 22 octobre 2020 07:51
    jeudi 22 octobre 2020 07:19
  • bonjour Torpyl

    [... encore merci pour le temps passé ! ...] Je me suis lâché et amusé comme un petit fou sur ce coup :-)

    [...comment fais tu pour distinguer la session recherchée des autres ?...] My bad, au temps pour moi, j'ai oublié le filtre sur le compte.

    Le nom de l'utilisateur figure dans les propriétés de l'event. J'ai un mémo perso la-dessus (regarde tout en base de la page).

    Là, tu auras ton filtre sur le compte utilisateur recherché.

    @Torpyl : Vraiment pas moyen de faire tourner l'app dans un service avec sc.exe ? Essaie juste avec n'importe quelle app (notepad, un navigateur, ...) sans crainte, ce que tu fais tu peux le défaire.

    Cordialement

    Olivier

    jeudi 22 octobre 2020 07:57
  • Le nom de l'utilisateur figure dans les propriétés de l'event. J'ai un mémo perso la-dessus (regarde tout en base de la page).

    Là, tu auras ton filtre sur le compte utilisateur recherché.

    @Torpyl : Vraiment pas moyen de faire tourner l'app dans un service avec sc.exe ? Essaie juste avec n'importe quelle app (notepad, un navigateur, ...) sans crainte, ce que tu fais tu peux le défaire.

    J'ai trouvé normalement, je suis en train de tester ;)

    $Query = Get-WinEvent -FilterHashtable @{
                                LogName = 'Security'
                                StartTime = $StartTime
                                EndTime = $EndTime
                                ID = "4634" # ca c'est fin de session
                                } | Where-Object -FilterScript {$_.Properties[5].Value -like "username"}


    par contre, je ne vois comment passer les credentials du serveurs smtp (O365)...

    Pour le sc.exe, ca serait tellement beau... mais pas une priorité pour la direction pour l'instant.. petite gueguerre avec le presta, on ne touche plus a rien tant que ca marche...


    • Modifié torpyl jeudi 22 octobre 2020 08:17
    • Proposé comme réponse M dakhama jeudi 22 octobre 2020 14:57
    jeudi 22 octobre 2020 08:13
  • On a parlé de tâche planifiée non ?

    Si ton script est exécuté via une tâche planifiée avec un compte qui dispose d'une BAL cela ne devrait poser aucun pb pour le script, pas besoin de passer les credentials

    Pour tester : Tu es loggué avec ton compte (tu as donc une BAL)

    Send-MailMessage -to TOi@mycompany.fr -from Robo@mycompany.fr -subject "test" -SmtpServeur "Mx.mycompany.fr" - body "message test"

    Check ta messagerie, tu viens de t'envoyer un mail sans passer de credentials, tu as utilisé tes current credentials.

    Pour la tâche planifiée, tu la fais tourner avec un compte qui dispose d'une BAL, ça va te demander le mot de passe lorsque tu vas saisir le compte.

    Olivier

    jeudi 22 octobre 2020 08:46
  • Malheureusement je n'ai pas de lien entre mes comptes AD et le tenant O365...

    J'ai tenté une petite modification ci-dessous mais je ne recois rien...

    $SecurePassword = ConvertTo-SecureString 'passenclair' -AsPlainText -Force #"Secure" the password, You can find an other securing procedure on my blog
    $Credential = New-Object System.Management.Automation.PSCredential ('mailexpediteur@domain.fr', $SecurePassword) #Load your Credential in variable
    $StartTime = (Get-Date).AddMinutes(-5) # on va dire de checker les logs des 5 dernières minutes, mais c'est à ajuster en fonction de la planification
    $EndTime = Get-Date
    $Query = Get-WinEvent -FilterHashtable @{
                                LogName = 'Security'
                                StartTime = $StartTime
                                EndTime = $EndTime
                                ID = "4634" # ca c'est fin de session
                                } | Where-Object -FilterScript {$_.Properties[5].Value -like "user_recherche"}
    <#
    Ca retourne quelque chose comme ça, ici sur les ouvertures de session
    TimeCreated                     Id LevelDisplayName Message
    -----------                     -- ---------------- -------
    07/10/2020 07:36:04           4624 Information      L'ouverture de session d'un compte s'est correctement déroulée...
    07/10/2020 07:36:03           4624 Information      L'ouverture de session d'un compte s'est correctement déroulée...
    07/10/2020 07:36:02           4624 Information      L'ouverture de session d'un compte s'est correctement déroulée....
    #>
    # check si $query n'est pas vide
    if ($Query) # on a quelque chose
        {
        # création du body du mail, ici je le passe sous forme texte au travers d'une Here-String
        $Body =@"
                                 Chers Admins, 
    Un couillon de première a fermé la session sur notre maudit serveur. 
    En clair,vous n'avez plus qu'à vous sortir les doigts pour rouvrir cette maudite session 
    et relancer l'app avant que le boss nous tombe sur le dos et nous vire  avec pertes et fracas. 
    (et tout ça à cause d'un Dev' qui ne veut pas bosser)
    
                            Cordialement
                         Le bot de service
    "@
    # vous noterez que la présentation est conservée telle qu'écrite. 
    # vous noterez que le "@ en fin doit être tout à gauche (pas de blanc)
    
    # ici je vais utiliser un splat pour passer tous les params. C'est surtout utile quand il ya de nombreux params à passer
    # ca évite d'avoir des lignes de commandes de 3 kms de long. C'est propre et lisible
    $MailParams =@{StmpServer = "smtp.office365.com"    # obligatoire
                   To         = "mailexpediteur@domain.fr" # olligatoire
                   From       = "mail_destin@domain.fr" # Obligatoire peut être un user bidon 
                   #cc        = "lescopies@mydomain.com"  # optionnel
                   #bcc       = "lescopiescachées@mydomain.com" # optionnel
                   encoding   = "UTF8" # optionnel, mais pas de pb avec les accents si on le met
                   port      = "587" # optionnel, ne le mettre que si différent du défaut (25)
                   priority   = "Normal" # optionnel, ne le mettre que si différent du défaut (normal), soit high, ou low
                   subjet     = "ON SE BOUGE LES ADMINS ! session fermée à $(Get-Date)" # obligatoire
                   #Attachment= Pathto\Myfile # optionnel
                   Body       = $Body # optionnel, mais c'est mieux de recevoir un mail avec pas que un sujet
                   #BodyasHtml= # optionnel. Si passé, le Body n'est pas sous forme de texte mais sous forme html
                   credential= $Credential # optionnel. Si le compte qui exécute le script est un compte du domaine avec une boite mail, il aura les droits, sinon il faut passer les creds.
                   }
    Send-MailMessage @MailParams -UseSsl # notez bien le @ et pas un $ comme pour une variable
    }

    Je garde le message, ca leur fera les pieds : ;)


    • Modifié torpyl jeudi 22 octobre 2020 08:52
    jeudi 22 octobre 2020 08:51
  • Peut etre normal, mais je n'ai rien qui s'affiche quand j'execute seulement la query : 

    $StartTime = (Get-Date).AddMinutes(-5) # on va dire de checker les logs des 5 dernières minutes, mais c'est à ajuster en fonction de la planification
    $EndTime = Get-Date
    $Query = Get-WinEvent -FilterHashtable @{
                                LogName = 'Security'
                                StartTime = $StartTime
                                EndTime = $EndTime
                                ID = "4634" # ca c'est fin de session
                                } #| Where-Object -FilterScript {$_.Properties[5].Value -like "user_rech"}
    
    # and select the appropriate properties again
    $query | Select-Object @{Label = "TimeCreated"      ; Expression = {$_.TimeCreated}},
                           @{Label = "ID"               ; Expression = {$_.ID}},
                           @{Label = "MachineName"      ; Expression = {$_.MachineName}},
                           @{Label = "LevelDisplayName" ; Expression = {$_.LevelDisplayName}},
                           @{Label = "TaskDisplayName"  ; Expression = {$_.TaskDisplayName}},
                           @{Label = "SecurityId"       ; Expression = {$_.Properties[4].Value}},
                           @{Label = "AccountName"      ; Expression = {$_.Properties[5].Value}},
                           @{Label = "AccountDomain"    ; Expression = {$_.Properties[6].Value}},
                           @{Label = "LogonId"          ; Expression = {$_.Properties[7].Value}},
                           @{Label = "LogonType"        ; Expression = {$_.Properties[8].Value}},
                           @{Label = "Workstation"      ; Expression = {$_.Properties[11].Value}},
                           @{Label = "LogonGuid"        ; Expression = {$_.Properties[12].Value}}

    Le resultat est :

    TimeCreated      : 22/10/2020 12:32:04
    ID               : 4634
    MachineName      : serveur.domain.local
    LevelDisplayName : Information
    TaskDisplayName  : Fermer la session
    SecurityId       : 4
    AccountName      : 
    AccountDomain    : 
    LogonId          : 
    LogonType        : 
    Workstation      : 
    LogonGuid        : 

    On peut voir que les champs AccountName etcc sont vides, donc mon filtre ne ressort jamais rien, CQFD...

    Je seche.. peut faut il charger le module AD ?


    • Modifié torpyl jeudi 22 octobre 2020 10:42
    jeudi 22 octobre 2020 09:30
  • Salut,

    Essaies ma solution elle prend 1 minutes, et elle est fonctionnelle, tu pars vers quelque choses de lourd.


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    jeudi 22 octobre 2020 12:52
  • J'ai réussit à trouver ce qui me convient, je vous le met a la suite 

    Param(
            $emailSmtpServer     = "smtp.local.com",
            $emailSmtpServerPort = "587",
            $emailSmtpUser       = "alerte@domain.com",
            $emailSmtpPass       = "Password",
            $emailFrom           = "alerte@domain.com",
            $emailTo             = "infra@domain.com",
            #$emailTo2             ="",
            $emailSubject        = "Session "user" fermée" 
        )
    
     
    
    query session /server:localhost
    
     
    
    $Resultat = query session "user" /server:localhost
    
     
    
    
    if ($Resultat)
    {
    # Ne rien faire
    }
    ELSE
    {
        $emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo )
        $emailMessage.Subject = $emailSubject
        $emailMessage.IsBodyHtml = $true
    
     
    
        $emailMessage.Body = "La session "user" semble être fermée sur le serveur, merci de controler" 
    
     
    
        $SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer, $emailSmtpServerPort )
        $SMTPClient.EnableSsl = $true
        $SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );
        $SMTPClient.Send( $emailMessage )   
    }

    Merci a tous pour votre temps et vos solution !

    Cordialement

    • Proposé comme réponse M dakhama jeudi 22 octobre 2020 14:57
    • Marqué comme réponse torpyl jeudi 22 octobre 2020 15:02
    jeudi 22 octobre 2020 13:59
  • Salut tant mieux,

    Tu le mets ou ton script fermeture de session ou pla ?

    J'aurai bien fait d'optimiser en enlevant le if et elese, et en se passant de query car ce n'est pas une comlande powershell.

    Un if ($env:userdomain -eq "user") {  

    }

    Peut servir aux autres 


    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    • Proposé comme réponse M dakhama jeudi 22 octobre 2020 14:57
    • Non proposé comme réponse M dakhama jeudi 22 octobre 2020 14:57
    • Proposé comme réponse M dakhama jeudi 22 octobre 2020 14:57
    jeudi 22 octobre 2020 14:28
  • Je le met en tache planifiées pour gérer la répétition du mail...

    Si tu as une opti n'hesites pas ! :D


    jeudi 22 octobre 2020 14:32
  • Tu pouvais le mettre simplement à la fermeture de session, il n'allait s'exécuter qu'une fois les sessions fermées, donc mpins d'une tâche planifiée qui tourne en boucle

    Dakhama Mehdi : Windows developper https://github.com/dakhama-mehdi

    jeudi 22 octobre 2020 14:57
  • Bonsoir Torpyl

    } #| Where-Object -FilterScript {$_.Properties[5].Value -like "user_rech"}

    enlève le # le Where-Object est en commentaire

    Olivier

    jeudi 22 octobre 2020 17:13