Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1003 connectés 

  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Réseaux

  script powershell

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

script powershell

n°165438
GEEK82500
no lose, win or learn
Posté le 22-09-2019 à 10:07:49  profilanswer
 

Bonjour j'ai 2 scripts en ps1 qui fonctionnent séparément et que je voudrais réunir en un seul mais là ça ne fonctionne pas.
Le premier script modifie l'adresse ip et le second modifie le nom de la machine + redémarrage (voir ci-dessous)
En fait quand je les mets ensemble dans un fichier ps1 alors la première partie du script fonctionne mais ensuite j'ai un message : " Get-WmiObject n'est pas reconnu comme..."
Merci d'avance pour votre aide
 
SCRIPT 1 :
 
$defaultGw = "10.255.6.190"
$ipaddress = $(ipconfig | where {$_ -match 'IPv4.+\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' } | out-null; $Matches[1])
Write-host "  "
Write-host "Nom actuel du poste :              $env:COMPUTERNAME"
Write-host "  "
Write-host "Adresse actuelle du poste :        $ipaddress"
Write-host "  "
$nbst = read-host "nouveau numéro de poste dans la salle"
Write-host "  "
######################### base d'adresse nouvelle salle
$newip = "10.1.40.$nbst"
#########################
 
Remove-NetIPAddress –InterfaceAlias Ethernet0 –IPAddress $ipaddress –PrefixLength 8 –DefaultGateway $defaultGw
 
New-NetIPAddress –InterfaceAlias Ethernet0 –IPAddress $newip –PrefixLength 8 –DefaultGateway $defaultGw
 
 
 
 
 SCRIPT 2 :
 
$ipaddress = $(ipconfig | where {$_ -match 'IPv4.+\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' } | out-null; $Matches[1])
Write-host "  "
Write-host "Nom actuel du poste :              $env:COMPUTERNAME"
Write-host "  "
Write-host "Adresse actuelle du poste :        $ipaddress"
Write-host "  "
$newname = read-host "nouveau nom de la station"
 
function Set-ComputerName {
 
        param([string]$computerName="$newname" )
 
$computer = Get-WmiObject Win32_ComputerSystem
$computer.Rename($computerName)
$objServer = gwmi win32_operatingsystem
$objServer.psbase.Scope.Options.EnablePrivileges = $true
$objServer.reboot()
 
        }
 
Set-ComputerName


Message édité par GEEK82500 le 22-09-2019 à 10:09:46
mood
Publicité
Posté le 22-09-2019 à 10:07:49  profilanswer
 

n°165439
Ryo-Ohki
10th Rabbit
Posté le 22-09-2019 à 20:56:18  profilanswer
 

J'ai pas testé ton script et j'ai pas de machine sous la main pour le faire mais à vue de nez, y a rien de choquant (on peut discuter sur la mise en forme, le contrôle d'erreur, etc, mais le code de base devrait marcher...)
 
Bug de copier/coller ? Tu bosses avec le Powershell ISE et son surligneur/analyseur de syntaxe ? (idéal pour trapper un guillemet ou une accolade mal fermé pendant la copie, ce qui entrainerait derrière une erreur d'interprétation...)
 
Idéalement ça pourrait être utile de poster le script concaténé qui provoque l'erreur.


---------------
The Lapin, reloaded  |  "Anything can happen in Formula One, and it usually does." -- Murray Walker
n°165440
GEEK82500
no lose, win or learn
Posté le 22-09-2019 à 21:00:34  profilanswer
 

Ci-dessous la réponse que j'ai eu sur un autre site :
 
Bonjour,
 
Déjà, enchainer ces 2 opérations n'est pas une bonne idée.
 
- Changer l'adresse IP
 
- Renommer l'ordinateur en passant par les couches réseaux (que l'on est en train de réinitialiser), évidemment, c'est gênant.
 
Donc, mes conseils seraient:
 
- d'utiliser set-NetIPAddress, au lieu de supprimer puis de recréer l'interface réseau:
 
https://techcommunity.microsoft.com [...] m-p/289125
 
- Au minimum de mettre un délai raisonnable dans le script entre les 2 opérations.
 
- sinon d'inverser les 2 opérations en renommant l'ordinateur d'abord, puis changer l'adressage IP, puis redémarrer.
 
A bientôt,

n°165441
Ryo-Ohki
10th Rabbit
Posté le 22-09-2019 à 21:41:26  profilanswer
 

J'y ai pensé aussi mais je ne pense pas que ça vienne de là... Si la stack réseau est indispo et que ça impacte le Get-WmiObject pour une raison ou une autre ça ne provoquera pas une erreur de commande non reconnue, plutôt une exception plus franche.
 
Le Set-IPAddress ne fera pas ce que tu veux, il va rajouter des IPs sur la même carte sans supprimer l'ancienne adresse. Ton approche avec Remove-IPAddress puis New-IPAddress est la bonne même si on peut fiabiliser le script avec des contrôles de bonne exécution avant de passer à la suite.
 
Renommer, changer d'IP et rebooter ensuite pourquoi pas.
 
EDIT : au fait, si tes postes ont une passerelle par défaut il faut aussi enlever l'ancienne avec le CMDLet Remove-NetRoute. New-IPAddress possède un commutateur permettant de rajouter la nouvelle au besoin.
 
EDIT 2 : j'ai retrouvé une copie du script que j'ai écrit pour configurer la couche réseau d'un serveur en cours de Build avec MDT. J'avais ajouté cette petite fonction après l'appel New-IPAddress pour vérifier l'état de la carte réseau.
 
#region Net-WaitForAdapter
Function Net-WaitForAdapter
{
    param(
        [string]$AdapterName
    )
 
    $info = @{ "status" = $True ; "message" = "" ; "waited" = 0 }
 
    Try {
 
        $retryCount = 30
        $retryDelay = 2
        $retryCounter = 0
 
        $bolAdapterUp = $False
        $bolContinue = $True
 
        Do
        {
            If($retryCounter -le $retryCount) {
                $adapterProperties = Get-NetAdapter -Name $AdapterName -ErrorAction Stop
                $adapterStatus = $adapterProperties.Status
                If($adapterStatus -eq "Up" ){
                    $bolAdapterUp = $True
                    $bolContinue = $False
                }
                Else {
                    $retryCounter = $retryCounter + 1
                    Start-Sleep $retryDelay
                }
            }
            Else {
                $bolContinue = $False
            }
 
        } While($bolContinue)
 
        $info["waited"] = $retryCounter*$retryDelay
        If ($bolAdapterUp) { $info["message"] = "adapter $AdapterName successfully returned online" } Else { $info["message"] = "time-out expired while waiting for adapter $AdapterName to return online" ; $info["status"] = $False }
    }
 
    Catch {
        $info["message"] = "generic exception occured in Net-WaitForAdapter()"
        $info["status"] = $False
    }
 
    Return $info
}
#endregion Net-WaitForAdapter


Message édité par Ryo-Ohki le 22-09-2019 à 21:48:23

---------------
The Lapin, reloaded  |  "Anything can happen in Formula One, and it usually does." -- Murray Walker
n°165442
GEEK82500
no lose, win or learn
Posté le 22-09-2019 à 21:57:59  profilanswer
 

J'ai modifié en inversant les 2 actions et ça a fonctionné   (voir ci-dessous)
ouuuyyyeeeaaahhh!!!!
 
$defaultGw = "10.255.6.190"
$ipaddress = $(ipconfig | where {$_ -match 'IPv4.+\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' } | out-null; $Matches[1])
Write-host "  "
Write-host "Nom actuel du poste :              $env:COMPUTERNAME"
Write-host "  "
Write-host "Adresse actuelle du poste :        $ipaddress"
Write-host "  "
$newname = read-host "nouveau nom de la station"
Write-host "  "
$nbst = read-host "nouveau numéro de poste dans la salle"
######################### base d'adresse nouvelle salle
$newip = "10.1.40.$nbst"
#########################
 
function Set-ComputerName {
 
        param([string]$computerName="$newname" )
 
$computer = Get-WmiObject Win32_ComputerSystem
$computer.Rename($computerName)
$objServer = gwmi win32_operatingsystem
$objServer.psbase.Scope.Options.EnablePrivileges = $true
 
        }
 
Set-ComputerName
 
 
Remove-NetIPAddress –InterfaceAlias Ethernet0 –IPAddress $ipaddress –PrefixLength 8 –DefaultGateway $defaultGw
 
New-NetIPAddress –InterfaceAlias Ethernet0 –IPAddress $newip –PrefixLength 8 –DefaultGateway $defaultGw
 
Sleep 10
 
Restart-Computer
 

n°165443
Ryo-Ohki
10th Rabbit
Posté le 22-09-2019 à 22:11:43  profilanswer
 

[:ryo-ohki]


---------------
The Lapin, reloaded  |  "Anything can happen in Formula One, and it usually does." -- Murray Walker
n°165444
nebulios
Posté le 23-09-2019 à 10:08:10  profilanswer
 

C'est surtout qu'il est formaté de manière dégueulasse ton script. Et si tu veux renommer une machine, tu as un cmdlet pour ça :/

n°165475
GEEK82500
no lose, win or learn
Posté le 23-09-2019 à 18:47:35  profilanswer
 

désolé je débute et donc je récupère des bouts de scripts à droite à gauche. Je sais que je suis dans la section pro mais je suis référent numérique dans l'éducation nationale, ce qui signifie que je suis un prof qui se forme sur le terrain... donc parfois je fais des trucs pas très canonique...
après je suis preneur de conseils :
qu'est-ce que tu entends par formaté de manière dégueulasse?
peux tu me préciser le cmdlet permettant de faire ça?

n°165476
Ryo-Ohki
10th Rabbit
Posté le 23-09-2019 à 19:03:00  profilanswer
 

https://docs.microsoft.com/en-us/po [...] rshell-5.1
 
Pas dur :D
 
Après ça peut être parfois intéressant de contourner la facilité et de ne pas utiliser les CMDLets tout faits, mais d'aller creuser les méthodes natives dans les classes .NET. Ca peut être plus performant, et les CMDLets sont parfois aussi buggés (c'est rare mais ça arrive).
 
Pour le formatage il y a des règles de base :
 
- pas déclarer une fonction au milieu du code
- correctement initialiser ses variables
- identer correctement, pour facilier la lecture
- surtout surtout, faire du contrôle d'erreur à base de Try{} Catch{} et utilisation de l'argument ErrorAction... Rien de pire qu'un script qui produit des erreurs aléatoires parce qu'un traitement au milieu échoue de manière silencieuse...
 
Mais bon là c'est un cours qu'il te faut, comme tu dis débuter, un post vite fait sur HFR ne suffira pas :)


Message édité par Ryo-Ohki le 23-09-2019 à 19:09:12

---------------
The Lapin, reloaded  |  "Anything can happen in Formula One, and it usually does." -- Murray Walker
n°165477
nebulios
Posté le 23-09-2019 à 19:26:23  profilanswer
 

GEEK82500 a écrit :

désolé je débute et donc je récupère des bouts de scripts à droite à gauche. Je sais que je suis dans la section pro mais je suis référent numérique dans l'éducation nationale, ce qui signifie que je suis un prof qui se forme sur le terrain... donc parfois je fais des trucs pas très canonique...
après je suis preneur de conseils :
qu'est-ce que tu entends par formaté de manière dégueulasse?
peux tu me préciser le cmdlet permettant de faire ça?


Tu utilises le template qui se trouve là pour tous tes scripts: https://ss64.com/ps/syntax-template.html
 
Il va falloir googler pour comprendre tout ce qu'il fait mais c'est une base très solide. Regarde le système d'aide intégré, les paramètres, les validateset, les fonctions etc.
 
Et on utilise jamais Write-Host pour afficher des infos, mais les autres cmdlets write-*
 
Il y a des très bons bouquins en anglais pas très cher, achète-en un.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Réseaux

  script powershell

 

Sujets relatifs
Problème script Powershell pour ADPowershell Script enregistrement SQL
Question (bête) sur un un script PowerShellProblème effacement automatique script Powershell/Veeam
A supprimé.executer un script powershell par gpo
Script (PowerShell ?) et port knockingCopie répertoire via un script powershell sur plusieurs postes
script powershell et raccourci envoyer vers[PowerShell] Aide - erreur de mon script
Plus de sujets relatifs à : script powershell


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR