Annuler une boucle en modifiant variable $pivot

Résolu
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 - 23 nov. 2024 à 12:18
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 - 28 nov. 2024 à 00:55

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

yg_be Messages postés 23423 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 janvier 2025 Ambassadeur 1 557
24 nov. 2024 à 10:32

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
brucine Messages postés 18559 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 12 janvier 2025 2 776
23 nov. 2024 à 12:33

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
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
23 nov. 2024 à 13:36

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
brucine Messages postés 18559 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 12 janvier 2025 2 776
23 nov. 2024 à 14:32

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
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
Modifié le 23 nov. 2024 à 18:40

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
brucine Messages postés 18559 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 12 janvier 2025 2 776
23 nov. 2024 à 19:05

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
24 nov. 2024 à 11:31

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
brucine Messages postés 18559 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 12 janvier 2025 2 776
24 nov. 2024 à 11:54

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
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10 > brucine Messages postés 18559 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 12 janvier 2025
24 nov. 2024 à 16:14

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
yg_be Messages postés 23423 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 janvier 2025 1 557 > adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024
24 nov. 2024 à 17:59

"logoff", c'est la fin de la session.  Le verrouillage, c'est "lock".

Un script, en général, n'est pas affecté par le verrouillage, le verrouillage n'affecte que l'accès interactif de l'utilisateur.

Tu trouveras ici plusieurs techniques pour détecter que l'ordi est verrouillé: https://superuser.com/questions/1170918/determine-remote-windows-screen-locked-or-unlocked-remotely

0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 920
24 nov. 2024 à 13:43

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
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
24 nov. 2024 à 15:51

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
yg_be Messages postés 23423 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 janvier 2025 1 557
24 nov. 2024 à 16:10

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

Personne d'autre ne pourrait alors l'ouvrir.

0
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10 > yg_be Messages postés 23423 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 janvier 2025
24 nov. 2024 à 16:39

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
yg_be Messages postés 23423 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 janvier 2025 1 557 > adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024
24 nov. 2024 à 17:48

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
brucine Messages postés 18559 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 12 janvier 2025 2 776 > yg_be Messages postés 23423 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 janvier 2025
24 nov. 2024 à 18:16

à 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
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10 > yg_be Messages postés 23423 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 janvier 2025
24 nov. 2024 à 19:52

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
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
28 nov. 2024 à 00:55

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