Annuler une boucle en modifiant variable $pivot

Résolu

Bonjour,

J'ai un script qui créé en boucle un fichier txt à l'ouverture de session. J'aimerais trouver un moyen de forcer la suppression de ce fichier lors d'un évènement particulier (comme au verrouillage du poste). Comment basculer la variable $pivot à 0 pour qu'elle ne m'empêche plus de supprimer le fichier avec la session ouverte ?

$pivot = 1
DO {
    New-Item -Path P:\ -Name "logon.txt" -ItemType "file" -Value "ouverture de session $time sur le poste $Env:COMPUTERNAME" -force | out-null
    start-sleep -s 10
   }
   while ($pivot -ne 0)
}


Windows / Chrome 131.0.0.0

8 réponses

  1. Contributeur

    bonjour,

    Au moment où tu souhaites que le script s'arrête, tu pourrais par exemple créer un autre fichier, et le script s'arreterait quand il détecte la présence de ce fichier.

    1
    1. Bonjour,

      Je ne sais pas, je suis plus à l'aise en Batch, mais pourquoi par une variable appropriée ne pas horodater le nom du fichier logon ou y récupérer la date et l'heure de création et commencer le script programmé au démarrage par une condition qui supprime ce fichier si l'horodatage courant est différent de celui qui est archivé?

      0
      1. ok pourquoi pas pour l horodatage mais ca ne resoudra pas le probleme de la recurence de création du fichier qui est initié par mon script. Quand je supprime le txt manuellement (créé à l'ouverture) il se recréé automatiquement ce qui est bien ce que je souhaite. Mais jaimerais quand même pouvoir forcer la fin de la boucle même si la session est toujours ouverte (ex session verrouillée).

        0
        1. Je ne sais pas.

          Tu ne peux pas supprimer ton fichier s'il n'intervient pas dans ton script un bouclage conditionnel testant avec un CmdLet approprié à chacune de tes conditions si par exemple la session est verrouillée et si tant est que dans ces conditions le script continue d'être exécuté.

          Je ne sais pas non plus si cela ne passe pas forcément par une GPO ou un contexte AD auquel je ne comprends rien.

          0
      2. oui j'ai deja ma GPO de prête pour lancer un script au verrouillage de la session (tache planifiée) mais justement a cause de cette redondance de création du fichier , la suppression ne marche pas. elle est temporaire et le fichier continue de se recréer. Je cherche donc un script qui annule mon script d'ouverture de session. Ca semble etre la variable $pivot qui joue un rôle.

        0
        1. Cela dépasse sûrement comme je l'ai remarqué mes compétences, mais je ne te suis pas.

          Ton script s'exécute tant que ta variable ne vaut pas 0 et tu l'as forcée à une valeur constante de 1: la seule manière de l'interrompre semble être de lui attribuer la valeur 0 en fonction d'une conditionnelle (comme dit, dans les circonstances, je ne sais pas laquelle).

          0
      3. En effet j'ai voulu mettre une valeur de pivot à 0 pour annuler la redondance. Mais cela ne fonctionne pas, le premier script de l'ouverture de session continue de créer en boucle le fichier txt. Je cherche donc un moyen de forcer l'arret même si la session est ouverte. pour l'instant le seul moyen est de fermer la session (GPO fermeture de session). Tu aurais une idée en batch éventuellment qui fait la même chose ? Un script qui réécrit en boucle et au autre qui arrête la boucle.

        0
        1. Non parce que le problème est de caractériser le verrouillage de la session.

          Il semblerait qu'on puisse en obtenir le statut dans un AD via PowerShell:

          https://specopssoft.com/fr/blog/comment-verifier-si-un-compte-ad-est-verrouille/

          où on peut sans difficulté ramener la valeur de lockedout.

          En Batch, je ne pense pas dans l'immédiat à autre chose que de tester si le Process (tel que son nom est rendu dans le gestionnaire des tâches, pas son nom ou son chemin) qui peut caractériser que la session est déverrouillée est actif ou pas ou quand il a été lancé la dernière fois, mais je ne peux pas tester pour choisir un Process caractéristique parce que mon PC n'est jamais éteint ni verrouillé et que je ne sais donc pas voir lequel serait pertinent.

          0
        2. @brucine

          Si je me trompe pas cette solution concerne le statut "compte désactivé" de l'utilisateur dans l'AD. Je pensais plutôt au verrouillage dans le sens "logoff". J'ai essayé ce scxript mais rien n'y fait, la boucle continue de créer le fichier pendant que la session user est verrouillée.

          $time = Get-Date -Format "dddd MM/dd/yyyy HH:mm"
          
          if (Test-Path P:\logon.txt) {
              \\srv\logon-Notif.hta
              Start-Sleep -Seconds 60
              Shutdown -l
          } else {
              $pivot = 1
              DO {
                  # Vérifie si le poste est verrouillé
                  $sessionInfo = query user
                  if ($sessionInfo -match "Disc") { # "Disc" indique une session déconnectée ou verrouillée
                      Write-Output "Le poste est verrouillé. Arrêt de la boucle."
                      $pivot = 0
                      break
                      Remove-Item -Path P:\logon.txt -Force
                      
                  }
          
                  # Crée le fichier logon.txt
                  New-Item -Path P:\ -Name "logon.txt" -ItemType "file" -Value "ouverture de session $Env:USERNAME, $time sur le poste   $Env:COMPUTERNAME" -Force | Out-Null
                  Start-Sleep -Seconds 10
              }
              while ($pivot -ne 0)
          }
          0
      4. Bonjour,

        Juste par curiosité, je n'ai pas compris l'utilité de la boucle, es-tu sûr d'avoir besoin de cette redondance ?


        0
        1. salut. La boucle a pour but de permettre la présence du fichier txt dans le perso de l'utilisateur tant qu'au moins une session est ouverte (PC1). Sans redondance une fois la même session ouverte sur le PC2 alors le fichier sera supprimé lors de la fermeture automatique de session (GPO) et donc à nouveau une deuxième session pourra être ouverte sur le PC3. Ou alors l'utilisateur pourrait feinter et supprimer manuellement le txt (on pourrait imaginer lui attribuer des droits restreint pour empêcher ça, )

          Donc dans l'idée j'aimerais que l'utilisateur ne puisse ouvrir q'une seule et unique session sur le réseau. Dans l’hypothèse où je ne met pas la redondance alors il y aura toujours 2 même sessions potentiellement ouverte sur 2 PC différents.

          0
          1. Contributeur

            Ne serait-il pas plus simple, dans le script, d'ouvrir exclusivement un fichier?

            Personne d'autre ne pourrait alors l'ouvrir.

            0
          2. @yg_be

            je ne comprends pas. Qu'entend tu par "ouverture exclusive" ? En soit c'est pas si grave si l'utilisateur ouvre le fichier logon. Ce qui est génant c'est qu'il soit supprimé à un autre moment que lors d'une fermeture ou verrouillage de session. Pour le moment je parviens à mon objectif uniquement si l'utilisateur pense à bien fermer sa session. Mais si elle se verrouille (au bout de 10min d'inactivité) alors il ne pourra pas s'authentifier sur un autre PC puisque le fichier continuera de se créer en boucle.

            0
          3. Contributeur
            @adgm1

            Je n'avais pas compris que tu voulais libérer le fichier si la session se verrouille.


            Et que devrait-il se passer au déverrouillage de la session?

            0
          4. @yg_be

            à tout hasard en stoppant le script si le "ID Event" correspond à la fermeture de session, en principe 4647 ou 4634?

            https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-4647

            https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/stop-job?view=powershell-7.4

            ou en cherchant s'il en existe un l'évènement correspondant via WMI
            Register-WmiEvent -Class win32_(?)

             

            0
          5. @yg_be

            Oui c'est juste pour une sécurité si un utilisateur a oublié de fermer afin qu'il puisse quand même se connecter ailleurs. Et parfois certains font "changer d'utilisateur" ce qui verrouille la session de l'utilisateur actuel. Bref c'est un casse tête c'est sûr. En effet j'ai pas réfléchi a quoi faire quand l'utilisateur déverrouille sa propre session, je dirais qu'il faut reactiver la boucle pour recréer le fichier logon s'il n'existe pas . 

            0
        2. Jai finalement trouvé une solution.

          En fait pour arréter la boucle il fallait tout simplement stopper le processus powershell en cours. Donc j'ai créé mes 2 GPO , une au verrouillage qui lance ce script pour supprimer le processus powershell de redondance et qui supprime ensuite le fichier txt.

          taskkill /F /IM powershell.exe
          taskkill /f /im pwsh.exe
          timeout /t 2
          del /f /q "P:\logon.txt"
          
          exit

          Et cet autre script au déverrouillage qui remet en marche la redondance.

          Start-Sleep -Seconds 3
          $time = Get-Date -Format "dddd MM/dd/yyyy HH:mm"
          
          # Crée le fichier logon.txt en boucle
          if (Test-Path P:\logon.txt) {
              write-output "logon existe deja"
          } else {
          
              $pivot = 1
              DO {
                  New-Item -Path P:\ -Name "logon.txt" -ItemType "file" -Value "deverouillage session $Env:USERNAME, $time sur le poste   $Env:COMPUTERNAME" -Force | Out-Null
                  Start-Sleep -Seconds 10
              }
              while ($pivot -ne 0)
          }
          
          0