Heure système

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Heure système

Message par pat »

Bonjour,

Je sais bien qu'on peut changer l'heure de notre ordinateur.
Mais je soupçonne qu'il y a autre chose.
Par exemple, une heure système que l'utilisateur ne puisse pas changer.
Quelqu'un qui s'y connaisse dans le domaine pourrait-il me donner un bout de code pour que je puisse consulter cette "heure système" qui ne peut être changé par l'utisateur ?
Peut-être que ce n'est pas possible mais je pense que c'est possible.
En fait, il me faut consulter l'heure mais que cette heure ne puisse pas être changée par l'utisateur.
J'espère que j'ai été clair dans mes explications.
Bruce33
Messages : 6
Inscription : dim. 10/sept./2023 14:02

Re: Heure système

Message par Bruce33 »

Bonjour,

Je ne crois pas qu'il y ait une "heure système" cachée.
La carte mère dispose d'un générateur de signal d'horloge, comme le quartz des montres.
L'horloge interne permet de compter le temps écoulé.
De même qu'on règle une montre, un ordinateur neuf doit être mis à l'heure.
D'ailleurs quand la pile de la carte mère est en fin de vie, après une coupure de courant il faut remettre à l'heure l'ordinateur. Mais comme les systèmes d'exploitation actuels se synchronisent avec une horloge sur Internet, on ne s'en rend pas forcément compte.

Pour empêcher la modification de l'heure de l'ordinateur, il faut l'interdire au niveau du système d'exploitation (avec une stratégie dans Windows par exemple).
Je ne sais pas dans quel contexte vous souhaitez l'empêcher... Difficile d'interdire totalement la modification de l'heure. Il faudrait aussi sécuriser l'accès au BIOS qui permet de régler l'heure. Et en démarrant une système d'exploitation à partir d'une clé USB, on pourrait également modifier l'heure.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Heure système

Message par Ar-S »

+1 Bruce33

J'ai trouvé ça. Donc une petite modification du registre parait être une solution.
Accédez à la clé suivante :
HKEY_CURRENT_USER\Software\Policies\Microsoft\

Vérifiez si vous avez Control Panel\International. Sinon, cliquez avec le bouton droit sur Microsoft , puis sélectionnez New > Key . Nommez cette clé comme Panneau(Control Panel) de configuration . Cliquez à nouveau avec le bouton droit sur Panneau de configuration(Control Panel) , puis créez une autre clé(Key) et nommez-la International.

Cliquez maintenant avec le bouton droit sur International , puis sélectionnez New > DWORD (32 bits).

Nommez ce DWORD nouvellement créé comme PreventUserOverrides puis double-cliquez dessus et donnez-lui la valeur 1 . Les options sont :

0 = Activer (Autoriser les utilisateurs à modifier la date et l'heure)
1 = Désactiver (empêcher les utilisateurs de modifier la date et l'heure)

De même, suivez la même procédure à l'intérieur de l'emplacement suivant :
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Control Panel\International
Une fois terminé, fermez tout et redémarrez votre PC pour enregistrer les modifications.
Je vais essayer pour voir

------edit--------
Testé sous windows 11 -> Marche poooooo
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Heure système

Message par pat »

Merci pour les explications.
Mais je pose la question suivante :
Comment font les sharewares pour limiter dans le temps leurs logiciels.
Et il faut bien se repérer dans le temps et si l'utilisateur change l'heure ce n'est pas un problème pour les sharewares pour limiter dans le temps leurs logiciels.
Il y a bien quelque chose qui leur permettent de savoir quelle durée a été utilisée leurs logiciels.
On peut bien sûr utiliser un fichier mais un fichier on finit par le trouver et l'utilisateur finira par le supprimer.
Alors, comment font-il ?
C'est pourquoi je pense qu'il doit y avoir autre chose.
Mais merci quand même pour votre aide.
Bruce33
Messages : 6
Inscription : dim. 10/sept./2023 14:02

Re: Heure système

Message par Bruce33 »

Effectivement les premiers logiciels de type shareware qui étaient limités dans le temps pouvaient être bernés en modifiant la date de Windows avant la date fatidique. C'est quand même assez contraignant de modifier la date du système.
Les programmeurs ont trouvé des parades. Par exemple en détectant une modification de la date entre deux lancements du logiciel (ce n'est pas compliqué.)
S'ils utilisent une information matérielle, je ne sais pas laquelle. On peut lire le temps de fonctionnement d'un disque dur (via les données SMART), cela permet de détecter un jonglage avec la date du système, mais c'est une information incomplète puisqu'on ne sait pas combien de temps l'ordinateur était éteint.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Heure système

Message par pat »

Merci pour ces explications.
Mais comment fait-on pour vérifier le changement de date entre deux lancements ?
Je suis très intéressé par ce problème car je souhaite limiter dans le temps (donc pour la date) la durée de mon logiciel.
Un petit bout de code me serait utile.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Heure système

Message par falsam »

Tu pourrais peut etre stocker l'historique des dates et heure d'utilisation de ton exécutable et tester la cohérence de cette historique.
éventuellement tu peux aussi gerer un compteur d'utilisation.

Ou stocker les informations ? Peut être dans un fichier ADS (Le fichier sera caché) associé à ton exécutable.
:arrow: viewtopic.php?t=17225
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Heure système

Message par GallyHC »

Bonjour,

Pour information, ADS ne fonctionne que sur des partitions NTFS.


Cordialement,
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Heure système

Message par Jacobus »

falsam a écrit : mar. 21/janv./2025 17:12 Ou stocker les informations ? Peut être dans un fichier ADS (Le fichier sera caché) associé à ton exécutable.
:arrow: viewtopic.php?t=17225
Bonjour,
dans le sujet indiqué par falsam datant de 2018, Nico avait posté un code pour lire les ADS facilement. Je l'ai mis à jour pour qu'il fonctionne aujourd'hui (testé avec W11 et PB 6.20B3), notamment avec la structure LARGE_INTEGER. Je vous pose ça là si ça peut être utile.
Perso j'utilise les ADS depuis longtemps, on appelait ça les "fichiers fantômes", très utile, en y stockant des données chiffrées par exemple.

Code : Tout sélectionner

; -------------------------------------------------------------------------------------
; Topic, du code original: http://www.purebasic.fr/french/viewtopic.php?f=6&t=17225
; -------------------------------------------------------------------------------------
; Voici un code qui permet de scanner seulement les streams Alternate Data 
;(Ceux qu'on peut créer et modifier), les autres sont réservés à l'OS je crois.
; -------------------------------------------------------------------------------------
; De Nico
; Sept 2010
; Version 1.0
; Fonctionne à partir de Window 2000 (Système de Fichier NTFS)
; -------------------------------------------------------------------------------------
; Mise à jour
; PureBasic 4.61 ->PAPIPP (2012)
; PureBasic 5.61 ->Nico   (2018)
; PureBasic 6.20 B3 -> Jacobus 2025 
; -------------------------------------------------------------------------------------
; --> Compiler en Unicode et Activer la gestion des Threads ! <--
; -------------------------------------------------------------------------------------
; Ce code permet seulement de lister les streams "Alternate Data"
; contenus dans les fichiers ou les dossiers
; -------------------------------------------------------------------------------------

;{- Enumerations / DataSections
;{ Windows
Enumeration
    #Window_Main
EndEnumeration
;}
;{ Gadgets
Enumeration
    #String_Dossier_Fichier
    #Button_Dossier
    #Button_Fichier
    #ListIcon_Stream
    #Button_Scan
    #Button_StopperScan
    #Button_SupprimerleStream
    #Button_OuvrirSansExtraire
    #Button_ExtraireEtEditer
    #Button_Quitter
    #Text_Info
    #Button_OuvrirExplorateur
    #BarreEtat
EndEnumeration
;}
;}

Global Chemin$
Global NomStream.s,StreamSize.q
Global FinRecherche.l

; Avec la structure LARGE_INTEGER puisque le compilateur prend en charge les entiers 64 bits, 
; il faut utiliser QuadPart pour stocker l’entier 64 bits. 
; Sinon, il faut utiliser LowPart et HighPart.
Procedure ReadStream(CheminDossier_CheminFichier.s)
    Protected file_h.i,z.i,*stream.WIN32_STREAM_ID
    Protected context.l=0,bytes_read.l=0,bytes_read1.l=0,seek_l=0,seek_h=0,Result.l=0
    Protected namesize.l,streamHight.q,streamLow.q
    
    file_h=CreateFile_(@CheminDossier_CheminFichier,#READ_CONTROL,0,0,#OPEN_EXISTING,#FILE_FLAG_BACKUP_SEMANTICS,0)
    
    If file_h<>0
        
        *stream.WIN32_STREAM_ID=AllocateMemory(20)
        z=BackupRead_(file_h,*stream,20,@bytes_read,0,1,@context)
        
        While (bytes_read<>0) And Result=0
            
            namesize=*stream\dwStreamNameSize
            If namesize>0
                *buffer=AllocateMemory(namesize)
                BackupRead_(file_h,*buffer,namesize,@bytes_read1,0,1,@context)
                NomStream=PeekS(*buffer,namesize/2,#PB_Unicode)
                FreeMemory(*buffer)
            EndIf           
            
            If *stream\dwStreamID=#BACKUP_ALTERNATE_DATA
                ;             streamHight.q=*stream\dwStreamSizeHigh & $FFFFFFFF
                ;             streamLow.q=*stream\dwStreamSizeLow & $FFFFFFFF
              
;                 streamHight.q=*stream\Size\highpart & $FFFFFFFF
;                 streamLow.q=*stream\Size\lowpart & $FFFFFFFF
              
; >>>>>>>> prise en charge des entiers 64 bits par le compilateur, utilisation de QuadPart
                streamHight.q=*stream\Size\QuadPart & $FFFFFFFF
                streamLow.q=*stream\Size\QuadPart & $FFFFFFFF
                
                StreamSize.q=streamHight<<32 | streamLow
                Result=1
            EndIf
            
            ;          BackupSeek_(file_h,*stream\dwStreamSizeLow,*stream\dwStreamSizeHigh,@seek_l,@seek_h,@context)
;             BackupSeek_(file_h,*stream\Size\lowpart,*stream\Size\lowpart,@seek_l,@seek_h,@context)
            
; >>>>>>>> prise en charge des entiers 64 bits par le compilateur, utilisation de QuadPart ici aussi
            BackupSeek_(file_h,*stream\Size\QuadPart,*stream\Size\QuadPart,@seek_l,@seek_h,@context)
            
            FreeMemory(*stream)
            *stream.WIN32_STREAM_ID=AllocateMemory(20)
            bytes_read=0
            z=BackupRead_(file_h,*stream,20,@bytes_read,0,1,@context)
        Wend
        
        FreeMemory(*stream)
        
        BackupRead_(file_h,0,0,@bytes_read,1,0,@context)
        CloseHandle_(file_h)
        
    EndIf
    ProcedureReturn Result
EndProcedure


Procedure.s ParseDirectory(folder.s,id.l=0)
    Protected Type.s
    
    If Right(folder,1)<>"\"
        folder+"\"
    EndIf
    If ExamineDirectory(id,folder,"*.*")
        If FinRecherche<2
            While NextDirectoryEntry(id)
                If DirectoryEntryName(id)<>"." And DirectoryEntryName(id)<>".."
                    ;##########################################
                    StatusBarText(#BarreEtat,0,folder+DirectoryEntryName(id))
                    If ReadStream(folder+DirectoryEntryName(id))
                        If DirectoryEntryType(id)=#PB_DirectoryEntry_Directory
                            Type.s="Dossier"
                        Else
                            Type.s="Fichier"
                        EndIf
                        
                        AddGadgetItem(#ListIcon_Stream,-1,NomStream+Chr(10)+Str(StreamSize)+Chr(10)+Type+Chr(10)+folder+DirectoryEntryName(id))
                    EndIf
                    ;##########################################
                    If DirectoryEntryType(id)=#PB_DirectoryEntry_Directory
                        ParseDirectory(folder+DirectoryEntryName(id),id+1)
                    EndIf
                EndIf
            Wend
        EndIf
        FinishDirectory(id)
    EndIf
EndProcedure

Procedure ParseCheminFichierouDossier(folder.s)
    Protected Type.s
    
    If FileSize(folder)=-2
        Type.s="Dossier"
    Else
        Type.s="Fichier"
    EndIf
    If ReadStream(folder)
        AddGadgetItem(#ListIcon_Stream,-1,NomStream+Chr(10)+Str(StreamSize)+Chr(10)+Type+Chr(10)+folder)
    EndIf
    If Type="Dossier"
        ParseDirectory(folder)
    EndIf
EndProcedure

Procedure DisableGadgetGroup1(Etat.l)
    DisableGadget(#Button_Dossier,Etat)
    DisableGadget(#Button_Fichier,Etat)
    DisableGadget(#Button_Scan,Etat)
    DisableGadget(#Button_Quitter,Etat)
EndProcedure

Procedure DisableGadgetGroup2(Etat.l)
    DisableGadget(#Button_SupprimerleStream,Etat)
    DisableGadget(#Button_OuvrirSansExtraire,Etat)
    DisableGadget(#Button_ExtraireEtEditer,Etat)
    DisableGadget(#Button_OuvrirExplorateur,Etat)
EndProcedure

Procedure Thread(lParam.i)
    ParseCheminFichierouDossier(Chemin$)
    StatusBarText(#BarreEtat,0,"")
    FinRecherche=0
    DisableGadget(#Button_StopperScan,1)
    DisableGadgetGroup1(0)
EndProcedure

Procedure OpenWindow_Window_Main()
    If OpenWindow(#Window_Main,200,200,660,460,"Alternate Data Stream SPY",#PB_Window_SystemMenu | #PB_Window_TitleBar)
        StringGadget(#String_Dossier_Fichier,10,25,560,25,"",#PB_String_ReadOnly)
        ButtonGadget(#Button_Dossier,580,10,60,25,"Dossier")
        ButtonGadget(#Button_Fichier,580,40,60,25,"Fichier")
        ListIconGadget(#ListIcon_Stream,10,110,640,250,"Nom du Stream",170,#PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
        AddGadgetColumn(#ListIcon_Stream,1,"Taille",60)
        AddGadgetColumn(#ListIcon_Stream,2,"Type",60)
        AddGadgetColumn(#ListIcon_Stream,3,"Chemin",360)
        
        ButtonGadget(#Button_Scan,100,70,175,25,"Scan Alternate Data Stream")
        ButtonGadget(#Button_StopperScan,330,70,175,25,"Stopper le Scan")
        ButtonGadget(#Button_SupprimerleStream,335,370,145,25,"Supprimer le Stream")
        ButtonGadget(#Button_OuvrirSansExtraire,10,370,145,25,"Ouvrir sans extraire")
        ButtonGadget(#Button_ExtraireEtEditer,170,370,145,25,"Extraire et éditer")
        ButtonGadget(#Button_Quitter,265,405,130,25,"Quitter")
        TextGadget(#Text_Info,10,5,520,20,"Vous pouvez glisser-déposer un Fichier ou un Dossier dans la zone de texte ci-dessous")
        ButtonGadget(#Button_OuvrirExplorateur,495,370,155,25,"Ouvrir dans l'explorateur")
        
        CreateStatusBar(#BarreEtat,WindowID(#Window_Main))
        AddStatusBarField(#PB_Ignore)
        
        EnableGadgetDrop(#String_Dossier_Fichier,#PB_Drop_Files,#PB_Drag_Copy)
        
        DisableGadget(#Button_StopperScan, 1)
        DisableGadgetGroup2(1)
    EndIf
EndProcedure

OpenWindow_Window_Main()

;{- Event loop
Repeat
    Select WaitWindowEvent()
            ; ///////////////////
        Case #PB_Event_GadgetDrop
            Select EventGadget()
                Case #String_Dossier_Fichier
                    Files$=EventDropFiles()
                    Count=CountString(Files$,Chr(10))+1
                    SetGadgetText(#String_Dossier_Fichier,StringField(Files$,1,Chr(10)))
            EndSelect
            
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Button_Dossier
                    Chemin$=PathRequester("Choisissez un répertoire:","C:\")
                    SetGadgetText(#String_Dossier_Fichier,Chemin$)
                    
                Case #Button_Fichier
                    Chemin$=OpenFileRequester("Choisissez un fichier:","C:\","*.*",0)
                    SetGadgetText(#String_Dossier_Fichier,Chemin$)
                    
                Case #ListIcon_Stream
                    Index.l=GetGadgetState(#ListIcon_Stream)
                    If Index>-1
                        DisableGadgetGroup2(0)
                    Else
                        DisableGadgetGroup2(1)
                    EndIf
                    
                Case #Button_Scan
                    ClearGadgetItems(#ListIcon_Stream)
                    Chemin$=GetGadgetText(#String_Dossier_Fichier)
                    If FileSize(Chemin$)<>-1
                        DisableGadgetGroup1(1)
                        DisableGadgetGroup2(1)
                        DisableGadget(#Button_StopperScan,0)
                        FinRecherche=1
                        CreateThread(@Thread(),0)
                    Else
                        MessageRequester("Info","Choisissez un chemin de Dossier ou de Fichier valide!")
                    EndIf
                    
                Case #Button_StopperScan
                    FinRecherche=2
                    DisableGadget(#Button_StopperScan,1)
                    DisableGadgetGroup1(0)
                    
                Case #Button_OuvrirSansExtraire
                    Index.l=GetGadgetState(#ListIcon_Stream)
                    If Index>-1
                        NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
                        NameStream=StringField(NameStream,2,":")
                        CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
                        MessageRequester("Info","Dans certain cas, Notepad ne sera pas en mesure d'ouvrir le Stream !"+Chr(13)+"mais vous pouvez toujours faire une Extraction puis ensuite éditer le Fichier ainsi obtenu.")
                        RunProgram("Notepad.exe",CheminStream+":"+NameStream,"")
                    EndIf
                    
                Case #Button_ExtraireEtEditer
                    Index.l=GetGadgetState(#ListIcon_Stream)
                    If Index>-1
                        NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
                        NameStream=StringField(NameStream,2,":")
                        Taille.s=GetGadgetItemText(#ListIcon_Stream,Index,1)
                        If Taille<>"0"
                            NomFichier$=SaveFileRequester("Choisissez un emplacement:",NameStream,"*.*",0)
                            If NomFichier$<>""
                                CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
                                If ReadFile(0,CheminStream+":"+NameStream)
                                    Longueur.q=Lof(0)
                                    *Buffer=AllocateMemory(Longueur)
                                    ReadData(0,*Buffer,Longueur)
                                    CloseFile(0)
                                    If CreateFile(0,NomFichier$)
                                        WriteData(0,*Buffer,Longueur)
                                        CloseFile(0)
                                        ret = MessageRequester("Erreur","Voulez vous ouvrir ce fichier? " +  Chr(10) + NomFichier$, #PB_MessageRequester_YesNo)
                                        If ret = #PB_MessageRequester_Yes
                                            RunProgram("Notepad.exe",NomFichier$,"")
                                        EndIf 
                                    Else
                                       MessageRequester("Erreur","Impossible de créer le fichier! " +  Chr(10) + NomFichier$ )
                                    EndIf
                                    FreeMemory(*Buffer)
                                Else
                                    MessageRequester("Erreur","Le Stream n'a pas pu être sauvegardé!")
                                EndIf
                            EndIf
                        Else
                            MessageRequester("Info","La Taille de ce Stream est de 0 octet, il est inutile de vouloir le sauvegarder!")
                        EndIf
                    EndIf
                    
                Case #Button_SupprimerleStream
                    Index.l=GetGadgetState(#ListIcon_Stream)
                    If Index>-1
                        NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
                        NameStream=StringField(NameStream,2,":")
                        CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
                        Type.s=GetGadgetItemText(#ListIcon_Stream,Index,2)
                        Message$="Êtes-vous sûr de vouloir supprimer le Stream : "+NameStream+" ?"+Chr(13)+"du "+Type+" "+CheminStream
                        Resultat=MessageRequester("Attention",Message$,#PB_MessageRequester_YesNo)
                        If Resultat=#PB_MessageRequester_Yes
                            If DeleteFile(CheminStream+":"+NameStream)<>0
                                RemoveGadgetItem(#ListIcon_Stream,Index)
                            Else
                                MessageRequester("Erreur","Le Stream n'a pas pu être effacé!")
                            EndIf
                        EndIf
                    EndIf
                    
                Case #Button_OuvrirExplorateur
                    Index.l=GetGadgetState(#ListIcon_Stream)
                    If Index>-1
                        CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
                        RunProgram("Explorer.exe","/e, /Select,"+CheminStream,"")
                    EndIf
                    
                Case #Button_Quitter
                    CloseWindow(#Window_Main)
                    Break
            EndSelect
            ; ////////////////////////
        Case #PB_Event_CloseWindow
            Select EventWindow()
                Case #Window_Main
                    If FinRecherche=0
                        CloseWindow(#Window_Main)
                        Break
                    Else
                        MessageRequester("Info","Cliquez sur le Bouton Stopper le Scan avant de quitter!")
                    EndIf
            EndSelect
    EndSelect
ForEver
;
;}
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Heure système

Message par falsam »

Merci pour cette mise à jour 👍
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Heure système

Message par pat »

Merci à vous tous pour vos contributions respectives.
Je vais réfléchir à tout ça.
Répondre