none
Créer un point de restauration par VB 2008 RRS feed

  • Discussion générale

  • Salut !

    est-il possible ce créer automatiquement un point de restauration avec VB 2008 ?

    Pour l'instant, je lance : Process.Start("C:\Windows\system32\restore\rstrui.exe"). Mais je ne sais pas si la personne l'a créé.

    J'ai trouvé un code pour VBS. Mais j'aimerais faire autrement ou convertir ce code pour VB 2008 sans passer par wscript.exe (mal vu apparemment.

    If WScript.Arguments.Count = 0 Then
         Set objShell = CreateObject("Shell.Application")
         objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " Run", , "runas", 1
    Else
         GetObject("winmgmts:\\.\root\default:Systemrestore").CreateRestorePoint InputBox("Entrer une description pour le point de restauration:","Create Restore Point - Forum-Seven.com"), 0, 100
         Msgbox("Point de restauration créé !")
    End If

    Merci

    • Type modifié Aurel Bera mercredi 11 juin 2014 10:54 disc
    mercredi 4 juin 2014 20:54

Toutes les réponses

  • J'ai trouvé une réponse mais il faut les droit d'administrateur. :(

        Function CreateSystemRestorePoint() As Boolean
            'Création de point de restauration
            On Error GoTo Oops
            Dim CreationDuPoint As Object, Nom As String
    
            'Nom du point
            Nom = "Sauvegarde du " & Now.Day & " " & Now.Month & " " & Now.Year
    
            'Création du point
            CreationDuPoint = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
            Call CreationDuPoint.CreateRestorePoint(Nom, 0, 100)
            CreateSystemRestorePoint = True
            Exit Function
    Oops:
            CreateSystemRestorePoint = False
        End Function
    

    Est-il possible de réexécuter le programme en tant qu’administrateur comme la fonction :

    Application.Restart

    Je n'ai rien trouvé d'autre. Ni même en fichier VBS, BAT etc. Je peux mettre les droit pour toujours mais l'ennuie, le programme démarre en même temps que Windows donc, il me demanderait à chaque démarrage. Je voudrais les droits juste pour faire la restauration.

    mercredi 4 juin 2014 22:35
  • Bonjour,

    Est-il possible de réexécuter le programme en tant qu’administrateur comme la fonction :
    Application.Restart
    Je n'ai rien trouvé d'autre. Ni même en fichier VBS, BAT etc. Je peux mettre les droit pour toujours mais l'ennuie, le programme démarre en même temps que Windows donc, il me demanderait à chaque démarrage. Je voudrais les droits juste pour faire la restauration.

    Non... Si il était possible qu'un programme puisse tourner avec les droits administrateurs automatiquement, alorsles programmes malveillant serait toujours en train d'être exécuté avec les droits administrateurs.

    La seul chose que vous pouvez faire c'est dans votre application de vous loguer en tant qu'administrateur (il faut spécifier le login et le mot de passe, et donc le stocker qq part...) et ensuite vous redémarrer votre application.

    Je suis désolé, mais je n'ai pas trouvé d'article pour VB .NET : http://www.codeproject.com/Articles/14358/User-Impersonation-in-NET

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    mercredi 4 juin 2014 23:42
    Modérateur
  • Bonjour,

    ce que je voulais dire c'est comme l'orque l'on exécute toujours un programme avec ce mode. Il y a le message d'avertissement "Voulez-vous exécuter .. en mode administrateur ?" et la personne clique sur OK ou Annuler.

    Je sais le faire pour tout le temps dans les paramètres UAC :

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    Mais j'aurais aimé le faire pas tout le temps parce ce que si le programme demande toujours les droits, il ne peut pas démarrer en même temps que Windows. J'ai testé.

    Bon autre soucis, je ne vous pas les points de restauration avec le code ci-dessus. En manuel, il met 20 secondes à le créer et il apparait. Avec ce bout de code, il met moins de 2 secondes mais il n’apparaît pas. :(

    Merci

    mercredi 4 juin 2014 23:58
  • Bonjour,

    Mais j'aurais aimé le faire pas tout le temps parce ce que si le programme demande toujours les droits, il ne peut pas démarrer en même temps que Windows. J'ai testé.
    Dans ce cas il faut créer 2 applications :

    Une application MonApp qui contient votre application qui n'a pas besoin les droits administrateurs.
    Une application MonAppAvecDroitAdministrateur qui appelle au démarrage l'application MonApp mais avec les droits administrateur (en spécifiant l'option "<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />").

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 5 juin 2014 00:18
    Modérateur
  • Bonjour,

    je n'ai pas compris. Toujours est-il que mon code pour faire la restauration ne fonctionne pas. Donc, j'utilise la bonne vielle méthode manuelle. Là, il n'y a pas besoin de droits.

    Ce que je ne comprends pas, c'est qu'il n'y a pas de possibilité pour avoir les droits temporairement. Sous DOS il y a bien runas. Et puis, dans les propriétés d'un programme, on peut cocher la case "Exécuter en tant qu'administrateur".

    jeudi 5 juin 2014 09:55
  • Bonjour,

    Si vous souhaitez démarrer une application "à la runas", utilisez la méthode Process.Start() qui prend en paramètre un ProcessStartInfo. Dans cette classe vous pouvez spécifier le login et le mot de l'utilisateur sur lequel doit fonctionner l'application à lancer : http://msdn.microsoft.com/fr-fr/library/system.diagnostics.processstartinfo(v=vs.110).aspx

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 5 juin 2014 23:39
    Modérateur
  • Bonjour,

    l'ennui est que je ne connais pas le login et le mot de passe de l'utilisateur qui l'exécutera.

    En fait, avec <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />, on a juste la fenêtre qui demande à l'utilisateur de valider par OK pour démarrer en tant qu'administrateur ou d'annuler s'il ne veut pas. Le programme ne demande pas de taper le mot de passe.

    Je ne sais pas si ProcessStartInfo ProcessStartInfo fera cela. Je vais essayer pour voir l'exemple donné mais je ne vois pas comment pour l'encoder.

    Déjà, en tapant runas on me demande le mot de passe mais je ne peux rien taper. :(

    Merci pour votre aide.

    vendredi 6 juin 2014 00:11
  • Bon Super !

    J'ai fini par faire un fichier VBS et ça marche du tonnerre :

    Set objShell = CreateObject("Shell.Application")
    objShell.ShellExecute "C:\MicSoft\Alerte Nettoyage PC\Alerte Nettoyage PC.exe", "", "", "runas", 1

    Bon ce n'est pas tout, la création du point de restauration ne se fait pas quand j'enlève le InputBox.

    Ne marche pas :

    GetObject("winmgmts:\\.\root\default:Systemrestore").CreateRestorePoint "Sauvegarde du 6-6-2014", 0, 100

    Fonctionne :

    GetObject("winmgmts:\\.\root\default:Systemrestore").CreateRestorePoint InputBox("Entrer une description pour le point de restauration :","Create Restore Point"), 0, 100

    Moi je ne veux pas du InputBox car si la personne annule ça fait pas pro : Erreur générée. C'est pour cela que je voudrais mettre le nom moi-même.

    Quelqu'un a une idée ? Merci


    vendredi 6 juin 2014 01:00
  • Bon tout est à revoir pour la création du point.

    J'ai trouvé cela :

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa378847(v=vs.85).aspx

    Malheureusement, il y a plein de choses non déclarées et de plus, je n'ai jamais travaillé avec des class.

    Avast n'aime pas :

    GetObject("winmgmts:\\.\root\default:Systemrestore").CreateRestorePoint InputBox("Entrer une description pour le point de restauration :","Create Restore Point"), 0, 100

    Virus détecté. :( :/


    vendredi 6 juin 2014 01:10
  • Bonjour

    Je vous propose ce thread sur le même sujet et résolu:

    Create restore point programmatically

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    mardi 10 juin 2014 07:59
  • Bonjour,

    l'exemple donné ne doit pas être du VB 2008 Il y a plein de choses non déclaré malgré le Import mis. Le programme que j'ai téléchargé : WMICodeCreator ne m'a pas aidé non plus. :(

    dimanche 15 juin 2014 15:08
  • Bonjour,

    Je ne sais pas si ça peut aider, mais en reprenant votre code plus haut (qui vient de m'aider donc merci :p)

    je l'ai modifier de tel manière que ça fonctionne avec un bouton.

    Voici le code mais (désolé) c'est en VB 2010

       
     Private Function Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CreateSystemRestorePoint As Boolean
            Dim Oops As Boolean
            'Création de point de restauration
            On Error GoTo 0
            Dim CreationDuPoint As Object, Nom As String
    
            'Nom du point
            Nom = "Sauvegarde du " & Now.Day & " " & Now.Month & " " & Now.Year
    
            'Création du point
            CreationDuPoint = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
            Call CreationDuPoint.CreateRestorePoint(Nom, 0, 100)
            CreateSystemRestorePoint = True
    
            If ScriptEngine = "Oops" Then
    
                CreateSystemRestorePoint = False
            End If
        End Function

    En espérant que si tu n'as pas trouvé la réponse depuis cela puisse vous aider en retour.


    • Modifié Phil.E mercredi 23 juillet 2014 02:09
    mercredi 23 juillet 2014 02:08
  • Pour la partie erreur je me suis peut être trompé, à vérifier. Mais sinon ça fonctionne mon compte n'étant pas totalement activé (en attente d'activation) je ne peux pas poster une image pour vous le prouver désolé.

    • Modifié Phil.E mercredi 23 juillet 2014 02:17
    mercredi 23 juillet 2014 02:11
  • Bonjour

    votre code a marché une fois, puis plus rien.

    Aucune erreur générée même pour l'échec de la restauration. Je n'ai pas compris le "On Error Goto 0". Il va à quelle étiquette ?

    Moi je mets :

    On Error Goto Oops

    ....

    Oops:
        if Err.Description <>"" then
            Msgbox(Err.Description, MsgBoxStyle.Exclamation)
            Resume Next
        End If

    Au moins, là je sais qu'il y a eu une erreur et laquelle. Puis il retourne là d'où il est parti.



    mercredi 23 juillet 2014 03:08
  • Oups désolé oui c'est une erreur

    If ScriptEngine = "0" Then <= faut mettre le 0 et non oops

        Private Function Button34_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button34.Click
            Dim CreateSystemRestorePoint As Boolean
            Dim Oops As Boolean
            'Création de point de restauration
            On Error GoTo 0
            Dim CreationDuPoint As Object, Nom As String
    
            'Nom du point
            Nom = "Sauvegarde du " & Now.Day & " " & Now.Month & " " & Now.Year
    
            'Création du point
            CreationDuPoint = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
            Call CreationDuPoint.CreateRestorePoint(Nom, 0, 100)
            CreateSystemRestorePoint = True
            Label1.Text = "Opération réussi"
    
            If ScriptEngine = "0" Then
    
                CreateSystemRestorePoint = False
                Label1.Text = "Oops la sauvegarde a échouée"
            End If
        End Function

    mercredi 23 juillet 2014 14:03
  • Je viens de le tester plusieurs fois de suite sans fermer le programme et ça continue de me créer des points de restaurations. Ça ne bug pas de mon côté.

    J'ai rajouté un label pour dire si oui ou non le point de restauration se fait.

    mercredi 23 juillet 2014 14:06
  • Ou va le on error ? Parce que je ne vois pas pourquoi tester ScriptEngine qui n'est même pas à la valeur 0 mais "0". L'inconvénient, c'est qu'elle échoue sans expliquer pourquoi.

    mercredi 23 juillet 2014 14:10
  • Pour "Au moins, là je sais qu'il y a eu une erreur et laquelle. Puis il retourne là d'où il est parti."

    Je me rends compte que je ne t'ai pas répondu

    L'erreur vient du fait qu'il attend une valeur numérique "

    On Error GoTo valeur_numérique

    et non "oops"

    mercredi 23 juillet 2014 14:30
  • En enlevant les "" après le "if..." ça crée une erreur et par contre ça me dit que la sauvegarde à réussi (ce qui faux aucun point ne s'est créé à ce moment là).

    J'ai remis les "" cette fois l'opération va jusqu'au bout et un point ce crée.

    Je ne vois pas comment je peux tester la partie erreur avec les "" après le "if...".

    Et toi?



    • Modifié Phil.E mercredi 23 juillet 2014 15:39
    mercredi 23 juillet 2014 15:30
  • En reprenant le 1er code

        Private Function Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CreateSystemRestorePoint As Boolean
    
            'Création de point de restauration
            On Error GoTo 0
            Dim CreationDuPoint As Object, Nom As String
    
            'Nom du point
            Nom = "Sauvegarde du " & Now.Day & " " & Now.Month & " " & Now.Year
    
            'Création du point
            CreationDuPoint = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
            Call CreationDuPoint.CreateRestorePoint(Nom, 0, 100)
            CreateSystemRestorePoint = True
            Label1.Text = "Opération réussi"
    0:
            CreateSystemRestorePoint = False
            Label1.Text = "Oops la sauvegarde a échouée"
    
        End Function

    La sauvegarde ne se fait pas et j'ai mon message "oops la sauvegarde a échouée" et aucun point de sauvegarde est créé.

    Bon reste plus qu'à comprendre pourquoi ^^


    • Modifié Phil.E mercredi 23 juillet 2014 15:51
    mercredi 23 juillet 2014 15:49
  • Bon en espérant que cette fois ci soit la bonne

    Private Function Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim CreateSystemRestorePoint As Boolean 'Création de point de restauration Dim CreationDuPoint As Object, Nom As String On Error GoTo 0 'Nom du point Nom = "Sauvegarde du " & Now.Day & " " & Now.Month & " " & Now.Year 'Création du point CreationDuPoint = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore") Call CreationDuPoint.CreateRestorePoint(Nom, 0, 100) CreateSystemRestorePoint = True Label1.Text = "Opération réussi" 0: If CreateSystemRestorePoint = False Then Label1.Text = "Oops la sauvegarde a échouée" End If End Function

    Ma sauvegarde se fait et mon label m'affiche que mon point a été fait. Après vérification effectivement il se fait.

    Par contre je ne sais pas comment je peux tester pour faire échouer le point de restauration.


    • Modifié Phil.E mercredi 23 juillet 2014 20:03
    mercredi 23 juillet 2014 16:07
  • Je crois que cela irait mieux. D'ailleurs, la variable Oops que vous avez déclaré n'est pas utilisée.

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Création de point de restauration
            On Error GoTo Oops
            Dim CreationDuPoint As Object, Nom As String
    
            'Nom du point
            Nom = "Sauvegarde du " & Now.Day & " " & Now.Month & " " & Now.Year
    
            'Création du point
            CreationDuPoint = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
            Call CreationDuPoint.CreateRestorePoint(Nom, 0, 100)
            MsgBox("Le point de restauration a été créé.", MsgBoxStyle.Information)
    Oops:
            If Err.Description <> "" Then
                MsgBox("Le point de restauration n'a pas été créé." & vbNewLine & Err.Description, MsgBoxStyle.Critical)
            End If
        End Sub
    

    Bon avec ce code, la création du point de restauration se fait en 1 seconde. Lorsque je créé un point de restauration manuellement avec Windows, il m'est 30 secondes au moins.

    Avec mon code, on a l'explication du non fonctionnement. Toutefois, le point n'est pas créé et il n'affiche pas d'erreur.

            If CreationDuPoint.CreateRestorePoint(Nom, 0, 100) Then
                MsgBox("Le point de restauration a été créé.", MsgBoxStyle.Information)
            Else
                MsgBox("Le point de restauration n'a pas été créé.", MsgBoxStyle.Critical)
            End If
    

    Même avec ça, toujours pas d’erreur mais le pont n'existe pas.

    Je crois que je vais rester avec la bonne vielle méthode manuelle de Windows (plus sûre).

    mercredi 23 juillet 2014 23:16
  • Bonjour

    Regarde ma réponse juste au dessus, les points se font.

    C'est juste la partie erreur dont je ne suis pas sûr vu que ça fonctionne.

    jeudi 24 juillet 2014 16:05