PowerShell – Contourner le système DynDns
I. Présentation
Il y a plus d'un an, Mickaël vous présentez un article qui expliquait comment contourner le système DynDns sous Linux. Comment ? En créant un script bash qui vous envoie votre adresse IP publique par e-mail à chaque fois que cette dernière change.
Désormais, je me colle à l'équivalent sous Windows avec l'utilisation de PowerShell. Le système DynDns étant devenu payant, cela peut être intéressant de recevoir l'IP de sa box par mail lorsque cette dernière change afin de pouvoir continuer à se connecter à distance sans difficulté.
II. Code et explications
Comme son nom l'indique, la première section définie les constantes, cela vous permet de "configurer" en quelques sortes le script en définissant des valeurs à la main pour certaines variables.
# Constantes $FileIP1 = "C:\CheckIp\IP1.txt" $FileIP2 = "C:\CheckIp\IP2.txt" $Pwd = "mot-de-passe" $Mail = "expediteur@mail" $To = "destinataire@mail" $SmtpServer = "serveur.smtp" $SmtpPort = "587"
Voici les informations nécessaires à la compréhension des différentes constantes :
- FileIP1 : Fichier texte à utiliser pour stocker l'adresse IP actuelle
- FileIP2 : Fichier texte à utiliser pour stocker l'adresse IP de l'exécution précédente
- Pwd : Mot de passe de l'adresse de messagerie expéditrice
- Mail : Adresse de messagerie de l'expéditeur
- To : Adresse de messagerie du destinataire
- SmtpServer : Serveur SMTP à utiliser pour envoyer les emails
- SmtpPort : Port sur lequel contacter le serveur SMTP indiqué précédemment
Passons désormais au second bloc. On regarde si le fichier définit dans la constante $FileIP1 existe. Si c'est le cas, cela signifie que le script a déjà été exécuté au moins une fois et que l'adresse IP a été récupérée au moins une fois également. On récupère le contenu du fichier $FileIP1 et on l'écrit/le stocke dans le second fichier définit part $FileIP2.
Si le fichier $FileIP1 n'existe pas, on fait rien, puisque cela signifie que l'adresse IP n'a jamais été récupérée.
if(Test-Path -Path $FileIP1){ $IP1 = Get-Content -Path $FileIP1 $IP1 > $FileIP2 }
A l'étape précédente, nous avons stocké le contenu du fichier $FileIP1 dans le fichier $FileIP2 afin de pouvoir comparer les deux contenus par la suite. Désormais, nous allons réécrire dans le fichier $FileIP1 l'adresse IP actuelle. Pour cela, on récupère le code de la page "http://checkip.dyndns.com" et on formate le résultat pour garder que l'adresse IP.
# Récupérer l'adresse IP publique actuelle et l'écrire dans le fichier $FileIP1 $ip=New-Object Net.Webclient $ip.downloadString("http://checkip.dyndns.com") -replace "[^\d\.]" > $FileIP1
Maintenant, nous allons tout simplement récupérer le contenu de chacun des fichiers qui contiennent les adresses IP et attribuer le contenu à une variable (une par fichier). Ceci dans le but de pouvoir comparer les adresses IP.
$ContentFileIP1 = Get-Content -Path $FileIP1 $ContentFileIP2 = Get-Content -Path $FileIP2
On compare les deux variables, autrement dit les deux adresses IP (l'actuelle et celle archivée (celle de l'exécution précédente)). Si elles sont différentes, ou plutôt "Si elles ne sont pas égale" dans le cas de l'écriture utilisée.
if ($ContentFileIP1 -ne $ContentFileIP2){ # Identifiant $password = ConvertTo-SecureString $Pwd -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential ($Mail , $password) # Envoi du mail Send-MailMessage -From $Mail -To $To -Subject "Changement IP publique" -Body "L'adresse IP de votre box a changée : $ContentFileIP1" -SmtpServer $SmtpServer -UseSsl -Port $SmtpPort -Credential $cred Write-Host "Message électronique envoyé" }
Les deux premières variables : password et cred, permettent respectivement de définir un mot de passe dans une chaîne sécurisée ainsi qu'un couple d'identifiant pour se connecter au serveur SMTP.
Ensuite, on s'appuie sur l'utilisation du commandlet "Send-MailMessage" pour envoyer par e-mail la nouvelle adresse IP, si elle a changée (donc le contenu de la variable $ContentFileIP1 est différent de celui de la variable $ContentFileIP2).
III. Code complet
Voici le script complet où vous devez uniquement adapter les constantes :
# Constantes $FileIP1 = "C:\CheckIp\IP1.txt" $FileIP2 = "C:\CheckIp\IP2.txt" $Pwd = "mot-de-passe" $Mail = "expediteur@mail" $To = "destinataire@mail" $SmtpServer = "serveur.smtp" $SmtpPort = "587" # On test si le fichier $FileIP1 existe # Si c'est le cas cela veut dire que l'adresse IP a déjà été récupérée une fois donc on peut l'écrire dans $FileIP2 if(Test-Path -Path $FileIP1){ $IP1 = Get-Content -Path $FileIP1 $IP1 > $FileIP2 } # Récupérer l'adresse IP publique actuelle et l'écrire dans le fichier $FileIP1 $ip=New-Object Net.Webclient $ip.downloadString("http://checkip.dyndns.com") -replace "[^\d\.]" > $FileIP1 # On stocke le contenu des fichiers en variable $ContentFileIP1 = Get-Content -Path $FileIP1 $ContentFileIP2 = Get-Content -Path $FileIP2 # On compare les deux adresses IP # Si c'est différent, on envoi un mail if ($ContentFileIP1 -ne $ContentFileIP2){ # Identifiant $password = ConvertTo-SecureString $Pwd -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential ($Mail , $password) # Envoi du mail Send-MailMessage -From $Mail -To $To -Subject "Changement IP publique" -Body "L'adresse IP de votre box a changée : $ContentFileIP1" -SmtpServer $SmtpServer -UseSsl -Port $SmtpPort -Credential $cred Write-Host "Message électronique envoyé" }
Bonjour,
C’est un super script mais j’ai un souci avec la commande d’envoi de mail. Il y a un souci avec le paramètre -Port (impossible de trouver un paramètre correspondant au nom » Port ») alors que je pense avoir correctement renseigner les variables en début de script (en l’occurence 465 pour GMAIL.
Auriez-vous une solution ?
Merci pour votre aide.
Bonjour,
Avez-vous bien indiquer un tiret au niveau du paramètre « -Port », car je viens d’essayer à l’instant et ce paramètre est bien valide. Sinon, testez directement avec la valeur dans la commande sans passer par la variable dans un premier temps.
Si le problème persiste, je vous invite à poster votre problème dans le forum qui est plus adapté 🙂
Florian
Merci pour votre retour. J’ai essayé de ne pas utiliser la variable mais cela ne fonctionne toujours pas.
Je viens de poster dans le forum avec un peu plus de détail.
Frédérick.