IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

VB.NET Discussion :

Récupération du nom de tous les utilisateurs [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut Récupération du nom de tous les utilisateurs
    Bonjour,
    J'essaye de faire une sauvegarde et je veux récupérer que certain sous dossiers (comme desktop, mes documents..) de chaque utilisateurs présents sur le pc.

    J'essaye avec le code suivant mais il me retourne l'erreur: "Could not find directory 'C:\Users\C\Desktop'."

    Mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      Dim NomDossier, DossierDestination, DossierSélectionné, NomDossier2 As String
        Dim Drive As String = SelectDrives.ComboBox1.SelectedItem  'Drive = la lettre du disque que l'on sélectionne dans la combobox
        Dim NomPC As String = Environment.MachineName  'variable d'environnement qui donne le nom du pc
        Dim Profil As Object
            Dim Users As String = "C:\Users\"
            For Each Profil In Users
                Dim NomProfil As String = Profil.ToString
                Dim Profildestination As String = (Drive + NomPC & "\Profils\" & NomProfil & "\")
                My.Computer.FileSystem.CreateDirectory(Drive + NomPC & "\Profils\" & NomProfil & "\")
                My.Computer.FileSystem.CopyDirectory(Users + NomProfil & "\Desktop", Profildestination)
            Next
    Merci de m'aider

  2. #2
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut Tester
    La manière la plus facile de le voir (pour le croire), tu ouvres un Explorer, tu copies ("C:\Users\C\Desktop") dans le bar d'adresse, et du clique sur entrée.

    Normalement, lui non plus ne trouvera pas le dossier.

  3. #3
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    C'est normal tu itère sur Users qui contient "c:/users"
    Ton à ton 1er tour de boucle la variable NomProfil vaut C

  4. #4
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Jabbal'H Voir le message
    C'est normal tu itère sur Users qui contient "c:/users"
    Ton à ton 1er tour de boucle la variable NomProfil vaut C
    Pour compléter jabbal :

    1er tour = c
    2ème tour = :
    3ème tour = \
    4ème tour = u
    5ème tour = s
    .......etc.......

    Tu itères (For .... Each) chaque caractère dans une chaine (users) et je doute que tu souhaites obtenir ce genre de résultat !

    A+

  5. #5
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut
    Merci Wallace1, enfin un gars bien qui prend la peine d'expliquer ses commentaires (...c'est rare et énervant).

    J'ai modifié mon code et ça donne ça:

    Code : 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
    Dim Profil As Object
            Dim Users As String = My.Application.GetEnvironmentVariable("USERPROFILE").Substring(0, My.Application.GetEnvironmentVariable("USERPROFILE").LastIndexOf("\"))
            For Each Profil In System.IO.Directory.GetDirectories(Users)
                Dim NomProfil As String = Path.GetFileName(Profil)
                Dim Profildestination As String = (Drive + NomPC & "\Profils\" & NomProfil & "\")
                Try
                    My.Computer.FileSystem.CreateDirectory(Drive + NomPC & "\Profils\" & NomProfil & "\Desktop\")
                    My.Computer.FileSystem.CopyDirectory(Users & "\" & NomProfil & "\Desktop", Profildestination)
                Catch erreur As UnauthorizedAccessException
                    If Directory.Exists(Users & "\" & NomProfil & "\Desktop") Then
     
                        MessageBox.Show("La Copie a échoué !" & erreur.GetBaseException.Message, "Erreur")
                    End If
                End Try
     
            Next
    Cela marche en partie, sauf que j'ai un message d'erreur, avec le "try catch" le message d'erreur est:
    Nom : Capture.PNG
Affichages : 255
Taille : 13,8 Ko

    Sans le "try catch": Nom : Capture4.PNG
Affichages : 237
Taille : 15,9 Ko
    Le détail de l'erreur indique ceci: Nouveau document texte (5).txt je sais pas si ça peut servir.

    Le profil "all users" sur mes pc "pro" n'apparait pas (dossier protégés), donc c'est pas gênant, je viens de rajouter "Catch erreur As Exception" sous le premier catch dans le code pour ne plus faire apparaitre l'erreur.

    Bref wallace1 je sait pas si ces erreurs vont te parler, en tout cas merci pour ton aide, la copie fonctionne très bien dans l'état actuel malgré ces erreurs.
    Ce sont peut être des erreurs que l'on ne peut éviter?
    (J'exécute tout en admin bien sur.)

  6. #6
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Plusieurs choses :

    - Ta variable : déclarée tout en haut ne sert à rien car elle est utilisée dans ton bloc "For.... Each" et elle est de type "String" !

    - Tu utilises cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim NomProfil As String = Path.GetFileName(Profil)
    mais ta variable "Profil" est un chemin de répertoires et non un chemin de fichier !!
    "GetFileName" veut dire "obtenir nom de fichier"
    Pour travailler avec les chemins de repertoires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim di as new directoryInfo (profil)
    'Retourner le nom du répertoire (dernier de l'arborescence)
    Msgbox (di.name)
    'Le repertoire parent 
    Msgbox (di.parent.name)

    - Je réitère dans les bonnes habitudes de programmation Vbnet on évite de concatèner des chaines de caractère avec le signe "+" mais avec "&" :
    Pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Drive + NomPC & "\Profils\" & NomProfil & "\"
    Bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Drive & NomPC & "\Profils\" & NomProfil & "\"
    ........etc.......

    Pour clarifier l'intérêt des exceptions (try ..... catch... finally) :

    Lorsqu une exception est levée tu es censé la gérer depuis une sorte de gestionnaire (bien souvent une classe développée par tes soins).
    Si tu veux éviter qu une exception soit levée alors c'est à toi d'anticiper le comportement dans ton appli.

  7. #7
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    Citation Envoyé par Jabbal'H Voir le message
    C'est normal tu itère sur Users qui contient "c:/users"
    Ton à ton 1er tour de boucle la variable NomProfil vaut C
    C'était pas clair ? Autant pour moi

    Comme le disais wallace1, un chaine de caractère n'est en fait qu'un tableau de caractères, par conséquent un faire un foreach sur un string équivaut à un faire un foreach sur un tableau de caractère

  8. #8
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut
    Merci encore Wallace1 et oui désolé Jabbal'H mais c'était pas très clair.
    Je sais pas si je peux continuer ici, je rencontre un autre problème, j'arrive à copier tous les dossiers voulu comme "mes image", "bureau", "Favoris" etc mais pas "mes documents" car il bute sur le dossier "ma musique" qui est en fait un "hardlink" et donc il me sort l'erreur: "-L'accès au chemin d'accès 'C:\Users\Administrateur\Documents\Ma musique' est refusé." et cela pour tous les profils et j'imagine que ce sera pareil pour "mes images" et "mes vidéos".
    j'ai beau chercher mais j'arrive pas à trouver comment lui faire continuer la copie même s'il rencontre l'erreur.
    J'ai vue qu'il y avait le "File.GetAttributes" avec "If (File.GetAttributes(Users & "\" & NomProfil & "\Documents\Ma Musique") And FileAttributes.ReparsePoint) = FileAttributes.ReparsePoint Then",
    mais j'arrive pas à l'utiliser.
    Je voudrai juste trouver le code qui dit que si le dossier est un dossier caché ou dossier protégé alors il les ignore.

    Voici mon bout de code sur "mes documents".

    Code : 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
    Dim Profil As String
            Dim Users As String = My.Application.GetEnvironmentVariable("USERPROFILE").Substring(0, My.Application.GetEnvironmentVariable("USERPROFILE").LastIndexOf("\"))
            For Each Profil In System.IO.Directory.GetDirectories(Users)
                Dim di As New DirectoryInfo(Profil)
                Dim NomProfil As String = di.Name
                Dim Profildestination As String = (Drive & NomPC & "\Profils\" & NomProfil & "\")
     
                If Directory.Exists(Users & "\" & NomProfil & "\Documents") Then
     
                    Try
                        My.Computer.FileSystem.CopyDirectory(Users & "\" & NomProfil & "\Documents\", Profildestination & "Documents\", True)
                    Catch erreur As Exception
                        My.Computer.FileSystem.WriteAllText(Drive & NomPC & "\Erreurs.txt", vbCrLf & "-" & erreur.Message & vbCrLf, True)
                    End Try
                End If
            Next
    Merci pour votre aide.

  9. #9
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonjour bylliboy,

    Plusieurs choses sur ton code :

    - On ne concatène pas des chaines de caractères avec le signe (+) mais avec l'esperluète (&)
    - Ta variable "Profil" ne contient aucune valeur mais tu appelles quand même la méthode ".ToString" ?????
    - Quand tu veux travailler avec des répertoires on utilise la classe "Directory" de l'espace de noms "System.IO".
    - Voilà qui devrait te permettre de raisonner un peu :

    Code : 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
     
    Imports System.Management
      Private Sub BrowsingUsersDirectory()
            'Déclaration variable environnement "C:\Users" ou "C:\Utilisateurs" (Préférer utiliser l'anglais !)
            Dim var_users As String = My.Application.GetEnvironmentVariable("USERPROFILE").Substring(0, My.Application.GetEnvironmentVariable("USERPROFILE").LastIndexOf("\"))
            For Each d As String In Directory.GetDirectories(var_users)
                Dim di As New DirectoryInfo(d)
                'On recherche dans la liste si le nom d'un répertoire de profile utilisateur existe en vue de déterminer correctement le chemin que l'on souhaite pointer (C:\Users\<------>\Desktop, C:\Users\<------>\Documents,...)
                If returnUsersAccount.Contains(di.Name) Then
                    If Directory.Exists(d & "\Desktop") Then
                        MsgBox("Desktop exists !")
                    End If
                    If Directory.Exists(d & "\Documents") Then
                        MsgBox("Documents exists !")
                    End If
                    If Directory.Exists(d & "\Pictures") Then
                        MsgBox("Pictures exists !")
                    End If
                End If
            Next
        End Sub
     
        Private Function GetUsersAccount() As List(Of String)
            'On utilise la classe "Win32_UserAccount" des objets WMI pour rechercher les noms d'utilisateurs du PC
            Dim oQuery As New SelectQuery("Win32_UserAccount")
            Dim mSearcher As New ManagementObjectSearcher(oQuery)
            Dim userList As New List(Of String)
            For Each envVar As ManagementObject In mSearcher.Get()
                userList.Add(envVar("Name"))
            Next
            Return userList
        End Function
    Cependant je maintiens qu'il faille lire les cours VBNET de Mr Lasserre : http://plasserre.developpez.com/cours/vb-net/

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2008, 10h32
  2. autorun programs pour tous les utilisateurs du systeme
    Par mariogarcia dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 14/11/2005, 23h33
  3. Eviter d'inviter tous les utilisateurs au groupe root
    Par ggnore dans le forum Administration système
    Réponses: 24
    Dernier message: 21/10/2004, 20h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo