Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Comment déclencher une action après un période d'inacitivité de l'ordinateur
    Bonjour,

    Cela fait quelques jours que je cherche le moyen d'écrire un script qui pourrait se traduire par "fait ceci après une période d'inactivité de x seconde"

    J'ai cherché et les seules réponses que je trouve consistent à utiliser le planificateur de taches. Or cette solution ne me convient pas car je la trouve trop capricieuse. Je préfèrerais mettre un batch au démarrage tout simplement.

    J'ai aussi cherche ici sur ce forum sans succès, j'ai d'ailleurs essayé de relancer un sujet qui en parlait (https://www.developpez.net/forums/d1531012/systemes/windows/windows-8/definition-periode-inactivite/?)

    Au final je voudrais utiliser cette commande avec shutdown /s pour que l'ordi s'éteigne tout seul si je n'y touche pas pendant plusieurs minutes.

    Voici donc ma question en résumé :
    Existe-t-il une commande pour lancer une action (programme, fichier) après une période d'inactivité.

    ou à défaut : connaissez vous un moyen d'éteindre l'ordi tout seul après un période d'inactivité (sans passer par le planificateur)

    Merci d'avance à tous et bonne soirée.

  2. #2
    Expert éminent

    Peut-être ce Powershell Script Auto-Lock your workstation after Idle-Timeout with PowerShell est une bonne piste, juste il faut changer le temps d'inactivité et remplacer la commande de verrouillage rundll32.exe user32.dll,LockWorkStation par la commande de Shutdown /S



    AutoShutdown_On_Idle_TimeOut.ps1
    Code PowerShell :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #
    # This background job automatically locks your Workstation after a specified amount of
    # time. It will come in handy if you cannot access the screensaver settings due to policy
    # restriction but want to lock your screen after a idle timeout. Or you could just
    # press [Win]+[L] everytime you leave your desk <img src="images/smilies/icon_wink.gif" border="0" alt="" title=";)" class="inlineimg" /> .
    #
    # start with
    # 	powershell.exe -windowstyle hidden -executionpolicy Unrestricted P:\ATH\TO\logoff.ps1
    #
    # `-windowstyle hidden` will make your PowerShell disappear/run in background
    # `-executionpolicy Unrestricted` will enable this PowerShell process to allow non-signed scripts
    #
     
    # This is the only setting: How long before locking?
    # Alternative Options:
    # * -Seconds 10 ( = 10 Seconds)
    # * -Minutes 10 ( = 10 Minutes)
    # * -Hours 10 ( = 10 Hours)
    #
    $idle_timeout = New-TimeSpan -Minutes 10
     
    # DO NOT CHANGE ANYTHING BELOW THIS LINE
    ####################################################################################################################################################################
     
    # This snippet is from http://stackoverflow.com/a/15846912
    Add-Type @'
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
     
    namespace PInvoke.Win32 {
     
        public static class UserInput {
     
            [DllImport("user32.dll", SetLastError=false)]
            private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
     
            [StructLayout(LayoutKind.Sequential)]
            private struct LASTINPUTINFO {
                public uint cbSize;
                public int dwTime;
            }
     
            public static DateTime LastInput {
                get {
                    DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount);
                    DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks);
                    return lastInput;
                }
            }
     
            public static TimeSpan IdleTime {
                get {
                    return DateTime.UtcNow.Subtract(LastInput);
                }
            }
     
            public static int LastInputTicks {
                get {
                    LASTINPUTINFO lii = new LASTINPUTINFO();
                    lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
                    GetLastInputInfo(ref lii);
                    return lii.dwTime;
                }
            }
        }
    }
    '@
    #End snippet
     
    # Helper: Is currently locked?
    $locked = 0;
     
    do {
    	# 1st: How long is your computer currently idle?
    	$idle_time = [PInvoke.Win32.UserInput]::IdleTime;
        #Write-Host ("Idle for " + $idle_time);
     
     
    	# Your computer is not locked, but idle time is longer than allowed? -> Lock it!
    	if (($locked -eq 0) -And ($idle_time -gt $idle_timeout)) {
    		# Lock it
    		rundll32.exe user32.dll,LockWorkStation
     
    		# Setting $locked to 1 will prevent it from relocking every 10 seconds
    		$locked = 1;
    		#Write-Host ("Locking");
    	}
     
    	# Your computer is idle for less than the allowed time -> in most cases this means it is unlocked and
    	# therefore ready to be locked again!
    	if ($idle_time -lt $idle_timeout) {
    		$locked = 0;
    	}
     
    	# Save the environment. Don't use 100% of a single CPU just for idle checking <img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" />
        Start-Sleep -Seconds 10
    }
    while (1 -eq 1)

  3. ###raw>post.musername###
    Expert éminent

    Vous m'avez fait pondu un nouveau vbscript : Auto-Shutdown_On_Idle_TimeOut.vbs
    Code vb :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    '##########################################################################################################################
    '# Auto-Shutdown your workstation after Idle Timeout                                                                      #
    '# Script Name : Auto-Shutdown_On_Idle_TimeOut.vbs                                                                        #
    '# Arrêt automatique de votre poste de travail après un délai d'inactivité                                                #
    '# Idea comes from here ==>  This snippet is from http://stackoverflow.com/a/15846912                                     #
    '# https://stackoverflow.com/questions/15845508/get-idle-time-of-machine/15846912#15846912                                #
    '# https://gist.github.com/wendelb/1c364bb1a36ca5916ca4 ===> Auto-Lock your workstation after Idle-Timeout with PowerShell#
    '##########################################################################################################################
    Option Explicit
    Dim Copyright,Msg,MsgEN,MsgFR
    MsgEN = Array(_
    "Automatic shutdown On Idle TimeOut ",_
    "ATTENTION ! There is another instance running !",_
    "Save your Work because the computer will shutdown in 60 seconds"_
    )
    MsgFR = Array(_
    "Arrêt automatique du PC après un délai d'inactivité ",_
    "ATTENTION ! Il y a une autre instance en cours d'exécution !",_
    "Sauvegarder votre Travail car l'ordinateur va s'éteindre dans 60 secondes"_
    )
    'Check if the system is french to set the French array as message otherwise set it as English
    'Vérifiez si le système est français pour définir le tableau français comme message, sinon définissez-le comme anglais
    If Oslang = 1036 Then
        Msg = MsgFR ' French Array Message to be set
    Else
        Msg = MsgEN ' English Array Message to be set
    End If
    Copyright = Msg(0) & ChrW(169) &" Hackoo 2020"
     
    If AppPrevInstance() Then 
        MsgBox Msg(1) & VbCrLF & CommandLineLike(WScript.ScriptName),VbExclamation,Copyright
        WScript.Quit   
    Else 
        Dim Timeout_Idle,strCommand,VbsPath,ShortcutName
        Timeout_Idle = "60"  '60 Minutes = 1 Heure = 1 Hour
        strCommand = "Shutdown.exe -s -t 60 -c " & DblQuote(Msg(2))
        VbsPath = Wscript.ScriptFullName
        ShortcutName = "Auto-Shutdown_On_Idle_TimeOut"
        Call Shortcut(VbsPath,ShortcutName)
        Call Write_Run_PScript(Timeout_Idle,strCommand)
    End If
    '---------------------------------------------------------------------------------------------------------------
    Sub Shortcut(PathApplication,ShortcutName)
        Dim objShell,StartFolder,objShortCut,MyTab
        Set objShell = CreateObject("WScript.Shell")
        MyTab = Split(PathApplication,"\")
        If ShortcutName = "" Then
            ShortcutName = MyTab(UBound(MyTab))
        End if
        StartFolder = objShell.SpecialFolders("Startup")
        Set objShortCut = objShell.CreateShortcut(StartFolder & "\" & ShortcutName & ".lnk")
        objShortCut.TargetPath = DblQuote(PathApplication)
        ObjShortCut.IconLocation = "%SystemRoot%\system32\SHELL32.dll,27"
        objShortCut.Save
    End Sub
    '---------------------------------------------------------------------------------------------------------------
    Function DblQuote(Str)
        DblQuote = Chr(34) & Str & Chr(34)
    End Function
    '---------------------------------------------------------------------------------------------------------------
    Sub Write_Run_PScript(Timeout_Idle,strCommand)
        Const ForWriting = 2
        Dim fs,Ws,ts,Ret,PSFile,ByPassPSFile
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set Ws = CreateObject("WScript.Shell")
        PSFile = Ws.ExpandEnvironmentStrings("%Temp%") & fs.GetTempName & ".ps1"
        ByPassPSFile = "PowerShell -ExecutionPolicy bypass -noprofile -file "
        Set ts = fs.OpenTextFile(PSFile,ForWriting,True)
        ts.WriteLine "$idle_timeout = New-TimeSpan -Minutes "& Timeout_Idle &""
        ts.WriteLine "Add-Type @'"
        ts.WriteLine "using System;"
        ts.WriteLine "using System.Diagnostics;"
        ts.WriteLine "using System.Runtime.InteropServices;"
        ts.WriteLine "namespace PInvoke.Win32 {"
        ts.WriteLine "    public static class UserInput {"
        ts.WriteLine "        [DllImport(""user32.dll"", SetLastError=false)]"
        ts.WriteLine "        private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);"
        ts.WriteLine "        [StructLayout(LayoutKind.Sequential)]"
        ts.WriteLine "        private struct LASTINPUTINFO {"
        ts.WriteLine "            public uint cbSize;"
        ts.WriteLine "            public int dwTime;"
        ts.WriteLine "        }"
        ts.WriteLine "        public static DateTime LastInput {"
        ts.WriteLine "            get {"
        ts.WriteLine "                DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount);"
        ts.WriteLine "                DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks);"
        ts.WriteLine "                return lastInput;"
        ts.WriteLine "            }"
        ts.WriteLine "        }"
        ts.WriteLine "        public static TimeSpan IdleTime {"
        ts.WriteLine "            get {"
        ts.WriteLine "                return DateTime.UtcNow.Subtract(LastInput);"
        ts.WriteLine "            }"
        ts.WriteLine "        }"
        ts.WriteLine "        public static int LastInputTicks {"
        ts.WriteLine "            get {"
        ts.WriteLine "                LASTINPUTINFO lii = new LASTINPUTINFO();"
        ts.WriteLine "                lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));"
        ts.WriteLine "                GetLastInputInfo(ref lii);"
        ts.WriteLine "                return lii.dwTime;"
        ts.WriteLine "            }"
        ts.WriteLine "       }"
        ts.WriteLine "    }"
        ts.WriteLine "}"
        ts.WriteLine "'@"
        ts.WriteLine "$locked = 0;"
        ts.WriteLine "Do {"
        ts.WriteLine "    $idle_time = [PInvoke.Win32.UserInput]::IdleTime;"
        ts.WriteLine "    if (($locked -eq 0) -And ($idle_time -gt $idle_timeout)) {"
        ts.WriteLine "        "& strCommand &""
        ts.WriteLine "        $locked = 1;"
        ts.WriteLine "    }"
        ts.WriteLine "    if ($idle_time -lt $idle_timeout) {"
        ts.WriteLine "        $locked = 0;"
        ts.WriteLine "    }"
        ts.WriteLine "    Start-Sleep -Seconds 10"
        ts.WriteLine "}"
        ts.WriteLine "while (1 -eq 1)"
        ts.Close
        Ret = Ws.run(ByPassPSFile & PSFile,0,True)
    End sub
    '----------------------------------------------------------------------------------------------------------------
    Function AppPrevInstance()   
        With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")   
            With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
                " AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")   
                AppPrevInstance = (.Count > 1)   
            End With   
        End With   
    End Function    
    '----------------------------------------------------------------------------------------------------------------
    Function CommandLineLike(ProcessPath)   
        ProcessPath = Replace(ProcessPath, "\", "\\")   
        CommandLineLike = "'%" & ProcessPath & "%'"   
    End Function
    '----------------------------------------------------------------------------------------------------------------
    Function OSLang()
        Dim dtmConvertedDate,strComputer,objWMIService,oss,os
        Set dtmConvertedDate = CreateObject("WbemScripting.SWbemDateTime")
        strComputer = "."
        Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
        Set oss = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
        For Each os in oss
            OSLang = os.OSLanguage
        Next
    End Function
    '----------------------------------------------------------------------------------------------------------------
      2  0

  4. #4
    Membre à l'essai
    ça marche !!!!!!!!!!!!!!!!!
    Bonjour,

    D'abord merci pour tout. C'est vraiment sympa de votre part.
    Tout ce que je peux faire pour vous remercier c'est de faire un retour utilisateur et des conseil pour les autres utilisateurs :

    Lorsque je lance ce fichier, cela fait son l'effet désiré. (le deuxième script)
    Contrairement à ce que je pensais il n'est pas nécessaire de le déposer dans le dossier startup de windows pour qu'il s’exécute à chaque démarrage. Après la première utilisation le script se retrouvera dans l'onglet démarrage du gestionnaire de tâche, c'est ici que vous devez le désactivé si vous ne voulez plus que cela s'enclenche.

    Pour changer le temps j'ai rédigé ainsi la ligne 35
    Timeout_Idle = "2" '2 Minutes

    Enfin, l'instance de démarrage que l'on retrouve dans le gestionnaire de tâche va poser un problème dans le cas où l'on supprime le VBS. En effet cela fera une ligne "morte", c'est à dire sans fichier lié et sans possibilité de supprimer cette ligne.

    Enfin bis :
    - mon premier batch était actif
    - j'ai souhaité en utilisé un autre en remplacement qui se trouvait dans un répertoire différent avec un nom différent.
    - j'ai donc cliqué sur le second, et j'ai obtenu un message d'erreur disant que le fichier était déjà en cours d’exécution.
    - résultat : dans "démarrage" c'est le deuxième qui a remplacé le premier.


    Merci encore ça marche super bien et simplement.
    Je ne sais pas pour vous mais moi le planificateur de tâche me fait complétement pété un plomb je n'arrive pas à bien l’utiliser et je ne sais jamais pourquoi.

    A+

  5. #5
    Nouveau membre du Club
    Script d'inactivité
    Bonjour, à tous.

    Tout d'abord, merci Hackoofr pour votre formidable travail. J'ai testé le deuxième script et je confirme il fonctionne à merveille d'où ma question???

    Peut on modifier l'extinction par l'exécution d'un programme ou autres merci par avance de votre réponse.

  6. #6
    Expert éminent
    Citation Envoyé par Angelus1753 Voir le message
    Peut on modifier l'extinction par l'exécution d'un programme ou autres merci par avance de votre réponse.
    Oui et ça dépend comme programme ?
    Il faut juste changer cette ligne strCommand = "Shutdown.exe -s -t 60 -c " & DblQuote(Msg(2)) par exemple par celle-ci
    strCommand = "cmd /c Start /MAX Notepad" pour lancer notepad maximisé.

  7. #7
    Nouveau membre du Club
    Script d'inactivité
    Merci pour votre réponse aussi rapide. et toujours aussi efficace, je voulais surtout pouvoir activer un programme ou un autre Scripts...si cela ne vous ennuie pas...quoi qu' il en soit encore un très bon script merci à vous.

  8. #8
    Nouveau membre du Club
    Script d'inactivité
    j'ai testé votre ligne fonctionne.

    mais voila ce que je veux activer ligne 36 de votre code


    la ligne strCommand = "C:\Users\Angelus\Documents\listage musique.vbs" malheureusement cela ne fonctionne pas


    Code VB :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    If Oslang = 1036 Then
        Msg = MsgFR ' French Array Message to be set
    Else
        Msg = MsgEN ' English Array Message to be set
    End If
    Copyright = Msg(0) & ChrW(169) &" Hackoo 2020"
     
    If AppPrevInstance() Then 
        MsgBox Msg(1) & VbCrLF & CommandLineLike(WScript.ScriptName),VbExclamation,Copyright
        WScript.Quit   
    Else 
        Dim Timeout_Idle,strCommand,VbsPath,ShortcutName
        Timeout_Idle = "1"  '60 Minutes = 1 Heure = 1 Hour
        strCommand = "C:\Users\Angelus\Documents\listage musique.vbs"
        VbsPath = Wscript.ScriptFullName
        ShortcutName = "Auto-Shutdown_On_Idle_TimeOut"
        Call Shortcut(VbsPath,ShortcutName)
        Call Write_Run_PScript(Timeout_Idle,strCommand)
    End If

  9. #9
    Expert éminent
    Citation Envoyé par Angelus1753 Voir le message
    j'ai testé votre ligne fonctionne.

    mais voila ce que je veux activer ligne 36 de votre code


    la ligne strCommand = "C:\Users\Angelus\Documents\listage musique.vbs" malheureusement cela ne fonctionne pas


    Code VB :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    If Oslang = 1036 Then
        Msg = MsgFR ' French Array Message to be set
    Else
        Msg = MsgEN ' English Array Message to be set
    End If
    Copyright = Msg(0) & ChrW(169) &" Hackoo 2020"
     
    If AppPrevInstance() Then 
        MsgBox Msg(1) & VbCrLF & CommandLineLike(WScript.ScriptName),VbExclamation,Copyright
        WScript.Quit   
    Else 
        Dim Timeout_Idle,strCommand,VbsPath,ShortcutName
        Timeout_Idle = "1"  '60 Minutes = 1 Heure = 1 Hour
        strCommand = "C:\Users\Angelus\Documents\listage musique.vbs"
        VbsPath = Wscript.ScriptFullName
        ShortcutName = "Auto-Shutdown_On_Idle_TimeOut"
        Call Shortcut(VbsPath,ShortcutName)
        Call Write_Run_PScript(Timeout_Idle,strCommand)
    End If

    Le chemin de votre script contient un espace donc il faut faire toujours attention
    La fonction DblQuote(str) renvoie une chaîne de caractères avec des doubles quotes !
    Pour votre cas essayer comme ça : strCommand = "Cmd /C "& DblQuote("C:\Users\Angelus\Documents\listage musique.vbs") &""


    Ou bien lancer le vbscript directement avec le moteur Wscript.exe
    strCommand = "Wscript.exe "& DblQuote("C:\Users\Angelus\Documents\listage musique.vbs") &""

  10. #10
    Nouveau membre du Club
    Script d'inactivité
    Bonjour, hackoofr

    Cela fonctionne impeccablement bien un grand merci à vous. Ainsi qu'a tous les membres de ce forum

    Je reviendrai vers vous pour un script que vous avez créé qui fonctionne… mais j'aurais des question merci encore à vous. encore merci.

    Un excellent forum

  11. #11
    Expert éminent
    Citation Envoyé par Angelus1753 Voir le message
    Bonjour, hackoofr
    Cela fonctionne impeccablement bien un grand merci à vous. Ainsi qu'a tous les membres de ce forum
    Je reviendrai vers vous pour un script que vous avez créé qui fonctionne… mais j'aurais des question merci encore à vous. encore merci.
    Un excellent forum

    You are Welcome anytime Bro
    Vous êtes le bienvenu à tout moment mon frère
    Surtout N'oubliez pas mon c'est ma devise pour "pondre" des codes

  12. #12
    Nouveau membre du Club
    Script d'inactivité
    Il est bien plus que mérité. Vous faite un travail formidable.

    Dois-je ouvrir une nouvelle discussions ou je peux poster ici ma question pour l'autre Script ???

    Je suis nouveau et je ne connais pas très bien le fonctionnement exact du forum.

  13. #13
    Expert éminent
    Citation Envoyé par Angelus1753 Voir le message
    Il est bien plus que mérité. Vous faite un travail formidable.
    Dois-je ouvrir une nouvelle discussions ou je peux poster ici ma question pour l'autre Script ???
    Je suis nouveau et je ne connais pas très bien le fonctionnement exact du forum.
    Étant donné que cette discussion est il vaudrait mieux ouvrir une nouvelle

###raw>template_hook.ano_emploi###