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
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
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 :

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
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
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
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
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 :
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