Page 1 sur 2

[..]Problème script "PC démarré depuis" Win7 / Win10

Posté : lun. 04 sept. 2017 14:55
par corrs78
Bonjour,

j'ai un problème sur un script que je n'ai pas écrit. le but de ce script est de savoir depuis combien de temps est démarrée la machine de l'utilisateur. Si elle est démarrée depuis plus de 5 jours, je lui impose un redémarrage (pour des raisons particulières).
Ce script fonctionne très bien sur Windows 7 Pro, or je migre petit à petit mes PC sous Windows 10 ; sur cet OS le script réagit anormalement.

Aujourd'hui par exemple j'ai démarré mon PC, et quelques secondes après le script m'a affiché que mon PC etait démarré depuis plus de 6 jours -> donc redémarrage.

je ne comprends pas bien ce comportement.

Merci à vous.

Code : Tout sélectionner

;FONCTION DEMARRE DEPUIS ...
Func _ComputerGetOSs()
    Local $colItems, $objWMIService, $objItem, $i = 1
    Local $aOSInfo[1]

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If(Not(IsObj($objWMIService))) Then Return $aOSInfo
    $colItems = $objWMIService.ExecQuery("SELECT Name, BuildNumber, LastBootUpTime, SerialNumber FROM Win32_OperatingSystem", "WQL", 0x10 + 0x20)

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aOSInfo[UBound($aOSInfo) + 1]
            $aOSInfo[$i] = __StringToDate($objItem.LastBootUpTime)
            $i += 1
        Next
        $aOSInfo[0] = UBound($aOSInfo) - 1
        If $aOSInfo[0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
    Return $aOSInfo
EndFunc ;_ComputerGetOSs

Func __StringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
            StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
            & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
EndFunc

Func InverserMoisJour($Texte)
    Return StringMid($Texte, 4, 2) & "/" & StringMid($Texte, 1, 2) & StringTrimLeft($Texte, 5)
EndFunc

Func TimeGetLongFormatBySec($Sec)
    Local $Retour = ""
    Local $Temp
    Local $Compare = 60*60*24

    If($Sec > $Compare Or $Retour <> "") Then
        $Temp = Floor($Sec/($Compare))
        $Retour &= $Temp & " jour"
			; SI PC demarré depuis plus de 3 jours alors popup redemarrage impératif.

				if $Temp >= 5    Then
					MsgBox(16,"ATTENTION !!!","Votre ordinateur n'a pas été redémarré depuis plus de "&$Temp&" jours." & @CRLF _
					& " VOUS DEVEZ IMPERATIVEMENT LE REDEMARRER" &@CRLF &	@CRLF _
					&"Veuillez fermer vos travaux en cours et cliquez sur ""OK""")
					;Shutdown(6)
				EndIf
        If($Temp > 1) Then
            $Retour &= "s"
        EndIf
        $Retour &= " "
        $Sec -= $Temp*$Compare
    EndIf
    $Compare = 60*60
    If($Sec > $Compare Or $Retour <> "") Then
        $Temp = Floor($Sec/($Compare))
        $Retour &= $Temp & " heure"
        If($Temp > 1) Then
            $Retour &= "s"
        EndIf
        $Retour &= " "
        $Sec -= $Temp*$Compare
    EndIf
    $Compare = 60
    If($Sec > $Compare Or $Retour <> "") Then
        $Temp = Floor($Sec/($Compare))
        $Retour &= $Temp & " minute"
        If($Temp > 1) Then
            $Retour &= "s"
        EndIf
        $Retour &= " "
        $Sec -= $Temp*$Compare
    EndIf
    $Compare = 1
;~     If($Sec > $Compare Or $Retour <> "") Then
;~         $Temp = Floor($Sec/($Compare))
;~         $Retour &= $Temp & " seconde"
;~         If($Temp > 1) Then
;~             $Retour &= "s"
;~         EndIf
;~         $Retour &= " "
;~         $Sec -= $Temp*$Compare
;~     EndIf
    Return $Retour
EndFunc

Func GetSecByStringDate($time)
    Return  Number(StringMid($time, 7, 4))*31536000 + _
            Number(StringLeft($time, 2))*86400 + _
            Number(StringMid($time, 4, 2))*2678400 + _
            Number(StringMid($time, 12, 2))*3600 + _
            Number(StringMid($time, 15, 2))*60 + _
            Number(StringRight($time, 2))
EndFunc

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mar. 05 sept. 2017 00:48
par jchd
Une solution possible (non testée) : https://www.autoitscript.com/forum/topi ... windows10/

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : lun. 11 sept. 2017 14:34
par corrs78
je vais tester ça. merci.
je reviens vers vous très vite

Edit :
bon j'ai essayé, avec ça : j'ai la meme incohérence,
j'ai démarré mon PC ce matin , il m'affiche 149h :shock:

Code : Tout sélectionner

#include <WinAPISys.au3>
#include <WinAPIMisc.au3>

Local $Uptime = _WinAPI_StrFromTimeInterval(_WinAPI_GetTickCount64())
MsgBox(0, '', "PC Uptime ==> " & $UpTime)

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : jeu. 14 sept. 2017 22:38
par Tlem
Bonsoir.

Que donne ce code chez vous ?

Code : Tout sélectionner

#include <Date.au3>

Local $colItems = ""
Local $Output = ""
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
$colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_OperatingSystem", "WQL", 0x30)

If IsObj($colItems) Then
   For $objItem In $colItems
      $LastBootUp = WMIDateStringToDate($objItem.LastBootUpTime)
      $LocalDateTime = WMIDateStringToDate($objItem.LocalDateTime)

	  $Output &= "Date du système     = " & $LocalDateTime & @CRLF
	  $Output &= "Dernier démarrage = " & $LastBootUp & @CRLF & @CRLF
	  $Output &= "Système démarré depuis : " & @CRLF

      $Output &= @TAB & "En jours   : " & @TAB & _DateDiff("D", $LastBootUp, $LocalDateTime) & @CRLF
      $Output &= @TAB & "En heures  : " & @TAB & _DateDiff("h", $LastBootUp, $LocalDateTime) & @CRLF
      $Output &= @TAB & "En minutes : " & @TAB & _DateDiff("n", $LastBootUp, $LocalDateTime) & @CRLF
      If MsgBox(1, "Retour WMI", $Output) = 2 Then ExitLoop
   Next
Else
   MsgBox(0, "Retour WMI", "Pas d'objets WMI trouvé pour la class: " & "Win32_OperatingSystem")
EndIf


Func WMIDateStringToDate($dtmDate)

   Return (StringMid($dtmDate, 1, 4) & "/" & _
         StringMid($dtmDate, 5, 2) & "/" & _
         StringMid($dtmDate, 7, 2) & _
         " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
EndFunc  ;==>WMIDateStringToDate

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mer. 20 sept. 2017 11:00
par corrs78
Tlem a écrit : jeu. 14 sept. 2017 22:38 Bonsoir.

Que donne ce code chez vous ?

Code : Tout sélectionner

#include <Date.au3>

Local $colItems = ""
Local $Output = ""
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
$colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_OperatingSystem", "WQL", 0x30)

If IsObj($colItems) Then
   For $objItem In $colItems
      $LastBootUp = WMIDateStringToDate($objItem.LastBootUpTime)
      $LocalDateTime = WMIDateStringToDate($objItem.LocalDateTime)

	  $Output &= "Date du système     = " & $LocalDateTime & @CRLF
	  $Output &= "Dernier démarrage = " & $LastBootUp & @CRLF & @CRLF
	  $Output &= "Système démarré depuis : " & @CRLF

      $Output &= @TAB & "En jours   : " & @TAB & _DateDiff("D", $LastBootUp, $LocalDateTime) & @CRLF
      $Output &= @TAB & "En heures  : " & @TAB & _DateDiff("h", $LastBootUp, $LocalDateTime) & @CRLF
      $Output &= @TAB & "En minutes : " & @TAB & _DateDiff("n", $LastBootUp, $LocalDateTime) & @CRLF
      If MsgBox(1, "Retour WMI", $Output) = 2 Then ExitLoop
   Next
Else
   MsgBox(0, "Retour WMI", "Pas d'objets WMI trouvé pour la class: " & "Win32_OperatingSystem")
EndIf


Func WMIDateStringToDate($dtmDate)

   Return (StringMid($dtmDate, 1, 4) & "/" & _
         StringMid($dtmDate, 5, 2) & "/" & _
         StringMid($dtmDate, 7, 2) & _
         " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
EndFunc  ;==>WMIDateStringToDate
Avec les 2 méthodes que j'ai trouvé sur le forum US, j'obtiens toujours ce résultat.
Je viens d'arrêter ma machine, au démarrage j'obtiens cela :
Image

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mer. 20 sept. 2017 21:29
par Tlem
Donc après redémarrage le code fonctionne. ^^

Envoyé de mon SM-N9005 en utilisant Tapatalk


Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mer. 20 sept. 2017 21:47
par corrs78
Tlem a écrit : mer. 20 sept. 2017 21:29 Donc après redémarrage le code fonctionne. ^^

Envoyé de mon SM-N9005 en utilisant Tapatalk
justement non, c'est exactement le meme résultat, il me dit que l'ordinateur est démarré depuis 2 jours alors que je viens seulement de le démarrer :roll:
curieux

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mer. 20 sept. 2017 22:03
par orax
Et avec ces commandes... ?

systeminfo | find "démarrage"

wmic OS GET LastBootUpTime

Code : Tout sélectionner

C:\>wmic OS GET LastBootUpTime
LastBootUpTime
20170920215709.496418+120

C:\>systeminfo | find "démarrage"
Heure de démarrage du système:              20/09/2017, 21:57:09

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mer. 20 sept. 2017 22:21
par Tlem
corrs78 a écrit : mer. 20 sept. 2017 21:47il me dit que l'ordinateur est démarré depuis 2 jours alors que je viens seulement de le démarrer :roll:
curieux
Hummmm ça sent l'extinction hybride. Je pense que votre PC ne fait pas un redémarrage complet, il doit y avoir une sorte de mise en veille.
Même si c'est quelque chose de pas standard, fermez toutes vos applications et débranchez en live la prise du PC. Rebranchez, puis redémarrez.
Si le problème persiste, c'est que votre Windows a un gros problème car le système n'arrive probablement pas à mettre à jour la date de redémarrage, ou peut être un problème avec la pile du PC, voir un virus qui modifie ou fait croire au système qu'il a démarré deux jours avant ...

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mer. 20 sept. 2017 22:27
par corrs78
Tlem a écrit : mer. 20 sept. 2017 22:21
corrs78 a écrit : mer. 20 sept. 2017 21:47il me dit que l'ordinateur est démarré depuis 2 jours alors que je viens seulement de le démarrer :roll:
curieux
Hummmm ça sent l'extinction hybride. Je pense que votre PC ne fait pas un redémarrage complet, il doit y avoir une sorte de mise en veille.
Même si c'est quelque chose de pas standard, fermez toutes vos applications et débranchez en live la prise du PC. Rebranchez, puis redémarrez.
Si le problème persiste, c'est que votre Windows a un gros problème car le système n'arrive probablement pas à mettre à jour la date de redémarrage, ou peut être un problème avec la pile du PC, voir un virus qui modifie ou fait croire au système qu'il a démarré deux jours avant ...
ok je teste ça demain pour la veille hybride je ne pense pas car c'est un vieux PC Fixe et je vois bien le Bios quand je le démarre. En fait j'ai ce problème qu'avec Windows10 et Windows 2012 server. avec Windows7 aucun souci, sur les memes machines.

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mer. 20 sept. 2017 22:45
par Tlem
Si vous faites plusieurs essais, est-ce que l'heure du dernier démarrage change lorsque que vous testez après avoir redémarré ?

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : jeu. 21 sept. 2017 10:01
par corrs78
Suite à vos messages j'ai fait plusieurs tests et en effet, vos différentes commandes donnent toutes le même résultat que mes scripts autoit d'origine.
En fait c'est bien le "timer" de windows qui ne se réinitialise pas quand on ARRETE le PC.
Par contre si je redémarre le PC ça redémarre bien à zéro.
(J'ai vérifié dans les paramètre d'alimentation, je n'ai aucun type de veille activé) c'est vraiment très curieux, surtout que ça touche seulement Windows10.

Conclusion, je n'ai pas de moyen pour forcer mes utilisateurs à redémarrer leur ordinateur automatiquement sur W10. Car ceux qui éteignent leur PC tous les jours (sur Win10) sont aussi considérés comme des utilisateurs qui ne le font pas :|

EDIT :
Le problème viendrait de l'option FastStartup
https://social.technet.microsoft.com/Fo ... progeneral

me reste plus qu'à désactiver ça sur tout mon parc (500 machines) j'espère que je vais pouvoir faire cela via Autoit et que l'UAC va pas encore me casser les noisettes . A suivre...

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : lun. 18 déc. 2017 12:17
par corrs78
Finalement je ne peux pas toucher à cette option de Windows10, je vais devoir contourner le problème.
Mon objectif est que mes utilisateurs Arrêtent/Redémarrent au moins une fois pas semaine leur PC.

Avant dès qu'il ouvrait un programme Autoit (qu'ils doivent exécuter régulièrement pour maintenance.), si le PC etait UP depuis plus de 5 jours je forçais le redémarrage. Malheureusement ceci ne fonctionne plus avec W10.

j'avais pensé à créer un fichier à chaque ouverture de session avec la date inscrite à l'intérieur et faire un dateDiff.

Avez-vous d'autres pistes de reflexion ?

Merci

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mar. 09 janv. 2018 20:31
par jguinch
Quelques infos ici : http://www.winhelponline.com/blog/incor ... i-refresh/
L'idée est de réinitialiser la couche WMI à chaque arrêt de la machine via un script de fermeture de session (voir par partie "Create a Batch File and Run as a Shutdown Script (Windows Pro Editions and higher)").

Edit : est-ce que tu peux essayer ce script PowerShell ? : https://www.verboon.info/2014/01/powers ... formation/

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : dim. 21 janv. 2018 21:41
par overflow
pkoi ne pas juste sauvegarder la date a chaque lancement du prog autoit et quand ca depasse 5 jour on reboot ?

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : dim. 21 janv. 2018 21:50
par corrs78
jguinch a écrit : mar. 09 janv. 2018 20:31 Quelques infos ici : http://www.winhelponline.com/blog/incor ... i-refresh/
L'idée est de réinitialiser la couche WMI à chaque arrêt de la machine via un script de fermeture de session (voir par partie "Create a Batch File and Run as a Shutdown Script (Windows Pro Editions and higher)").

Edit : est-ce que tu peux essayer ce script PowerShell ? : https://www.verboon.info/2014/01/powers ... formation/
je teste ça demain, et je reviens vers toi. Merci
(en espérant ne pas avoir de souci d'élévation de pouvoir)

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : dim. 21 janv. 2018 21:55
par corrs78
overflow a écrit : dim. 21 janv. 2018 21:41 pkoi ne pas juste sauvegarder la date a chaque lancement du prog autoit et quand ca depasse 5 jour on reboot ?
c'est pas une mauvaise idée, mais ça ne répond pas vraiment au problème.
Le but étant de faire redémarrer WIndows ou du moins forcer mes utilisateurs à arreter leur PC.
Avec ton idée, même si la personne arrête régulièrement son PC, si il lance la boite d'outils (scripts) qu'une fois pas semaine il sera quand meme focé de redémarrer. Voilà pourquoi je veux absolument savoir depuis combien de temps est démarrer l'OS.

Bonne soirée.

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : lun. 22 janv. 2018 02:11
par Tlem
Plus simplement, pourquoi ne pas faire cette sauvegarde de date au démarrage de Windows ?
Une tâche système (donc invisible) et pour pas risquer d'offusquer un quelconque AV, une simple commande Batch. ^^

Votre script de maintenance ira lire ce fichier et si la date est > à 5 jours, alors on reboot. ^^
Encore mieux :Vous pourriez créer une tache unique qui redémarrera le PC en dehors des heures de bureau. ^^

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mar. 23 janv. 2018 15:10
par corrs78
Tlem a écrit : lun. 22 janv. 2018 02:11 Plus simplement, pourquoi ne pas faire cette sauvegarde de date au démarrage de Windows ?
Une tâche système (donc invisible) et pour pas risquer d'offusquer un quelconque AV, une simple commande Batch. ^^

Votre script de maintenance ira lire ce fichier et si la date est > à 5 jours, alors on reboot. ^^
Encore mieux :Vous pourriez créer une tache unique qui redémarrera le PC en dehors des heures de bureau. ^^
Bonne idée, merci.
sachant que j'ai déjà un script autoit lancé par la GPO à chaque démarrage de mes PC, je pourrais très bien le faire via ce script avec les fonction _Now et _DateDiff.
je vais plancher sur le sujet.

edit: finalement j'ai fait encore plus simple :

Code : Tout sélectionner

Local $Jour_Diff = (@YDAY - $JourDeDemarrage)
je fais une différence de jour en me basant sur le quantième de l'année
Au démarrage du PC j'écris le quantième de l'année dans un fichier sur le client.
Lorsque le script de maintenance est executé par l'utilisateur, si la différence de jour est supérieure à 5 jours force le redémarrage du PC. (C'est pas super précis, mais ça me va).

Re: [..]Problème script "PC démarré depuis" Win7 / Win10

Posté : mar. 23 janv. 2018 23:35
par Tlem
Bonsoir.
Je pense que votre méthode, risque de poser problème dans certains cas. Par exemple, si le PC est allumé fin Décembre et que le script de maintenance est lancé début janvier Janvier. ^^

Voici une première solution "infaillible" pour la méthode utilisée :
Au lieu d'utiliser comme référence le nombre de jour de l'année, on se base plutôt sur le nombre de jours Julien.
Je vous laisse aller consulter le lien explicatif. ^^

Voici un script qui calcul le nombre de jour Julien par rapport à la date du jour :

Code : Tout sélectionner

Local $iYear = @YEAR
Local $iMonth = @MON
Local $iDay = @MDAY

If $iMonth < 3 Then
	$iMonth = $iMonth + 12
	$iYear = $iYear - 1
EndIf

Local $i_FactorA = Int($iYear / 100)
Local $i_FactorB = Int($i_FactorA / 4)
Local $i_FactorC = 2 - $i_FactorA + $i_FactorB
Local $i_FactorE = Int(1461 * ($iYear + 4716) / 4)
Local $i_FactorF = Int(153 * ($iMonth + 1) / 5)
Local $iJulianDate = $i_FactorC + $iDay + $i_FactorE + $i_FactorF - 1524.5

MsgBox(0, "", "Nombre de jours Julien : " & $iJulianDate)
Et si pour une raison particulière vous souhaitez plutôt utiliser la même référence que la NASA (le nombre de Jour julien tronqué correspondant au 24 mai 1968 à 0 heures), alors remplacez le nombre 1524.5 par le nombre 2441525


La deuxième solution serait certainement plus simple, mais je n'ai pas testé si elle était soumise ou non au problème que vous avez déjà rencontré. On ne sait jamais, vous devriez essayer :

Code : Tout sélectionner

Local $aTC = DllCall("kernel32.dll", "dword", "GetTickCount")
If Not @error Then
		; 1 jour = 86400000 ms	5 jours = 432000000 ms
		If $aTC[0] > 432000000 Then MsgBox(16, "", "L'ordinateur fonctionne depuis plus de 5 jours !!!")
EndIf