Bonjour,

Je souhaite apprendre à scripter en Powershell.
J'ai fait un premier script powershell pour checker la date d'expiration des certificats sur des serveurs en particulier. Je précise que je n'ai aucune formation de programmeur. Mon script fonctionne mais on peut certainement l'améliorer ainsi que le mettre aux "normes" utilisées par les programmeurs en général. Je suis tout ouïe concernant vos suggestions d'améliorations. En souhaitant également que ça puisse servir à d'autres ensuite.

Etapes du script :

1 - Définir en jour la période au cours de laquelle des certificats arriveront à expiration
2 - Définir le chemin des fichiers temporaires et des logs du script
3 - Extraire les noms de machines d'une OU dans un *.txt
4 - Tester la présence des machines sur le réseau
5 - Pour celles qui ping extraire les informations concernant les certificats qui expireront d'ici la période définies en 1.
6 - Envoi d'un mail avec ces informations pour chaque machine. Si pas de certificats arrivant à expiration sur une de ces machines, envoi d'un mail pour cette machine indiquant qu'aucun certificat n'arrivera à expiration au cours de la période définie en 1

Les sources que j'ai utilisées sont entre autre :

http://blogs.technet.com/b/heyscript...tificates.aspx
http://powershell-scripting.com/

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# Nombre de jours restant avant expiration
$threshold = 365

# Chemin des fichiers
$chemin = "C:\TEMP\Scan_Cert"


Start-Transcript $chemin\Check_Certificats.log

##################################################################
# Suppression des fichiers prealablement utilises s'ils existent #
##################################################################

if (test-path $chemin\servers.txt)
{
Remove-Item $chemin\servers.txt
}
if (test-path $chemin\cert_exp.txt)
{
Remove-Item $chemin\cert_exp.txt
}

##############################################################################
# Recherche des serveurs a scanner dans l'OU XX - Resultats dans servers.txt #
##############################################################################

$searcher=new-object System.DirectoryServices.DirectorySearcher([adsi]'LDAP://ou=XX,ou=servers,dc=domain,dc=fr','objectCategory=computer')
$searcher.FindAll()|%{$_.Properties.name}|Out-File $chemin\servers.txt

###########################################
# Pour chaque serveur dans servers.txt... #
###########################################

foreach($Name in (get-content $chemin\servers.txt))
{
################################
# Si le serveur repond au ping #
################################

if (test-connection -computername $name -count 1 -Quiet)
{
################################
#  Extraction des certificats  #
################################

# Calcul de la date supposee d'expiration
$deadline = (Get-Date).AddDays($threshold)

# Connexion au magasin du serveur
$store=new-object System.Security.Cryptography.X509Certificates.X509Store("\\$Name\my","LocalMachine")

# Ouverture du magasin en lectrure seule
$store.open("ReadOnly")

# Extraction des certificats expirant avant la DeadLine - Redirection des résultats dans Cert_exp.txt
$store.certificates | % {
If ($_.NotAfter -lt $deadline) {
$_ | Select Issuer, Subject, NotAfter, @{Label="ExpiresIn"; Expression={($_.NotAfter - (Get-Date)).Days}}}

}>$chemin\Cert_exp.txt

# Recuperation de la taille du fichier Cert_exp.txt
$TailleFichier = Get-ChildItem $chemin\cert_exp.txt;

# Test de la taille du fichier - Si O octet ==> envoi d'un mail "Pas de certificat arrivant a expiration d'ici xx mois"
if ($TailleFichier.length -eq 0)

{             
###############################################################
#        ENVOI DU MAIL : AUCUN CERTIFICAT A EXPIRATION        #
###############################################################


# Serveur SMTP
$serveur = "smtp.domain.fr"

# Expediteur
$expediteur = "name_exp@domain.fr"

# Destinataire
$destinataire = "name_dest@domain.fr"

# Objet
$objet = "$Name - Pas de certificat arrivant à expiration dans les $threshold jours à venir"

# Corps du message
$texte = "Aucun certificat arrivant à expiration d'ici $threshold jours"

# Creation du message
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte

# Connection au serveur SMTP
$client = new-object System.Net.Mail.SmtpClient $serveur

# Authentification au serveur SMTP lorsqu'elle est requise
$client.Credentials = New-Object System.Net.NetworkCredential("name_exp@domain.fr", "user");

# Envoi du mail
$client.Send($message)
}

# Si cert_exp.txt > O octet ==> envoi d'un mail "Certificat(s) arrivant a expiration d'ici xx mois"

else{
####################################################################
#        ENVOI DU MAIL : X CERTIFICAT ARRIVANT A EXPIRATION        #
####################################################################

# Serveur SMTP
$serveur = "smtp.domain.fr"

# Expediteur
$expediteur = "name_exp@domain.fr"

# Destinataire
$destinataire = "name_dest@domain.fr"

# Objet
$objet = "$Name - Expiration des certificats dans les $threshold jours à venir"

# Corps du message
$texte = [string]::join([environment]::NewLine, (get-content "$chemin\Cert_exp.txt"))

# Creation du message
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte

# Connection au serveur SMTP
$client = new-object System.Net.Mail.SmtpClient $serveur

# Authentification au serveru SMTP lorsqu'elle est requise
$client.Credentials = New-Object System.Net.NetworkCredential("name_exp@domain.fr", "dsii");

# Envoi du mail
$client.Send($message)
}
}
}
##################################################################
#        Suppression des fichiers utilises s'ils existent        #
##################################################################

if (test-path $chemin\servers.txt)
{
Remove-Item $chemin\servers.txt
}
if (test-path $chemin\cert_exp.txt)
{
Remove-Item $chemin\cert_exp.txt
}
Stop-transcript