Question
Import/Export de registre
- Bourdon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 16 ans 1 mois #6080
par Bourdon
Import/Export de registre a été créé par Bourdon
Coucou tout le monde !
Je suis nouveau ici et très content d'avoir trouvé votre communauté !
Je découvre le PS en stage actuellement et j'accroche vraiment bien même si pour le moment j'ai beaucoup de mal à l'appréhender ( j'ai pas trop le temps pour le moment aussi
).
Avec mon manque évident de compétences dans PS, j'ai beaucoup de mal à répondre à une problématique que ma posé mon maître de stage.
Cette problématique est celle ci :
L'entreprise possède un seul serveur de fichier. Tout les jours Synback Pro fait une copie des dossiers de ce serveur sur un Disque Dur Externe.
Le but étant que si le serveur de fichier crash, les dossiers soit très rapidement disponible en branchant le DD externe sur un autre serveur.
Cependant Synback Pro copie les droits des fichiers et dossiers mais pas leurs partages.
Je dois donc faire un script qui permet la remise en place rapide de ces partages.
Pour le moment mon script en allant dans la base de Reg copie les clés concernant le partage des dossiers dans un fichier .reg sur un autre serveur.
Le but étant de ré-importer ce .reg dans la base du serveur remplaçant.
Cependant, le problème vient du fait que la lettre logique du DD externe est différente de celle d'origine. Le script devrait donc pouvoir changer la lettre logique du Path.
Ex :
Serveur Fichier : Path=C:\Temp
Serveur remplaçant: Path=E:\Temp
C'est malheureusement ici que je suis bloqué...
Je vous donne le code que j'ai pour le moment pondu. Il est peu être entièrement faux et à revoir. Peu être que je n'ai rien compris à PS ( ca m'étonnerais qu'à moitié ^^ ). Si c'est le cas n'hésitez pas à me le dire. Ça ne pourra que m'aider
[code:1]$jour=get-date -uformat \"%m-%d-%Y\"
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$nom_save = [Microsoft.VisualBasic.Interaction]::InputBox(\"Entrer le nom de la sauvegarde\", \"Nom de la Sauvegarde\", \"$jour\"«»)
\"Le nom de la sauvegarde est : $nom_save\"
if ($nom_save -eq \"\"«»)
{
get-process powershell| stop-process
}
else
{
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$result = [Microsoft.VisualBasic.Interaction]::MsgBox( `
\"C'est bon ?\", 'YesNo,Question', \"ATTENTION !\"«»)
switch ($result) {
'Yes' { reg export \"hklm\system\ControlSet001\services\lanmanserver\shares\" \\Xp2\archive_save\$nom_save.reg}
'No' { get-process powershell| stop-process }
}
}
[/code:1]
Merci d'avance de vos conseils !
Message édité par: poeteuh, à: 29/01/10 15:31<br><br>Message édité par: Arnaud, à: 2/02/10 23:51
Je suis nouveau ici et très content d'avoir trouvé votre communauté !
Je découvre le PS en stage actuellement et j'accroche vraiment bien même si pour le moment j'ai beaucoup de mal à l'appréhender ( j'ai pas trop le temps pour le moment aussi
Avec mon manque évident de compétences dans PS, j'ai beaucoup de mal à répondre à une problématique que ma posé mon maître de stage.
Cette problématique est celle ci :
L'entreprise possède un seul serveur de fichier. Tout les jours Synback Pro fait une copie des dossiers de ce serveur sur un Disque Dur Externe.
Le but étant que si le serveur de fichier crash, les dossiers soit très rapidement disponible en branchant le DD externe sur un autre serveur.
Cependant Synback Pro copie les droits des fichiers et dossiers mais pas leurs partages.
Je dois donc faire un script qui permet la remise en place rapide de ces partages.
Pour le moment mon script en allant dans la base de Reg copie les clés concernant le partage des dossiers dans un fichier .reg sur un autre serveur.
Le but étant de ré-importer ce .reg dans la base du serveur remplaçant.
Cependant, le problème vient du fait que la lettre logique du DD externe est différente de celle d'origine. Le script devrait donc pouvoir changer la lettre logique du Path.
Ex :
Serveur Fichier : Path=C:\Temp
Serveur remplaçant: Path=E:\Temp
C'est malheureusement ici que je suis bloqué...
Je vous donne le code que j'ai pour le moment pondu. Il est peu être entièrement faux et à revoir. Peu être que je n'ai rien compris à PS ( ca m'étonnerais qu'à moitié ^^ ). Si c'est le cas n'hésitez pas à me le dire. Ça ne pourra que m'aider
[code:1]$jour=get-date -uformat \"%m-%d-%Y\"
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$nom_save = [Microsoft.VisualBasic.Interaction]::InputBox(\"Entrer le nom de la sauvegarde\", \"Nom de la Sauvegarde\", \"$jour\"«»)
\"Le nom de la sauvegarde est : $nom_save\"
if ($nom_save -eq \"\"«»)
{
get-process powershell| stop-process
}
else
{
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$result = [Microsoft.VisualBasic.Interaction]::MsgBox( `
\"C'est bon ?\", 'YesNo,Question', \"ATTENTION !\"«»)
switch ($result) {
'Yes' { reg export \"hklm\system\ControlSet001\services\lanmanserver\shares\" \\Xp2\archive_save\$nom_save.reg}
'No' { get-process powershell| stop-process }
}
}
[/code:1]
Merci d'avance de vos conseils !
Message édité par: poeteuh, à: 29/01/10 15:31<br><br>Message édité par: Arnaud, à: 2/02/10 23:51
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 1 mois #6081
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Recréer Partage Dossier sur DD externe
Salut,
le \"pb\" est dans l'usage d'un outil d'export d'information au format string, alors que PowerShell manipule des objets. Ainsi tu va devoir parser ton fichier.C'est une solution.
L'autre pb est que ton fichier contient un tableau de bytes et pas un tableau de chaînes de caractères.
Une piste
Mais qq d'autre peut avoir une meilleure solution, regarde avec WMI.
En passant LoadWithPartialName a une portée globale (le domain d'application de PowerShell).<br><br>Message édité par: Laurent Dardenne, à: 29/01/10 16:03
le \"pb\" est dans l'usage d'un outil d'export d'information au format string, alors que PowerShell manipule des objets. Ainsi tu va devoir parser ton fichier.C'est une solution.
L'autre pb est que ton fichier contient un tableau de bytes et pas un tableau de chaînes de caractères.
Une piste
Mais qq d'autre peut avoir une meilleure solution, regarde avec WMI.
En passant LoadWithPartialName a une portée globale (le domain d'application de PowerShell).<br><br>Message édité par: Laurent Dardenne, à: 29/01/10 16:03
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 1 mois #6086
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Recréer Partage Dossier sur DD externe
Une solution accèdant au provider Registry:, elle permet de créer des objets pouvant être exporté/Importé:
[code:1]
#mémorise le chemin courant
Push-Location
cd HKLM:\SYSTEM\ControlSet001\Services\lanmanserver\Shares
#Hashtable contenant tous les shares
$Shares=@{}
#Récupère la liste des membres de type propriété
(Get-ItemProperty .).PSObject.Properties|
#Multiples contrôles sur le membre
Where {$Current=$_.Name
($_.MemberType -eq \"NoteProperty\"«») -and
($_.TypeNameOfValue -eq \"System.String[]\"«») -and
($_.Value -Match \"MaxUses=\"«») }|
#Crée une entrée avec le nom du share courant
Foreach {$Shares.\"$Current\"=$_.Value}
#Construit des objets à partir des données du champ Value d'une
# entrée de la base de registre. Chaque entrée contient un tableau
# de chaînes au format Nom=Valeur
$Liste=$Shares.GetEnumerator()|
Foreach {
$I=0;$Name=New-Object String[] 6;$Value=New-Object String[] 6
#Affectations multiples, ici la méthode Split() renvoi 2 valeurs
$_.Value|% {$Name[$I],$Value[$I]=($_.Split(\"=\"«»));$I++}
#Construit l'objet
$O=New-Object PSObject|
Add-Member NoteProperty \"ShareName\" $_.Name
#Construit les membres de l'objet
0..5|%{$O|Add-Member NoteProperty $Name[$_] $Value[$_]}
#Emet l'objet crée dans le pipeline
$O
}
#Sérialise la liste d'objets
$Liste|Export-CliXml C:\Temp\MyShares.xml
#Restaure le dernier chemin mémorisé
Pop-Location
[/code:1]
On peut faire plus simple par exemple avec un export brut. L'avantage se situe à l'import, une seule propriété à modifier : celle contenant le nom du chemin. Le parsing s'en trouve simplifié.
Reste la seconde partie, l'import
<br><br>Message édité par: Laurent Dardenne, à: 29/01/10 19:51
[code:1]
#mémorise le chemin courant
Push-Location
cd HKLM:\SYSTEM\ControlSet001\Services\lanmanserver\Shares
#Hashtable contenant tous les shares
$Shares=@{}
#Récupère la liste des membres de type propriété
(Get-ItemProperty .).PSObject.Properties|
#Multiples contrôles sur le membre
Where {$Current=$_.Name
($_.MemberType -eq \"NoteProperty\"«») -and
($_.TypeNameOfValue -eq \"System.String[]\"«») -and
($_.Value -Match \"MaxUses=\"«») }|
#Crée une entrée avec le nom du share courant
Foreach {$Shares.\"$Current\"=$_.Value}
#Construit des objets à partir des données du champ Value d'une
# entrée de la base de registre. Chaque entrée contient un tableau
# de chaînes au format Nom=Valeur
$Liste=$Shares.GetEnumerator()|
Foreach {
$I=0;$Name=New-Object String[] 6;$Value=New-Object String[] 6
#Affectations multiples, ici la méthode Split() renvoi 2 valeurs
$_.Value|% {$Name[$I],$Value[$I]=($_.Split(\"=\"«»));$I++}
#Construit l'objet
$O=New-Object PSObject|
Add-Member NoteProperty \"ShareName\" $_.Name
#Construit les membres de l'objet
0..5|%{$O|Add-Member NoteProperty $Name[$_] $Value[$_]}
#Emet l'objet crée dans le pipeline
$O
}
#Sérialise la liste d'objets
$Liste|Export-CliXml C:\Temp\MyShares.xml
#Restaure le dernier chemin mémorisé
Pop-Location
[/code:1]
On peut faire plus simple par exemple avec un export brut. L'avantage se situe à l'import, une seule propriété à modifier : celle contenant le nom du chemin. Le parsing s'en trouve simplifié.
Reste la seconde partie, l'import
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 1 mois #6091
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:Recréer Partage Dossier sur DD externe
Salut !
Une autre façon de faire pourrait être :
1. d'appeler Regedit avec le commutateur qui va bien pour exporter les valeurs de registre au format texte
2. modifier les valeurs,
3. réimporter le fichier en rappellant RegEdit avec le commutateur qui va bien
Arnaud
Une autre façon de faire pourrait être :
1. d'appeler Regedit avec le commutateur qui va bien pour exporter les valeurs de registre au format texte
2. modifier les valeurs,
3. réimporter le fichier en rappellant RegEdit avec le commutateur qui va bien
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 1 mois #6097
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Recréer Partage Dossier sur DD externe
Arnaud écrit:

WMI me semble être une meilleure approche, car on crée les shares alors qu'avec l'import/export je pense qu'il faut rebooter le système pour prendre en considération la nouvelle configuration importée. Mais je n'ai pas encore testé ce point.
Effectivement je n'y avais pas pensé, avec regedit /e puis /s. Malheureusement le pb est le même, car le format d'export avec les clés de type REG_MULTI_SZ ne se fait pas en chaîne de caractères mais en un tableau d'octetsUne autre façon de faire pourrait être :
WMI me semble être une meilleure approche, car on crée les shares alors qu'avec l'import/export je pense qu'il faut rebooter le système pour prendre en considération la nouvelle configuration importée. Mais je n'ai pas encore testé ce point.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Bourdon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 16 ans 1 mois #6103
par Bourdon
Réponse de Bourdon sur le sujet Re:Recréer Partage Dossier sur DD externe
Bonjour,
Merci pour votre aide les gars
J'ai cherché aux 4 coins du net et finalement j'ai opté pour la réponse d'arnaud.
En gros une fois par semaine un script gardera en mémoire les valeurs qui vont bien et si jamais un jour le serv lache mon maitre de stage changera manuellement les lettres logiques du path avec regedit et l'importera sur la machine de remplacement.
Merci encore
A bientôt
Merci pour votre aide les gars
J'ai cherché aux 4 coins du net et finalement j'ai opté pour la réponse d'arnaud.
En gros une fois par semaine un script gardera en mémoire les valeurs qui vont bien et si jamais un jour le serv lache mon maitre de stage changera manuellement les lettres logiques du path avec regedit et l'importera sur la machine de remplacement.
Merci encore
A bientôt
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.050 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Import/Export de registre