3 votes

À partir du terminal, comment puis-je déterminer la date/heure de la dernière fois où Windows a été verrouillé ou déverrouillé ?

Je presse WinKey + L à chaque fois que je quitte physiquement mon ordinateur, pour des raisons de sécurité élémentaires. Quand je reviens, je saisis le mot de passe Windows court et j'appuie sur Entrée pour revenir sur mon bureau. (Cela ne signifie pas que je me "déconnecte" ou que je me "connecte".)

Maintenant, j'essaie de déterminer, à partir d'une commande terminal, l'horodatage de la dernière fois que la machine a été verrouillée de cette manière, ou de la dernière fois qu'elle a été déverrouillée. Peu importe lequel; les deux ont la même valeur pour moi.

(Cela servira à déterminer quand envoyer un "signe de vie" à mon système de sécurité.)

Windows 10 Pro. Pas de logiciel externe, s'il vous plaît. Si possible, je préférerais que la solution n'utilise pas non plus PowerShell, en raison des nombreux problèmes difficiles à expliquer avec cet environnement.

La réponse idéale serait quelque chose comme:

getlastunlock.exe

Qui affiche:

2020-11-17 01:07:04

S'il vous plaît, dites-moi qu'il y a une telle fonctionnalité dans Windows.

1voto

Worthwelle Points 4190

Cela peut être accompli en traitant la sortie de la commande wevtutil (Windows Event Utility). Avant de continuer, je suis d'accord avec Ramhound que PowerShell est le meilleur moyen d'accomplir cela.

Il existe quatre ID d'événements qui peuvent vous concerner :

  • 7001 est l'événement de connexion
  • 7002 est l'événement de déconnexion
  • 4800 est l'événement de verrouillage
  • 4801 est l'événement de déverrouillage

Voici un fichier de commandes batch Windows que vous pouvez exécuter à partir de la ligne de commande. Vous pouvez le nommer getlastunlock.bat et l'enregistrer dans un emplacement répertorié dans votre PATH. Ensuite, vous pouvez ouvrir l'invite de commandes et exécuter getlastunlock pour voir les résultats.

Fichier batch

@ECHO off
FOR /F "usebackq tokens=16 delims=^<" %%a IN (`wevtutil qe System /rd ^| findstr "4800 4801"`) DO (
   CALL:getTime "%%a"
   GOTO:EndLoop
)
:EndLoop
EXIT /b

:getTime
SETLOCAL
:: getTime String [RtnVar]
::             -- String  La chaîne à partir de laquelle extraire l'heure.
::             -- RtnVar  Une variable facultative utilisée pour retourner l'heure.
SET "s=%~1"
SET "tTime=%s:~24,19%"
SET "time=%tTime:T= %"
ENDLOCAL&IF "%~2" neq "" (set %~2=%time%) ELSE ECHO %time%
EXIT /b

Explication

Voici ce que fait ce script, étape par étape :

  1. @ECHO off indique à l'interpréteur de commandes batch de ne pas afficher les commandes en cours d'exécution. Par défaut, vous verriez les commandes exactement comme si vous les tapiez vous-même.
  2. FOR /F "usebackq tokens=16 delims=^<" %%a IN (wevtutil qe System ^| findstr "7001 4801") DO ( est un peu long, donc décomposons-le davantage :
    1. FOR /F est une commande de boucle. Elle prend une entrée et boucle à travers chaque ligne.
    2. usebackq utilise le style de guillemets alternatif de l'entrée pour faciliter le passage de commandes contenant des guillemets.
    3. tokens=16 signifie que nous voulons seulement le 16ème élément dans la ligne.
    4. delims=^< signifie que nous voulons diviser chaque ligne en éléments séparés par le caractère <. La sortie de wevtutil est au format XML, qui utilise <éléments> pour stocker des informations. wevtutil permet également la sortie en texte, mais cela serait plus difficile à analyser.
    5. %%a définit le nom de la variable du 16ème élément dans la ligne à utiliser ultérieurement.
    6. IN signifie "utiliser la commande suivante pour obtenir la sortie à parcourir.
    7. (`wevtutil qe System /rd ^| findstr "4800 4801"`) est la commande qui renvoie la sortie que nous voulons parcourir.
      1. wevtutil qe System /rd signifie que nous voulons exporter le contenu du journal d'événements System, dans l'ordre chronologique inverse (le plus récent d'abord).
      2. ^| est le "caractère de pipe", échappé. C'est-à-dire que la sortie de wevtutil sera "reliée" ou utilisée comme entrée pour la commande suivante. Nous "échappons" le caractère | avec le caractère ^ pour indiquer à l'interpréteur de commande batch de ne pas utiliser le | pour diviser toute la ligne, mais seulement ces deux commandes.
      3. findstr "4800 4801" prend la sortie de wevtutil et recherche les lignes contenant 4800 et 4801, nos événements de verrouillage et de déverrouillage. Vous pouvez changer cela en n'importe quel ID d'événement que vous voulez.
    8. DO signifie exécuter les commandes suivantes sur chaque ligne de la sortie.
  3. CALL:getTime "%%a" envoie le 16ème élément de la ligne actuelle à la sous-routine getTime.
  4. GOTO:EndLoop sort de la boucle de sorte qu'elle ne s'exécute qu'une fois, ce qui signifie qu'elle ne traitera que le résultat pertinent le plus récent. GOTO est différent de CALL en ce que lorsque la sous-routine se termine, le script se termine. S'il s'agissait d'un CALL, alors la fin de la sous-routine ramènerait le script à la ligne après celle-ci.
  5. :EndLoop définit une étiquette que nous pouvons appeler en utilisant GOTO.
  6. EXIT /b indique à l'interpréteur de commandes de quitter le fichier batch ici. Tout ce qui suit cette ligne devrait être des sous-routines qui sont appelées à partir du code ci-dessus.
  7. :getTime définit le nom de la sous-routine.
  8. SETLOCAL définit un contexte local, ce qui signifie que les variables d'environnement définies dans ce contexte ne seront pas renvoyées au reste du fichier batch.
  9. SET "s=%~1" définit l'entrée dans la sous-routine en tant que variable s.
  10. SET "tTime=%s:~24,19%" obtient l'heure formatée selon ISO 8601 du délimitant T de la variable s.
  11. SET "time=%tTime:T= %" remplace le T par un espace pour vous donner le format que vous souhaitez.
  12. ENDLOCAL&IF "%~2" neq "" (set %~2=%time%) ELSE ECHO %time% profite du traitement complet de la ligne de l'interpréteur de commandes pour à la fois terminer le contexte local et passer une variable en dehors de celui-ci (l'heure).
  13. EXIT /b ici indique à l'interpréteur de commandes que la sous-routine s'est terminée et de retourner au traitement à l'emplacement d'origine.

Références

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X