Annuler une boucle en modifiant variable $pivot

Résolu
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   -  
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   -

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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

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 21889 Date d'inscription   Statut Membre Dernière intervention   3 472
 

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   Statut Membre Dernière intervention   10
 

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 21889 Date d'inscription   Statut Membre Dernière intervention   3 472
 

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   Statut Membre Dernière intervention   10
 

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 21889 Date d'inscription   Statut Membre Dernière intervention   3 472
 

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   Statut Membre Dernière intervention   10
 

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 21889 Date d'inscription   Statut Membre Dernière intervention   3 472
 

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   Statut Membre Dernière intervention   10 > brucine Messages postés 21889 Date d'inscription   Statut Membre Dernière intervention  
 

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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention  
 

"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 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 

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   Statut Membre Dernière intervention   10
 

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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

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   Statut Membre Dernière intervention   10 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention  
 

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 21889 Date d'inscription   Statut Membre Dernière intervention   3 472 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

à 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   Statut Membre Dernière intervention   10 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

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   Statut Membre Dernière intervention   10
 

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