Question Import/Export de registre

Plus d'informations
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 ! :cheer:

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.

Plus d'informations
il y a 16 ans 1 mois #6081 par Laurent Dardenne
Salut,
le \&quot;pb\&quot; 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.

Plus d'informations
il y a 16 ans 1 mois #6086 par Laurent Dardenne
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 \&quot;NoteProperty\&quot;«») -and
($_.TypeNameOfValue -eq \&quot;System.String[]\&quot;«») -and
($_.Value -Match \&quot;MaxUses=\&quot;«») }|
#Crée une entrée avec le nom du share courant
Foreach {$Shares.\&quot;$Current\&quot;=$_.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(\&quot;=\&quot;«»));$I++}
#Construit l'objet
$O=New-Object PSObject|
Add-Member NoteProperty \&quot;ShareName\&quot; $_.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 :lol:<br><br>Message édité par: Laurent Dardenne, à: 29/01/10 19:51

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 mois #6091 par Arnaud Petitjean
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

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.

Plus d'informations
il y a 16 ans 1 mois #6097 par Laurent Dardenne
Arnaud écrit:

Une autre façon de faire pourrait être :

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'octets :S

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.

Plus d'informations
il y a 16 ans 1 mois #6103 par Bourdon
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

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.052 secondes
Propulsé par Kunena