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

Scripts/Batch Discussion :

Sauvegarde de profils à distance (sur LAN) [Non suivi]


Sujet :

Scripts/Batch

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut Sauvegarde de profils à distance (sur LAN)
    Bonjour à vous,

    Je me permets de faire un post car je ne m'en sors plus avec mon idée de faire un script de sauvegarde de profiles à distance, je pensais que ce ne serait pas compliqué mais je me suis trompé.
    "J'administre" actuellement 150 workstations sous XP, chaque utilisateur (à peu près 150 aussi) se connecte sur SA machine avec son nom d'utilisateur (de type UTILXXXX (par exemple "UTIL0001")). Le problème survient lorsque l'utilisateur change de machine, tout son profil doit être refait.
    L'idée était donc de créer un script Powershell qui me permette de sauvegarder à distance (via mon poste) les répertoires importants de chaque profil sur un serveur.
    Je pars donc sur 2 fichiers texte, l'un contient le nom des machines sur chaque ligne (nom machine de type MACH-XXXX), l'autre contient le nom des utilisateurs sur chaque ligne.
    Dans un premier temps, le script doit
    - prendre le premier nom de machines du fichier texte
    - lister les logins dans le "C:\Documents and Settings" (Get-ChildItem) et redirection dans un 3eme fichier texte pour comparaison avec le fichier texte de login et épuration des logins non identique dans le 3eme fichier
    Dans un deuxième temps,
    - Créer une concaténation avec le nom PC+"C:\Documents and Settings"+Login
    - Sauvegarder sur le serveur distant, dans un répertoire portant le nom du login, les répertoires: Favoris,Bureau,\Application Data\ICAClient,\Application Data\Microsoft\Signatures,\Application Data\Microsoft\Modèles

    J'arrive à mettre en place certains bribes de code comme lister le contenu d'un répertoire et l'envoyer dans un fichier texte ou la copie mais pas vraiment le reste...
    Si vous pouviez m'aider ce serait très sympa.

    Merci.

  2. #2
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Salut,

    Le mieux c'est quand même d'avoir des profils itinérants.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    Oui je sais bien mais la politique "maison" est comme ca et je dois faire avec

  4. #4
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Mais ça va être une catastrophe et je ne parle même pas de la bande passante.
    En tout cas pour powershell, je peux rien faire pour toi, désolé.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par 41jeanseb
    Oui je sais bien mais la politique "maison" est comme ca et je dois faire avec
    C'est intéressant ! On peut voir cette opération comme un backup

    Pour la comparaison de login, tu peux déjà regarder ce post.
    Sous quelle version de PowerShell es-tu ? quel OS pour les postes ? Les postes disposent-ils de PS (si v2).
    As-tu procédé manuellement pour vérifier si cela est bien automatisable ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    C'est surtout que nous changeons les PCs régulièrement ces temps ci et ca commence à être très chiant de se palucher les profils

    Sinon, merci beaucoup pour le lien et la version de PowerShell est la 1.0, les postes sont tous en XP SP3 et n'ont pas PowerShell, le but étant de le faire à distance.
    Les quelques commandes de base que j'ai exécuté à distance ont fonctionné.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    Bonjour,

    J'ai "avancé" dans mon script mais je bloque sur l'exploitation du contenu du GCI, en effet, j'aimerais filtrer le contenu des utilisateurs qu'il renvoie (pour faire plus simple j'aimerais enlever à chaque fois, s'ils y sont, les utilisateurs : admin, ad.sys) et donc avoir un fichier "$name.txt" nettoyé de ces loggins mais je ne trouve pas comment intervenir sur le GCI
    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
    #-------------------------------------------------------------------------
    # Déclaration des fichiers texte et leurs emplacements
    $NomUtilisaUnique = "c:\Txt-Listes\Liste_user.txt"
    $NomUtilisaDetail = "c:\Txt-Listes\Liste_user_detail.txt"
    $NomPCUnique = "c:\Txt-Listes\Liste_WKST.txt"
    $NomPCDetail = "c:\Txt-Listes\Liste_WKST_detail.txt"
    
    #-------------------------------------------------------------------------
    # Début boucle de recherche de ligne par ligne
    $rech= get-content $NomPCUnique
    foreach ($name in $rech) 
    {
     # Recherche et transmission dans un fichier texte, unique et portant le nom  de la machine, 
     # des loggins utilisateurs se trouvant dans Documents and Settings des PC
     gci -Name "\\$name\c$\Documents and Settings" > "c:\Txt-Listes\Traitement\$name.txt"
    } 
    Si vous aviez une piste, je suis preneur.

    Merci

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 41jeanseb
    J'ai "avancé" dans mon script
    Le travail donne tjr ses fruits
    Citation Envoyé par 41jeanseb
    Si vous aviez une piste, je suis preneur.
    En un mot : Where-Object
    Et en plusieurs, voir ce tutoriel L'usage du pipeline sous PowerShell.

    J'aurais d'autres remarques sur la forme, mais pour le moment ce n'est pas le plus important.
    Par contre les WKST recensées dans ton fichier peuvent ne pas être online lors de ton traitement, il te faudra donc gérer ces cas là.
    Pour l'instant tu peux mettre ça dans ta todo list...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    Bonjour,

    Merci pour les infos et le lien.
    Maintenant, je suis bloqué au niveau de mon test d'existence (ou non) du répertoire cible, celui du répertoire source fonctionne et je ne vois pas trop ce qui peut le gêner (environ les 8 dernières lignes).

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    # Déclaration des fichiers texte et leurs emplacements
    $NomUtilisaUnique 	= "c:\Txt-Listes\Liste_user.txt"
    $NomUtilisaDetail 	= "c:\Txt-Listes\Liste_user_detail.txt"
    $NomPCUnique 		= "c:\Txt-Listes\Liste_WKST.txt"
    $NomPCDetail 		= "c:\Txt-Listes\Liste_WKST_detail.txt"
    $TraitUser 		= "c:\Traitement\traitement.txt"
    $DossSauv 		= "c:\Txt-Listes\doss_a_sauv.txt"
    
    #----------------------------------------------------------------------------------------------------------
    
    # Déclaration des variables.
    $var_PC 	= get-content $NomPCUnique 	# On récupère le contenu de ce fichier dans la variable $var_PC
    $var_User 	= get-content $TraitUser	# On récupère le contenu de ce fichier dans la variable $var_User
    $var_rep	= get-content $DossSauv		# On récupère le contenu de ce fichier dans la variable $var_rep
    
    # Début boucle de recherche de ligne par ligne dans le fichier se rapportant à $NomPCUnique.
    foreach ($ligne in $var_PC) 
    {
     # Recherche et transmission dans un fichier texte, unique et portant le nom de la machine, 
     # des loggins utilisateurs se trouvant dans Documents and Settings des PC + Purge des noms commencant par "adm", "form" et "All Users".
     gci -Name "\\$ligne\c$\Documents and Settings" |
     Where-Object {$_ -notlike "adm*"} |
     Where-Object {$_ -notlike "FORM*"} |
     Where-Object {$_ -notlike "ex*"} |
     Where-Object {$_ -ne "All Users"} > $TraitUser
     
     	# Traitement des utilisateurs recus dans le fichier "traitement.txt".
     	foreach ($name in $var_User)
    	{
    		# Vérification de la "non-existence" du répertoire portant le nom de l'utilisateur par un if.
    		$TestDir = "c:\Profils_sauvegardes\$name"
    		$DirExists = Test-Path $TestDir
    		if ($DirExists -eq $False)
    		{
    			# Création du répertoire portant le nom de l'utilisateur.
    			new-item -path "c:\Profils_sauvegardes" -name $name -type directory
     		}
    		# Traitement des répertoires à sauvegarder recus dans le fichier "doss_a_sauv.txt".
    		foreach ($rep in $var_rep)
    		{
    			# Vérification de l'"existence" des répertoires à sauvegarder chez l'utilisateur par un if.
    			$TestRepOrig = "\\$ligne\C$\Documents and Settings\$name\$rep"
    			$RepExistsOrig = Test-Path $TestRepOrig
    			$TestRepDest = "c:\Profils_sauvegardes\$name\$rep"
    			$RepExistsDest = Test-Path $TestRepDest
    			if ($RepExistsOrig -eq $True -and $RepExistsDest -eq $False)
    			{
    				# Copie des répertoires.
    				copy-item $TestRepOrig -destination "c:\Profils_sauvegardes\$name\" -recurse
     			}
     		}
    	} 
    }
    Si vous avez une idée je suis preneur

    Merci beaucoup

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 41jeanseb
    Si vous avez une idée je suis preneur
    Une petite refonte pour faciliter la relecture notamment par le nommage des variables :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    $PathTxt-Listes="c:\Txt-Listes"
     
    # Déclaration des fichiers texte et leurs emplacements
    $NomUtilisaUnique = "$PathTxt-Listes\Liste_user.txt"
    $NomUtilisaDetail = "$PathTxt-Listes\Liste_user_detail.txt"
    $NomPCUnique = "$PathTxt-Listes\Liste_WKST.txt"
    $NomPCDetail = "$PathTxt-Listes\Liste_WKST_detail.txt"
    $DossierASauvegarder = "$PathTxt-Listes\doss_a_sauv.txt"
    $TraitUser = "c:\Traitement\traitement.txt"
     
    #Construction des listes à partir des fichiers respectif
      # Tous les PC recensés dans le fichier $NomPCUnique 
    $ListePCs   = get-content $NomPCUnique
      # Tous les utilsateurs recensés dans le fichier $TraitUser
    $ListeUsers = get-content $TraitUser
      # Tous les utilisateurs recensés dans le fichier $TraitUser    
    $ListeRepertoires  = get-content $DossierASauvegarder
    $DestinationParent = "c:\Profils_sauvegardes"
     
    foreach ($NomPC in $ListePCs) 
    {
      Write-Debug "Traite le pc $NomPC" 
      # Recherche et transmission dans un fichier texte, unique et portant le nom de la machine, 
      # des loggins utilisateurs se trouvant dans Documents and Settings des PC 
      gci -Name "\\$NomPC\c$\Documents and Settings" |
        #Filtre les noms d'utilisateurs commencant par "adm", etc.
       Where-Object {
        ($_ -notlike "adm*") -and
        ($_ -ne "All Users") -and 
        ($_ -notlike "ex*") -and
        ($_ -notlike "FORM*")
       } > $TraitUser
     
      foreach ($UserName in $ListeUsers )
     {
       #Le répertoire l'utilisateur existe-til sur la destination ?
       $Destination = "$DestinationParent\$UserName"
       Write-Debug "Destination : $Destination"
      if ((Test-Path $Destination) -eq $False)
      {  # Création du répertoire portant le nom de l'utilisateur.
       new-item -path $DestinationParent -name $UserName -type directory
       }
       # Traitement des répertoires à sauvegarder
      foreach ($RepertoireCourant in $ListeRepertoires)
      {
        # Vérification de l'existence des répertoires de l'utilisateur  
       $Source = "\\$NomPC\C$\Documents and Settings\$UserName\$RepertoireCourant"
       if (Test-Path $Source)
       {
         Write-Debug "Source: $Source"
            if ((Test-Path "$Destination\$RepertoireCourant" )-eq $False)
         {
          Write-Debug "Copie Source vers Destination"
               # Copie de l'intégralité du répertoire  
          copy-item $Source -destination $Destination  -recurse
          }
          }
       } #foreach Repertoires
     } #foreach Users 
    } #foreach PCs
    Dans ce genre de traitement utilise Write-Debug pour tracer les étapes en cas de pb.
    A priori je ne vois pas de pb dans le test, le seul pb est dans la construction de la liste $ListeUsers qui ne correspond pas à ceux que tu filtres .

    Ensuite, reste à savoir ce que tu comptes faire si $Source n'existe pas...

    Je ne souhaite pas compliquer les choses mais en cas ce crash dans ton traitement, la reprise sera malaisé.
    Et il n'y a pas de compte rendu d'opérations.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    Merci beaucoup
    Je regarde tout ca !

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    Merci ! C'est très propre, très class !
    En parallèle, j'ai développé (...nan, je blague), j'ai récupéré une fonction de ping qui me permet de tester au début la présence (ou non) des PCs que j'ai listé dans mon fichier et d'en alimenter un deuxième avec les PCs "actifs":
    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
    function Ping-Address {
    	PROCESS {
    		$ping = $false
    		$results = Get-WmiObject -query `
    		"SELECT * FROM Win32_PingStatus WHERE Address = '$_'"
     		foreach ($result in $results) {
    			if ($results.StatusCode -eq 0) {
    			$ping = $true
    			}
    		}
    		if ($ping -eq $true) {
     		Write-Output $_
     		}
     	}
     } 
    
    Get-Content $NomPCUnique | Ping-Address > $NomPCUniqueTemp
    La, je me dis que ce serait effectivement bien d'avoir un petit fichier de rapport sur tout ce qu'a fait mon script (ou pas fait)
    Je regarde ca

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 41jeanseb
    La, je me dis que ce serait effectivement bien d'avoir un petit fichier de rapport sur tout ce qu'a fait mon script (ou pas fait)
    Pour faciliter son interrogation, c'est son objectif, tu dois déjà réfléchir à sa structure. Dans un premier temps faire simple.
    Ensuite l'ajout d'une gestion d'erreur pourra t'aider.

    Pour WMI, la boucle sur $results n'est pas nécessaire, car on reçoit un seul objet.
    Enfin tu peux contrôler le prérequis, induit par l'usage de WMI, avec cette fonction.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    Bonjour,

    En exécutant mon script sur une dizaine de PC et en redirigeant en parallèle la liste des utilisateurs dans un fichier texte, je m'aperçois que tous les utilisateurs ne sont pas copiés et très loin de la d'ailleurs (il doit y avoir 40 utilisateurs recensés et seulement 5 sont copiés..) ... c'est pas bon mon affaire

  15. #15
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Vérifie déjà le comportement du filtre sur les noms d'utilisateurs.
    Tous les utilisateurs sont-ils "listés" par le script, et pas seulement ceux présent dans le log ?
    As-tu tenu compte de ma remarque ?
    reste à savoir ce que tu comptes faire si $Source n'existe pas...

    Ensuite utilise le paramètre -Whatif sur les 2 cmdlets cela te permet de lancer le script sans que le traitement soit déclenché.
    Tu peux ajouter à ton script un paramètre de type Switch nommé $Whatif et le propager ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     copy-item ... -whatif:$Whatif
    Citation Envoyé par 41jeanseb
    c'est pas bon mon affaire
    C'est peut être préférable que cela commence comme ça, cela incite à la prudence, tu feras les comptes à la fin
    Cela fait + de vingt ans que j'automatise des tâches, un script doit faire ce qu'on lui demande, mais aussi nous indiquer pourquoi il ne peut pas le faire. C'est ainsi qu'on devient efficace : Qui produit, dans de bonnes conditions et sans autre aide, l'effet attendu.

Discussions similaires

  1. [XP Pro]Problème avec plusieurs profils utilisateurs sur PC
    Par marsup54 dans le forum Windows XP
    Réponses: 8
    Dernier message: 27/04/2005, 09h32
  2. sauvegarder un fichier Access sur un réseau
    Par ginger dans le forum Access
    Réponses: 9
    Dernier message: 08/11/2004, 15h20
  3. Pb d'accès à distance sur Postgre pour windows
    Par Guitch dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 28/09/2004, 19h13
  4. Réponses: 2
    Dernier message: 14/05/2004, 12h55
  5. Réponses: 6
    Dernier message: 26/03/2004, 16h31

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