Question
Base de registre lire et construire
- COTTIN
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 84
- Remerciements reçus 0
Je vous met dans le contexte
J'ai 400 machines qui ont des entrées DNS sur l'AD que j'aimerais supprimer.
J'ai fait un Script qui va lire et construire la bonne clé au bonne endroit.
[code:1]$a = get-itemproperty -path registry::\"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\"
$a.Route > cle.txt
$ligne = Get-Content cle.txt | Select-String -Pattern \"{\" > temp.txt
Get-Content temp.txt| %{ $_.Split('\"')[1];} > cleDNS.txt
$cle = Get-Content -path cleDNS.txt
$cleDNS = \"registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\"+$cle
set-itemproperty -path $cleDNS -name \"RegistrationEnabled\" -value 0[/code:1]
Maintenant ce que j'aimerais faire c'est ne plus passer par des fichier .txt mais de passer directement par des variables.
CAUSE : Je déploie le script sur l'AD en LOGIN. Et vue que je passe par des fichier texte je suppose qu'il n'arrive pas lire et construire la bonne clé.
Serait t'il possible de transcrire les donner ecrite dans le fichier texte comme variable.
Par exemple ( ça ne marche pas)
[code:1]$a = get-itemproperty -path registry::\"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\"
$a.Route
$ligne = Get-Content $a.Route | Select-String -Pattern \"{\"
Get-Content $ligne | %{ $_.Split('\"')[1];} > $cle_DNS
$cle = Get-Content -path $cle_DNS
$cleDNS = \"registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\"+$cle
set-itemproperty -path $cleDNS -name \"RegistrationEnabled\" -value 0[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
Une solution :
[code:1]$interfaces = get-itemproperty -path \"HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\" | Foreach-Object {$_.route -replace \"`\"\", \"\"}
$cleDNS = \"HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\"
foreach($interface in $interfaces){
Get-ItemProperty -path \"$cleDNS\$interface\" | Select-Object DhcpIPAddress
# set-itemproperty -path \"$cleDNS\$interface\" -name \"RegistrationEnabled\" -value 0
}[/code:1]
(Retirer le commentaire et la ligne en 'Get-ItemProperty', dans la boucle foreach : je l'ai fait pour le test, l'exemple).
Pour information :
[code:1]Get-Content $ligne | %{ $_.Split('\"')[1];} > $cle_DNS[/code:1]
' Get-Content ' sert à lire le contenu d'un fichier texte, par le contenu d'une variable
La méthode 'split' est effectivement une solution. J'ai préféré le 'Replace' dans mon exemple.
[code:1]
registry::\"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\"
[/code:1]
Peut s'écrire :
[code:1]
\"HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\"
[/code:1]
C'est plus simple.
En effet, le lecteur 'HKLM' sur le fournisseur registry existe déjà.
[code:1]
PS C:\> Get-PSProvider
Name Capabilities Drives
----
Alias ShouldProcess {Alias}
Environment ShouldProcess {Env}
FileSystem Filter, ShouldProcess, Credentials {C, D, E, F...}
Function ShouldProcess {Function}
Registry ShouldProcess, Transactions {HKLM, HKCU}
Variable ShouldProcess {Variable}
[/code:1]
Tu peux donc effectuer un :
[code:1]
Set-Location hklm:
[/code:1]
ou, plus simplement grace à l'alias de 'Set-Location'
[code:1]
cd hklm:
[/code:1]
@+
Matthew<br><br>Message édité par: Matthew BETTON, à: 14/02/13 20:21
Connexion ou Créer un compte pour participer à la conversation.
- COTTIN
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 84
- Remerciements reçus 0
Suite a l'ancien (oui ancien) script au lancement de la session celle ci beug. ( a cause du script)
Donc je suis passer par une autre manière.
[code:1]for ($i=1;$i -lt 394; $i++){ (Get-Content pc.txt -totalcount $i)[-1] > temp.txt
$name = Get-Content temp.txt
$cmd = \" sc \\$name start remoteregistry\"
CMD.exe /C $cmd
$distant=[microsoft.win32.registrykey]::openremotebasekey(\"LOCALMACHINE\",\"TESTCDS\"«»)
$val=$distant.opensubkey(\"SYSTEM\currentcontrolset\services\Tcpip\Linkage\"«»)
$dns = $val.getvalue(\"Route\"«»)
$dns = ForEach-Object {$dns -replace \"`\"\", \"\"}
$cleDNS = \"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\"+$dns
$cleDNS > temp2.txt
$distant=[microsoft.win32.registrykey]::openremotebasekey(\"LOCALMACHINE\",\"TESTCDS\"«»)
$val=$distant.opensubkey($cleDNS)
$val.setvalue(\"RegistrationEnabled\",0)
}[/code:1]
J'ai un problème quand je lance la commande il me retourne comme quoi
$val.setvalue(\"RegistrationEnabled\",0)
n'accepte pas les arguments
Connexion ou Créer un compte pour participer à la conversation.
- COTTIN
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 84
- Remerciements reçus 0
[code:1]$val.setvalue(\"RegistrationEnabled\",0,\"REG_DWORD\"«»)[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
tcottin écrit:
Bonjour,
Suite a l'ancien (oui ancien) script au lancement de la session celle ci beug. ( a cause du script)
Donc je suis passer par une autre manière.
[code:1]for ($i=1;$i -lt 394; $i++){ (Get-Content pc.txt -totalcount $i)[-1] > temp.txt
$name = Get-Content temp.txt
$cmd = \" sc \\$name start remoteregistry\"
CMD.exe /C $cmd
$distant=[microsoft.win32.registrykey]::openremotebasekey(\"LOCALMACHINE\",\"TESTCDS\"«»)
$val=$distant.opensubkey(\"SYSTEM\currentcontrolset\services\Tcpip\Linkage\"«»)
$dns = $val.getvalue(\"Route\"«»)
$dns = ForEach-Object {$dns -replace \"`\"\", \"\"}
$cleDNS = \"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\"+$dns
$cleDNS > temp2.txt
$distant=[microsoft.win32.registrykey]::openremotebasekey(\"LOCALMACHINE\",\"TESTCDS\"«»)
$val=$distant.opensubkey($cleDNS)
$val.setvalue(\"RegistrationEnabled\",0)
}[/code:1]
J'ai un problème quand je lance la commande il me retourne comme quoi
$val.setvalue(\"RegistrationEnabled\",0)
n'accepte pas les arguments
Le mieux serait que tu prennes le temps de lire les réponses que l'on te fait sur le Forum afin de mieux imprégner le contenu.
Je ne comprends pas ton utilisation imbriquée de boucle 'for' et de 'Get-Content', qui effectivement, peut fonctionner, mais me paraît \"lourde\" :
[code:1]
for ($i=1;$i -lt 394; $i++){ (Get-Content pc.txt -totalcount $i)[-1] > temp.txt
[/code:1]
Pourquoi faire simple quand on peut faire compliqué ?
Si le fichier texte contient le nom d'une machine par ligne, alors cela peut suffir :
[code:1]
Get-Content pc.txt | Foreach-Object{ \"Ici, effectuer le traitement pour chaque machine, la variable automatique $_ correspondant au nom de la machine en cours de traitement\" }
[/code:1]
Via cette commande :
[code:1]
$dns = ForEach-Object {$dns -replace \"`\"\", \"\"}
[/code:1]
Je comprends que tu cherches à récupérer une collection de valeurs ... Mais cela ne fonctionne pas comme ça.
Bref, admettons que tu récupères une collection de valeurs.
Tu ne peux donc pas t'en servir par la suite sans énumération, comme tu le fais ici :
[code:1]
$cleDNS = \"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\"+$dns
[/code:1]
Du coup, lorsque tu fais :
[code:1]
$val=$distant.opensubkey($cleDNS)
[/code:1]
Cela ne peut pas fonctionner et je suppose que $val (le résultat) doit être Null.
As tu pris le temps de regarder / lire / tester / comprendre la première solution que je t'ai proposé ?
Si tu ne comprends pas quelque chose dans cette solution, alors n'hésite pas à formuler ton interrogation ici, dans ce Forum
@ +
Matthew<br><br>Message édité par: Matthew BETTON, à: 15/02/13 17:06
Connexion ou Créer un compte pour participer à la conversation.
- COTTIN
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 84
- Remerciements reçus 0
[code:1]Get-Content pc.txt | Foreach-Object{ \"Ici, effectuer le traitement pour chaque machine, la variable automatique $_ correspondant au nom
de la machine en cours de traitement\" }[/code:1]
C'est largement mais largement mieux.
Quand je récup ma valeur j'ai fait le tester et ma chaine se monte très bien.
Après peu être que je le fait mal.
Mais le truc c'est que la valeur ci dessous change pour chaque machine.
Donc obligatoirement je doit construire la bonne chaine avant de l'envoyer.
[code:1]$cleDNS = \"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\"+$dns[/code:1]
Après effectivement le script ne fonctionne pas pour l'instant.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Base de registre lire et construire