envoi de mail à une liste d’utilisateur figurant sur un fichier csv avec requète sur l’AD pour obtenir l’adresse mail

Objectif :

Voici un script d’envoi de mail à une liste d’utilisateur de l’active directory créée par le logiciel de gestion de quota Nothern-NSS.
Le but est de signaler aux utilisateurs qu’ils ont dépassé leur quota d’utilisation.
Dans ce cas précis, l’adresse mail du user figure dans le champs description de l’Active Directory.
Les données sont sous cette forme :

Le script :

function Enregistrement_Donnees_Dans_Log($Donneelog)
    {
        $Date = Get-date -f "yyyyMMdd"
        $LogFile = "C:\Temp\mon_Logs_$date.log"
        if(Test-Path $LogFile)
            {
                Add-Content $LogFile $Donneelog -encoding Unicode
            }
        else
            {
                $NouveauFichier = New-Item $LogFile -type file -force
                Add-Content $LogFile $Donneelog -encoding Unicode
            }
    }
function get-mail
    {
    Param(
    [String]$Nom = "",
    [String]$AdresseMail = "",
    [String]$cc = "admin-windows@mon.domaine.fr",
    [String]$TailleQuota = "",
    [String]$UsageQuota = "",
    [String]$PourcentageQuota = ""
    )
    $TailleQuota = $TailleQuota /1MB
    $UsageQuota = $UsageQuota /1MB
    $expediteur = "admin-windows@mon.domaine.fr"
    $destinataire = $AdresseMail
    $serveur = "mail.mon.domaine.fr"
    $objet = "[DSI]Dépassement de quota d'utilisation de votre espace disque en date du  " + [System.DateTime]::Now
    $texte = "Bonjour, vous disposez du compte numéro $Nom. `r`n
    Vous avez dépassé le quota d'utilisation de l'espace disque qui vous est alloué. `r`n
    Vous utilisez $UsageQuota MB sur votre répertoire personnel. L'utilisation maximum autorisée est de $TailleQuota MB. Soit une utilisation de $PourcentageQuota % de votre quota.`r`n
    Vous devez archiver vos données avant qu'elles soient automatiquement supprimées par le système.`r`n
    ---------------------------`r`n
    `r`n
    L'adminstrateur système
    "

    $message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
    $copiecarbone = new-object System.Net.Mail.Mailaddress $cc, "Administrateur Système"
    $message.cc.Add($copiecarbone)
    #$attachment = new-object System.Net.Mail.Attachment $fichier
    #$message.Attachments.Add($attachment)

    $SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
    $SMTPclient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

    $SMTPclient.Send($message)
    }

function get-dn ($SAMName)
{
    $root = [ADSI]''
    $searcher = new-object     System.DirectoryServices.DirectorySearcher($root)
        $searcher.filter = "(&(objectClass=user)(sAMAccountName= $SAMName))"
        $user = $searcher.findall()
        foreach ($objResult in $user)
            {
            $objItem = $objResult.Properties; $objItem.description
            }
}

Function ListeLogin
{
  Param(
    [String]$FichierCsv = "emplacement de mon fichier.csv"
  )
$ImportCsv = Import-Csv $FichierCsv -Delimiter ';'

  foreach ($cellule in $ImportCsv)
  {
    $NomLDAP = $cellule.Object.Substring(33,8)
    $AdresseMailLDAP = get-dn $NomLDAP
    write-host $AdresseMailLDAP
    get-mail -Nom $NomLDAP -AdresseMail $AdresseMailLDAP -TailleQuota $cellule.QuotaSize -UsageQuota $cellule.Usage -PourcentageQuota $cellule.UsagePercent
  }
}
ListeLogin

 

Recherche du poids (ou taille) des répertoire en MB

Le but de ce script powershell est de « parser » les répertoires de votre arborescence afin de définir pour chaque répertoire son poids en MB. La fonction de récursivité de Windows étant limitée, une fonction Get-ChildItemToDepth est implémenté. Elle cherchera dans l’arborescence aussi profond que vous lui indiquerez grâce à la valeur passée à l’argument : « -ToDepth 2″.
Il est largement perfectible…

$Chemin = "F:\votre répertoire à scanner\"
$compteur = 0
$total = 0
$Date = Get-date -f "yyyyMMdd"
$chemin_log = "c:\temp\data_total_$Date.csv"
$tableau_csv = @()

Function Get-ChildItemToDepth {
  Param(
  [String]$Path = $PWD,
  [String]$Filter = "*",
  [Byte]$ToDepth = 255,
  [Byte]$CurrentDepth = 0,
  [Switch]$DebugMode
)
  $CurrentDepth++
  If ($DebugMode) {
    $DebugPreference = "Continue"
  }
  Get-ChildItem $Path | %{
    $_ | ?{ $_.Name -Like $Filter
    }
  If ($_.PsIsContainer) {
    If ($CurrentDepth -eq $ToDepth) {
    }
    If ($CurrentDepth -le $ToDepth) {
      Get-ChildItemToDepth -Path $_.FullName -Filter $Filter -ToDepth $ToDepth -CurrentDepth $CurrentDepth
      $concatene = $_.FullName+"\"+$Filter
      $objFSO = New-Object -ComObject Scripting.FileSystemObject
      if($objFSO.FileExists($chemin_log -eq $FALSE)){
        $compteur = $compteur+1
        $data = Get-ChildItem $concatene -recurse  | Measure-Object -property length -sum
        New-Object -TypeName PSObject -Property @{
          Path = $_.FullName
          Name = $_.Name
          Size = $data.Sum
          SizeMB = '{0:N2}' -f ($data.Sum/1mb)
          } | Export-Csv $chemin_log
        }
      else {
        $compteur = $compteur+1
        $data = Get-ChildItem $concatene -recurse | Measure-Object -property length -sum
        New-Object -TypeName PSObject -Property @{
          Path = $_.FullName
          Name = $_.Name
          Size = $data.Sum
          SizeMB = '{0:N2}' -f ($data.Sum/1mb)
          } | add-content $chemin_log
        }
      $total = $total + $colItems.sum
    }
  else {
    if ($compteur -eq 0 ){
    $total_repertoire = (Get-ChildItem $_.FullName).Count
    }
    Write-Debug $("Skipping GCI for Folder: $($_.FullName) " + `
"(Why: Current depth $CurrentDepth vs limit depth $ToDepth)")
    }
  }
}
}
Get-ChildItemToDepth $Chemin -Filter data -ToDepth 2

Configurer PowerShell dans Windows 2008 Server R2

Ajouter le rôle PowerShell avec sa dépendance .NET 3.5

2008_srv_ajout_role_1

Sélectionner la fonctionnalité “Windows Powser Shell” et cliquer sur “Suivant”, puis “Installer”

Configurer les stratégies d’exécution de Power Shell

Il existe 4 stratégies d’exécution pour Power Shell sous Windows 2008 Server :

 

  • Restricted :

 

Saisie interactive de commandes dans la console → Autorisé
Lancement de script → Interdit

 

  • AllSigned :

 

Lancement de script “signés” → Autorisé mais confirmation requise

 

  • RemoteSigned :

 

Les scripts locaux (signés ou non) → Autorisé (Les scripts téléchargés doivent être obligatoirement signés)
Pas de confirmation lors de l’exécution d’un script

 

  • Unrestricted :

Aucune restriction

Choix de stratégie

Par défaut, RemoteSigned est choisi sur ces serveurs mais la stratégie “Restricted” est en place par défaut sur un serveur Windows 2008 Server. Pour vérifier cette configuration, vous pouvez utiliser la commande “Get-ExecutionPolicy” (dans la console Power Shell).

 

Pour modifier la stratégie appliquée au serveur vous pouvez utiliser la commande “Set-ExecutionPolicy” suivi du mode désiré.

Ajouter le rôle PowerShell avec sa dépendance .NET 3.5

Disparition d’un volume au redémarrage d’un windows 2008 server

Suite à la disparition d’un volume (situé sur une baie) sur un serveur Windows 2008 R2, voici les manipulations afin qu’il soit de nouveau opérationnel. Liste des disques et passage de read only à read & write.

  1. Représenter de nouveau le volume de la baie de stockage au serveur.
  2. Lorsque c’est fait, il est possible que ce volume soit en lecture seule.
    1. diskpart (utilitaire de disque)
    2. list disk
    3. select disk 2 (selection du disque désiré)
    4. attributes disk (lecture de l’état du disk : readonly)
    5. attributes disk clear readonly (passage en read & write)
    6. attributes disk (lecture de l’état du disk : read & write)
    7. exit