Question Boucle conditionnelle (négation)

Plus d'informations
il y a 6 ans 10 mois #28914 par lefevre
Salut 6ratgus

Hier soir, j'ai essayé de créer ceci
[code:1]if ($totalUpdates.count -ne 0) {
$sendMail = $smtp.Send($msg)
$sendMail = $true
}

else {$sendMail = $false}[/code:1]
Mais toujours pas, peut-être que je ne le place pas au bon endroit aussi.

Où est-ce que vous placerez cette condition ?

Pour le moment, l’exécution des scripts s'effectue localement sur chaque serveur, donc pas de soucis de ce côté-là.<br><br>Message édité par: llefevre, à: 14/05/19 10:23

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

Plus d'informations
il y a 6 ans 10 mois #28917 par Philippe
tout naturelement a l'envoie du mail a la fin du script; voir le script ci-dessous ou y il a la marque &lt;&lt;&lt;

a tu lu tous mon precedent message ?
en particulier sur le nombre d'ordi que tu consulte !

[code:1]#########################################################
# #
# Monitoring Windows Updates and Pending Restarts #
# #
#########################################################

#########################################################
# List of computers to be monitored
#########################################################
$Servers = Get-Content .\Machines.txt

#########################################################
# List of users who will receive the report
#########################################################
$mailto = \&quot;Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser., mail2@mail.net\&quot;

#########################################################
# SMTP properties
#########################################################
$emailFrom = \&quot;suport@mail.net\&quot;
$smtpServer = \&quot;mySMTPServer\&quot; #SMTP Server.
$smtpUsername = \&quot;myUsername\&quot;
$smtpPassword = \&quot;myPassword\&quot;

$results = foreach ($Computer in $Servers) {
try {
$service = Get-WmiObject Win32_Service -Filter 'Name=\&quot;wuauserv\&quot;' -ComputerName $Computer -Ea 0
$WUStartMode = $service.StartMode
$WUState = $service.State
$WUStatus = $service.Status

try {
if (Test-Connection -ComputerName $Computer -Count 1 -Quiet) {
#check if the server is the same where this script is running
if ($Computer -eq \&quot;$env:computername.$env:userdnsdomain\&quot;«») {
$UpdateSession = New-Object -ComObject Microsoft.Update.Session
}
else {
$UpdateSession = [activator]::CreateInstance([type]::GetTypeFromProgID(\&quot;Microsoft.Update.Session\&quot;, $Computer))
}
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
$SearchResult = $UpdateSearcher.Search(\&quot;IsAssigned=1 and IsHidden=0 and IsInstalled=0\&quot;«»)
$Critical = $SearchResult.updates | where { $_.MsrcSeverity -eq \&quot;Critical\&quot; }
$important = $SearchResult.updates | where { $_.MsrcSeverity -eq \&quot;Important\&quot; }
$other = $SearchResult.updates | where { $_.MsrcSeverity -eq $null }
# Get windows updates counters
$totalUpdates = $($SearchResult.updates.count)
$totalCriticalUp = $($Critical.count)
$totalImportantUp = $($Important.count)

if ($totalUpdates -gt 0) {
$updatesToInstall = $true
}
else {
$updatesToInstall = $false
}
}
else {
# if cannot connected to the server the updates are listed as not defined
$totalUpdates = \&quot;nd\&quot;
$totalCriticalUp = \&quot;nd\&quot;
$totalImportantUp = \&quot;nd\&quot;
}
}
catch {
# if an error occurs the updates are listed as not defined
Write-Warning \&quot;$Computer`: $_\&quot;
$totalUpdates = \&quot;nd\&quot;
$totalCriticalUp = \&quot;nd\&quot;
$totalImportantUp = \&quot;nd\&quot;
$updatesToInstall = $false
}

# Querying WMI for build version
$WMI_OS = Get-WmiObject -Class Win32_OperatingSystem -Property BuildNumber, CSName -ComputerName $Computer -Authentication PacketPrivacy -Impersonation Impersonate

# Making registry connection to the local/remote computer
$RegCon = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]\&quot;LocalMachine\&quot;, $Computer)

# If Vista/2008 &amp; Above query the CBS Reg Key
If ($WMI_OS.BuildNumber -ge 6001) {
$RegSubKeysCBS = $RegCon.OpenSubKey(\&quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\\&quot;«»).GetSubKeyNames()
$CBSRebootPend = $RegSubKeysCBS -contains \&quot;RebootPending\&quot;
}
else {
$CBSRebootPend = $false
}

# Query WUAU from the registry
$RegWUAU = $RegCon.OpenSubKey(\&quot;SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\\&quot;«»)
$RegSubKeysWUAU = $RegWUAU.GetSubKeyNames()
$WUAURebootReq = $RegSubKeysWUAU -contains \&quot;RebootRequired\&quot;

If ($CBSRebootPend –OR $WUAURebootReq) {
$machineNeedsRestart = $true
}
else {
$machineNeedsRestart = $false
}

# Closing registry connection
$RegCon.Close()

if ($machineNeedsRestart -or $updatesToInstall -or ($WUStartMode -eq \&quot;Manual\&quot;«») -or ($totalUpdates -eq \&quot;nd\&quot;«»)) {
New-Object PSObject -Property @{
Computer = $WMI_OS.CSName
WindowsUpdateStatus = $WUStartMode + \&quot;/\&quot; + $WUState + \&quot;/\&quot; + $WUStatus
UpdatesToInstall = $updatesToInstall
TotalOfUpdates = $totalUpdates
TotalOfCriticalUpdates = $totalCriticalUp
TotalOfImportantUpdates = $totalImportantUp
RebootPending = $machineNeedsRestart
}
}
}
Catch {
Write-Warning \&quot;$Computer`: $_\&quot;
}
}

#########################################################
# Formating result
#########################################################
$tableFragment = $results | ConvertTo-HTML -fragment

# HTML Format for Output
$HTMLmessage = @\&quot;
&lt;font color=\&quot;\&quot;black\&quot;\&quot; face=\&quot;\&quot;Arial\&quot;\&quot; size=\&quot;\&quot;3\&quot;\&quot;&gt;
&lt;h1 style='font-family:arial;'&gt;&lt;b&gt;Windows Updates and Pending Restarts Report&lt;/b&gt;&lt;/h1&gt;
&lt;p style='font: .8em \&quot;\&quot;Lucida Grande\&quot;\&quot;, Tahoma, Arial, Helvetica, sans-serif;'&gt;This report was generated because the server(s) listed below have Windows Updates ready to be installed, Windows Updates configured to be checked manually or servers that required a reboot. Servers that do not fall under these conditions will not be listed.&lt;/p&gt;
&lt;br&gt;&lt;br&gt;
&lt;style type=\&quot;\&quot;text/css\&quot;\&quot;&gt;body{font: .8em \&quot;\&quot;Lucida Grande\&quot;\&quot;, Tahoma, Arial, Helvetica, sans-serif;}
ol{margin:0;}
table{width:80%;}
thead{}
thead th{font-size:120%;text-align:left;}
th{border-bottom:2px solid rgb(79,129,189);border-top:2px solid rgb(79,129,189);padding-bottom:10px;padding-top:10px;}
tr{padding:10px 10px 10px 10px;border:none;}
#middle{background-color:#900;}
&lt;/style&gt;
&lt;body BGCOLOR=\&quot;\&quot;white\&quot;\&quot;&gt;
$tableFragment
&lt;/body&gt;
\&quot;@


#########################################################
# Validation and sending email
#########################################################
# Regular expression to get what's inside of &lt;td&gt;'s
$regexsubject = $HTMLmessage
$regex = [regex] '(?im)&lt;td&gt;'

# If you have data between &lt;td&gt;'s then you need to send the email
#if ($regex.IsMatch($regexsubject)) {
if ($totalUpdates -ne 0) { # &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
$smtp = New-Object Net.Mail.SmtpClient -ArgumentList $smtpServer
$smtp.credentials = New-Object System.Net.NetworkCredential($smtpUsername, $smtpPassword);
$msg = New-Object Net.Mail.MailMessage
$msg.From = $emailFrom
$msg.To.Add($mailto)
$msg.Subject = \&quot;Disk Space Alert for $computer\&quot;
$msg.IsBodyHTML = $true
$msg.Body = $HTMLmessage
$smtp.Send($msg)
}[/code:1]<br><br>Message édité par: 6ratgus, à: 14/05/19 13:45

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

Plus d'informations
il y a 6 ans 10 mois #28920 par lefevre
Merci pour le retour, de cette manière ça fonctionne.

[code:1]# If you have data between &lt;td&gt;'s then you need to send the email
if ($regex.IsMatch($regexsubject)){
if ($totalUpdates -ne 0) {
$smtp = New-Object Net.mail.SmtpClient -ArgumentList $smtpServer
$smtp.Credentials = New-Object System.Net.NetworkCredential($smtpUsername, $smtpPassword);
$msg = New-Object Net.mail.MailMessage
$msg.From = $emailFrom
$msg.To.Add($mailto)
$msg.subject =\&quot;Update et/ou reboot en attente sur $computer\&quot;
$msg.IsBodyHtml = $true
$msg.Body = $HTMLmessage
$smtp.Send($msg)
}
}[/code:1]

Oui, j'ai lu votre dernier message, mais comme je n'ai jamais réussi à exécuter ce script à distance à cause d'un problème de crédentials (voir un autre post là-dessus sur ce forum) j'ai abandonné l'idée.
powershell-scripting.com/index.php?optio...25&catid=5#27925

Donc, comme je vous l'ai précisé dans le message précédent, je surveille chaque poste un par un.

Idéalement, j'aimerais pouvoir exécuter ce script directement sur le serveur et récupérer la liste de tous les serveurs en un seul mail, mais je n'y suis jamais parvenu.<br><br>Message édité par: llefevre, à: 15/05/19 09:13

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

Plus d'informations
il y a 6 ans 10 mois #28942 par Philippe

Idéalement, j'aimerais pouvoir exécuter ce script directement sur le serveur et récupérer la liste de tous les serveurs en un seul mail, mais je n'y suis jamais parvenu.

dans le fichier serveurs.txt il te faut mettre les noms des serveurs
un nom par ligne avec le nom de domaine compris
ex :
serveur1.domaine.com
ordinateur.domaine.com
etc

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

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