Question Déployer un fichier REG sur serveur distant

Plus d'informations
il y a 16 ans 1 mois #1907 par Arnaud Petitjean
Hello,

Non, je confirme ce qu'a dit Robin. PowerShell ne sait pas interpreter les fichiers .REG, pas plus que VBScript il me semble.

Si tu veux continuer à utiliser les fichiers REG, ce que je comprends parfaitement, le mieux est à mon avis de lancer l'execution de Regedit suivi du fichier .Reg à partir de PowerShell.

Par contre pour le faire à distance, c'est encore une autre paire de manches ! C'est à dire que tu n'as pas beaucoup de solutions : soit tu utilises la V2 CTP de PowerShell (pas conseillé en prod), soit tu te fais une requête WMI pour exécuter Regedit à distance (un peu complexe mais possible), soit tu utilises un outil tiers pour executer des binaires à distance genre PSExec.

Mais bon, je ne prétend pas tout connaitre et il y a suremment d'autres solutions.

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 #1909 par PASCAULT
Slt,

C'est ce que je pense aussi... c'est pour cela que je demandais pourquoi ne pas utiliser regedit ?

Si tu cherches absolument à interprêter ton .reg en powershell, tu n'auras effectivement pas beaucoup plus d'intérêt que de le faire en vbs.
Mais powershell est quand même un peu plus souple; une petite base de ce qui pourrait être fait:

[code:1]$reg=Get-Content \".\tonfichier.reg\"
$reg|?{
if ($_ -match \"^\[\"«») #Si car [ --> recup de la cle de registre
{$pathkey=$_}
else
{if ($_ -match \"^\x22\"«») #Sinon si carac \" , recup de la val et de la donnee
{$val=$_.split(\"=\"«»)[0];$dat=$_.split(\"=\"«»)[1]
write-host \"Path= $pathkey Valeurs= $val Données= $dat\"}
}}
[/code:1]

Sinon, plutôt que de faire de la conversion .reg, peut-être pourrais-tu directement les extraire via powershell...

Tu peux essayer via cette méthose pour mettre la base de registre à distance:
thepowershellguy.com/blogs/posh/archive/...with-powershell.aspx


Ensuite, je ne connais pas vraiment d'autres solutions que ce que propose Arnaud pour le mettre à distance.
L'utlisation de regedit via psexec, rsh, telnet... me semble être le plus simple.

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

Plus d'informations
il y a 16 ans 1 mois #1911 par Laurent Dardenne
Je pense que le principal a été dit, j'ajouterai donc 2 bricoles.

Tout comme gremlinsy et Arnaud, le couple PSExec et Regedit est à mon avis la meilleure approche car les 2 se chargeront de la gestion des erreurs qui n'est pas une mince affaire dans ce contexte (pb réseau, pb droits accès, maintenance)
On doit également tenir compte en production des régles de conduite définies par l'entreprise, ce qu'on peut faire ou pas...
Arnaud écrit:

il y a suremment d'autres solutions.

Je pense qu'elles s'appuieront toutes, à peu de chose prés, sur les mêmes API.
On peut en revanche aborder le problème sous différents angles. Par exemple copier sur le serveur cible le fichier .reg dans un répertoire dédié qui est lui-même surveillé via un filewatcher etc, etc.

:P

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 1 mois #1918 par Christophe
Comme vous dites je suis passé par un regedit avec psexec avec .. du bon VBS :P

Vu que je me lance doucement dans le powershell j'aurais eu une bonne occasion de le faire si il savait interpréter les .reg!

Je vous joins mon bout de code VBS, ça peut toujours intéresser quelqu'un ... même si c'est d'un niveau débutant! Mais le principal c'est que ça fonctionne! B)

[code:1]
strDate = Date
strDate = Replace(strDate,\"/\",\"-\"«»)
Set obj_fso = CreateObject(\"Scripting.FileSystemObject\"«»)
Set obj_network = WScript.CreateObject(\"Wscript.Network\"«»)
Set obj_shell = Wscript.CreateObject(\"Wscript.shell\"«»)
Set liste_srv = obj_fso.OpenTextFile(\"liste_serveur.txt\",1)

chemLogs = \"Logs_\" & strDate & \".txt\"
If obj_fso.FileExists(chemLogs) = True Then
Set logFile = obj_fso.OpenTextFile(chemLogs,8)
Else
Set logFile = obj_fso.CreateTextFile(chemLogs)
End if

strUser = inputbox(\"Login de l'administrateur:«»(ex: NEOCORP\srvcdu)\",\"Information\"«»)
verif(strUser)
strPass = inputbox(\"Mot de passe de l'administrateur:\",\"Information\"«»)
verif(strPass)
mountPart = inputbox(\"Lettre de partition disponible pour monter le lecteur réseau:«»(en local, de type F/G/Y/...)\",\"Information\"«»)
verif(mountPart)
destPart = inputbox(\"Lettre de la partition système du système distant:«»(C/M/...)\",\"Information\"«»)
verif(destPart)
nomReg = inputbox(\"Quel est le nom du fichier REG?\",\"Information\"«»)
verif(nomReg)
Set monFichier = obj_fso.GetFile(\"DATA\\" & nomReg)

choix = MsgBox(\"Lancer le script?\", vbOKCancel + vbInformation, \"Confirmation\"«»)
verif(choix)

logFile.WriteLine(\"<
DEBUT DU SCRIPT
>\"«»)
logFile.WriteLine(\"Utilisateur -> \" & strUser)
logFile.WriteLine(\"Montage réseau lecteur sur -> \" & mountPart & \":\"«»)
logFile.WriteLine(\"Partition de destination -> \" & destPart & \":\"«»)

Do While liste_srv.AtEndOfStream = False
monServeur = liste_srv.ReadLine
wscript.echo (\"Connexion au serveur \" & monServeur)
logFile.WriteLine(vbCrLf & \"********** \" & Ucase(monServeur) & \" **********\"«»)
obj_network.MapNetworkDrive mountPart & \":\",\"\\\" & monServeur & \"\\" & destPart & \"$\", false, strUser, strPass
logFile.WriteLine(\"-> Montage du lecteur \" & mountPart & \":\"«»)
monFichier.Copy mountPart & \":\\"
obj_shell.run \"cmd /c psexec \\\" & monServeur & \" -u \" & strUser & \" -p \" & strPass & \" regedit /s \" & destPart & \":\\" & nomReg,0,true
logFile.WriteLine(\"=> Lancement du fichier \" & destPart & \":\\" & nomReg)
obj_fso.DeleteFile(mountPart & \":\\" & nomReg)
logFile.WriteLine(\"=> Suppression du fichier \" & mountPart & \":\\" & nomReg)
obj_network.RemoveNetworkDrive(mountPart & \":\"«»)
logFile.WriteLine(\"-> Démontage du lecteur \" & mountPart & \":\"«»)
Loop
logFile.WriteLine(\"<
FIN DU SCRIPT
>\"«»)
wscript.echo \"Mise à jour terminée avec succès\"

logFile.Close

Sub verif(ByVal Valeur)
If Len(Valeur) = 0 OR Valeur = vbCancel Then
wscript.echo \"Fin du script\"
wscript.quit
End if
End Sub[/code:1]

Enfin je vais regarder les bouts de code qui ont été publiées ici en powershell, ça pourrait être intéressant

Merci pour votre aide! ;)<br><br>Message édité par: Tayn, à: 11/03/08 17:53

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

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

Vu que je me lance doucement dans le powershell j'aurais eu une bonne occasion de le faire si il savait interpréter les .reg!

La question n'est pas à mon sens du domaine de l'interprétation du format de donnée puisque la manipulation de la registry dans PS se fait via un provider :

PS C:\Temp&gt; cd hkcu:
PS HKCU:\&gt; get-psprovider

Name Capabilities Drives
----



...
Registry ShouldProcess {HKLM, HKCU}
...

PowerShell sait gérer la registry mais pas de manière conventionnelle.
On peut donc s'y déplacer comme sur un File Système et y effectuer la plupart des opérations qu'un FS gére.
Sa seule restriction, et pour ton besoin elle est rédhibitoire, est qu'il ne supporte pas les cmdlet *content (voir la doc):

PS HKCU:\&gt; gcm -noun content

CommandType Name Definition


----
Cmdlet Add-Content Add-Content [-Path] &lt;String[]&gt; [-Value] &lt;Object[...
Cmdlet Clear-Content Clear-Content [-Path] &lt;String[]&gt; [-Filter &lt;Strin...
Cmdlet Get-Content Get-Content [-Path] &lt;String[]&gt; [-ReadCount &lt;Int6...
Cmdlet Set-Content Set-Content [-Path] &lt;String[]&gt; [-Value] &lt;Object[...

On ne peut donc pas y enregistrer des données à partir d'une source :

(extrait de la doc de get-content)
L'applet de commande Get-Content obtient le contenu de l'élément à l'emplacement spécifié par le chemin d'accès, par exemple le texte d'un fichier. Elle lit une ligne de contenu à la fois et retourne un objet pour chaque ligne.

Il reste possible de la manipuler par des créations/suppressions via les cmdlet de base d'un provider.

A mon avis ce choix est peut être du aux possibles écrasement involontaire de données, c'est peut aussi pour cette raison qu'on ne peut accéder à HKCR (HKey_Classes_Root), le coeur de la technologie COM. Si on crash la registry le système est bien mal en point, avec des fichiers c'est pas tout à fait le cas.

Ici ce n'est pas un problème technique mais un choix d'implémentation.
Enfin le mieux serait de poser la question à l'équipe de dev de PS de la raison de ce choix ;-)

A propos de la propriété Capabilities.

Tayn écrit:

Mais le principal c'est que ça fonctionne! B)

Tout à fait.
Et il ne faut pas oublier que PowerShell n'est autre qu'une implémentation logicielle répondant aux besoins des administrateurs système.

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 1 mois #1929 par Arnaud Petitjean
Bonjour,

Je ne vois pas vraiment en quoi le fait que les commandelettes *-content ne \&quot;fonctionnent\&quot; pas avec la registry est rédibitoire ?

Pour créer des clés ou des valeurs, il suffit de jouer avec les commandes *-item.

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.

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