none
Optimisation et fusion de commandes PowerShell RRS feed

  • Question

  • Bonjour,

    J'ai actuellement deux problèmes avec PS:


    - Tout d'abord j'ai une commande qui est trop longue a l’exécution: y a-t-il moyen d'améliorer cette commande ?
    Get-Mailbox -resultsize unlimited | Get-MailboxStatistics
    Tout en sachant que je dois récupérer toutes les statistiques de toutes les boites mails (pour info pour environs 400 personnes il met environs 10 mins)


    - Mon autre problèmes est un problème de combinaison de commande: J'aimerais pouvoir avoir le DisplayName, et la taille max et la taille utilisée des boites mails de chaque utilisateur (en MB) or actuellement j'ai les informations séparément:
    # Recupère la taille max des boite au lettre en MB
    Get-Mailbox -ResultSize 2 | Select DisplayName, @{name="TotalMax (MB)"; expression={[math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}}
    # Recupère la taille utilisé des boite au lettre en MB
    Get-Mailbox -ResultSize 2 | Get-MailboxStatistics | Select DisplayName, @{name="TotalUtilise (MB)"; expression={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}}

    Remarque complémentaire: j'ai besoin d'avoir des valeurs avec que des chiffres afin de pouvoir faire des opérations que je ne peux pas faire lorsque j'ai "2 GB (2,... bytes)"


    Merci d'avance

    mercredi 3 juin 2015 12:19

Réponses

  • Je n'obtiens que "," dans la colonne License
    Léa, essaie en faisant un -Expand sur AccountSkuID
    # Utilisation des Boites Mails avec Licence associee
    # ########################################
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop
          $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $_.UserPrincipalName
             License = $User | Select -ExpandProperty Licenses | Select AccountSkuID
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{
    
       $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $User | Select UserPrincipalName
             License = ($User | Select -ExpandProperty Licenses | Select -exp AccountSkuID) -join ','
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })
    
       }
    }
    
    $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath

    Blog
    Scripts

    vendredi 5 juin 2015 12:53
  • Léa,

    Il faut créer ta liste avant de la remplir, et insérer des parenthèses aussi.

    Test :

    $Results = @()
    
    Get-Mailbox -ResultSize 2 | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
       
       $Results += (New-Object PSObject -Property @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsedMB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       })
    }
    
    $Results | Select-Object DisplayName,TotalMaxMB,TotalUsedMB


    Blog
    Scripts

    jeudi 4 juin 2015 10:10
  • Léa,

    On va mettre un peu de gestion d'erreur :

    # Quotas Utilisation Boites Mails
    # ########################################
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\QuotasUtilisationBoitesMails_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction Stop
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             DisplayName = $_.DisplayName
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{}
    }
    
    $Results | Select-Object DisplayName,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath

    Les erreurs seront cachées, tu peux mener des actions particulières en les ajoutant dans le block catch.


    Blog
    Scripts


    jeudi 4 juin 2015 15:48
  • Léa,

    # Utilisation des Boites Mails avec Licence associee # ######################################## $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv" $Results = @() Get-Mailbox -ResultSize unlimited | % { try{ $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1) $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1) $Results += (New-Object PSObject -Property @{ LastName = $User | Select LastName FirstName = $User | Select FirstName UserPrincipalName = $_.UserPrincipalName License = $User | Select -ExpandProperty Licenses | Select AccountSkuID TotalMaxGB = $MaxGB TotalUsedGB = $UsedGB Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0) }) } catch{

    $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $User | Select UserPrincipalName
             License = $User | Select -ExpandProperty Licenses | Select AccountSkuID
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })

    } } $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath


    Un truc dans ce genre là.


    Blog
    Scripts

    vendredi 5 juin 2015 09:47
  • Cela fonctionne parfaitement, merci pour l'aide.

    A titre d'info, voici mon script final:

    # Utilisation des Boites Mails avec Licence associee
    # ########################################unlimited
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop
          $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $_.UserPrincipalName
             License = ($User | Select -ExpandProperty Licenses | Select -exp AccountSkuID) -join ', '
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{
           $Results += (New-Object PSObject -Property @{
                 LastName = $User | Select LastName
                 FirstName = $User | Select FirstName
                 UserPrincipalName = $User | Select UserPrincipalName
                 License = ($User | Select -ExpandProperty Licenses | Select -exp AccountSkuID) -join ', '
                 TotalMaxGB = "NO-STATS"
                 TotalUsedGB = "NO-STATS"
                 Percent = "NO-STATS"
          })
       }
    }
    
    $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath
    
    # Correction Affichage
    $content = Get-Content $DataPath | foreach { $_ -replace "@{AccountSkuId=","" } | 
                                       foreach { $_ -replace "@{LastName=","" } | 
                                       foreach { $_ -replace "@{FirstName=","" } | 
                                       foreach { $_ -replace "@{UserPrincipalName=","" } | 
                                       foreach { $_ -replace "}","" } | 
                                       foreach { $_ -replace "EXCHANGEDESKLESS","Exchange Online Kiosk" } | 
                                       foreach { $_ -replace "EXCHANGESTANDARD","Exchange Online (plan 1)" } | 
                                       foreach { $_ -replace "STANDARDPACK","Office 365 Entreprise E1" } | 
                                       foreach { $_ -replace "MCOIMP","Skype Entreprise Online (plan 1)" } 
    Set-Content -Path $DataPath -Value $content
    vendredi 5 juin 2015 13:36

Toutes les réponses

  • Bonjour,

    J'ai actuellement deux problèmes avec PS:


    - Tout d'abord j'ai une commande qui est trop longue a l’exécution: y a-t-il moyen d'améliorer cette commande ?
    Get-Mailbox -resultsize unlimited | Get-MailboxStatistics
    Tout en sachant que je dois récupérer toutes les statistiques de toutes les boites mails (pour info pour environs 400 personnes il met environs 10 mins)


    - Mon autre problèmes est un problème de combinaison de commande: J'aimerais pouvoir avoir le DisplayName, et la taille max et la taille utilisée des boites mails de chaque utilisateur (en MB) or actuellement j'ai les informations séparément:
    # Recupère la taille max des boite au lettre en MB
    Get-Mailbox -ResultSize 2 | Select DisplayName, @{name="TotalMax (MB)"; expression={[math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}}
    # Recupère la taille utilisé des boite au lettre en MB
    Get-Mailbox -ResultSize 2 | Get-MailboxStatistics | Select DisplayName, @{name="TotalUtilise (MB)"; expression={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}}

    Remarque complémentaire: j'ai besoin d'avoir des valeurs avec que des chiffres afin de pouvoir faire des opérations que je ne peux pas faire lorsque j'ai "2 GB (2,... bytes)"


    Merci d'avance

    Bonjour Léa,

    Pour ton premier point, la seule solution est d'utiliser les Exchange Web Services (bien plus complexe que les cmdlets Exchange).

    Pour ton second point, il te faut stocker les résultats dans des variables intermédiaires, et ensuite créer un nouvel objet :

    Get-Mailbox | % {
       $Stats = Get-MailboxStatistics $_
       
       New-Object PSObject -Properties @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }
    A tester, je n'ai pas d'Exchange sous la main :)


    Blog
    Scripts

    mercredi 3 juin 2015 15:09
  • Je teste et je te tiens au courant, merci pour l'aide.
    mercredi 3 juin 2015 15:44
  • Pour ton second point, il te faut stocker les résultats dans des variables intermédiaires, et ensuite créer un nouvel objet :
    Get-Mailbox | % {
       $Stats = Get-MailboxStatistics $_
       
       New-Object PSObject -Properties @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }
    A tester, je n'ai pas d'Exchange sous la main :)

    J'ai testé, malheureusement il dit:

    Cannot process argument transformation on parameter 'Identity'. Cannot convert value "Prenom NOM" to type
    "Microsoft.Exchange.Configuration.Tasks.GeneralMailboxOrMailUserIdParameter". Error: "Cannot convert hashtable to an object of the following type:
    Microsoft.Exchange.Configuration.Tasks.GeneralMailboxOrMailUserIdParameter. Hashtable-to-Object conversion is not supported in restricted language mode or a
    Data section."
        + CategoryInfo          : InvalidData : (:) [Get-MailboxStatistics], ParameterBindin...mationException
        + FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-MailboxStatistics
        + PSComputerName        : pod51048psh.outlook.com

    Ne comprenant pas vraiment les objets que je manipule, vois-tu où est le problème ?

    mercredi 3 juin 2015 15:59
  • Léa,

    Essaie :

    Get-Mailbox | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
       
       New-Object PSObject -Properties @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }


    Blog
    Scripts

    jeudi 4 juin 2015 07:08
  • Get-Mailbox | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
       
       New-Object PSObject -Properties @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }

    Cette fois il me dit:

    % : Impossible de trouver un paramètre correspondant au nom « Properties ».
    Au caractère C:\ScriptsPS_En-creation\QuotasUtilisationBoitesMails_TEMP_02.ps1:1 : 30
    + Get-Mailbox  -ResultSize 2 | % {
    +                              ~~~
        + CategoryInfo          : InvalidArgument : (:) [ForEach-Object], ParameterBindingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.ForEachObjectCommand

    Il a l'air d'avoir un problème avec le foreach cette fois


    Du coup j'ai essayé de faire: (j'ai ajouté temporairement "-ResultSize 2" pour ne pas avoir 400 fois la même erreur)

    $Mails = Get-Mailbox -ResultSize 2 
    foreach($mail in $Mails){
       $Stats = Get-MailboxStatistics $mail.UserPrincipalName
       
       New-Object PSObject -Properties @{
          DisplayName = $mail.DisplayName
          TotalMaxMB = [math]::Round(($mail.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }

    Mais j'obtiens l'erreur suivante:

    New-Object : Impossible de trouver un paramètre correspondant au nom « Properties ».
    Au caractère C:\ScriptsPS_En-creation\QuotasUtilisationBoitesMails_TEMP_02.ps1:5 : 24
    +    New-Object PSObject -Properties @{
    +                        ~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument : (:) [New-Object], ParameterBindingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.NewObjectCommand


    Du coup j'ai essayé ça:

    $Mails = Get-Mailbox  -ResultSize 2 
    foreach($mail in $Mails){
        $Stats = Get-MailboxStatistics $mail.UserPrincipalName
    
        $Properties = @{
            DisplayName = $mail.DisplayName
            TotalMaxMB = [math]::Round(($mail.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
            TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
        }
    
        $Results += New-Object psobject -Property $Properties
    }
    
    $Results | Select-Object DisplayName,TotalMaxMB,TotalUsed
    

    Mais j'ai eu cette erreur ci:

    Échec lors de l’appel de la méthode, car [System.Management.Automation.PSObject] ne contient pas de méthode nommée « op_Addition ».
    Au caractère C:\ScriptsPS_En-creation\QuotasUtilisationBoitesMails_TEMP_02.ps1:11 : 5
    +     $Results += New-Object psobject -Property $Properties
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (op_Addition:String) [], RuntimeException
        + FullyQualifiedErrorId : MethodNotFound

    Une idée ?



    jeudi 4 juin 2015 08:00
  • bonjour lea

    essai en remplacent Properties par Property

    Get-Mailbox | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
       
       New-Object PSObject -Property @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }


    • Modifié 6ratgus jeudi 4 juin 2015 08:23
    jeudi 4 juin 2015 08:22
  • Bonjour,

    Concernant le Get-MailboxStatistics, cette cmdlet provoque un accès à la base de données de l'utilisateur pour pouvoir récupérer les métriques de volumétrie. Ces données ne sont pas stockés dans l'AD, c'est cet accès à la base de données qui provoquent une certaines lenteurs (surtout si elles ne sont pas dans le cache ESE).

    Le script fournis par Emmanuel est très bien, ce type de script un grand classique des services d'exploitation, souvent planifié sous forme de tâche avec soit une sortie fichier ou un envoi d'email.


    Bruce Jourdain de Coutance - Consultant MVP Exchange http://blog.brucejdc.fr

    jeudi 4 juin 2015 08:40

  • Get-Mailbox | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
       
       New-Object PSObject -Property @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsed = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }

    Merci cela fonctionne, mais les colonnes se mettent dans un ordre curieux: TotalMaxMB, DisplayName, TotalUsed, est-ce possible d'avoir DisplayName,TotalMaxMB, TotalUsed ?

    jeudi 4 juin 2015 08:43
  • Pour l'ordre des colonnes elles se mettent bien lorsque que je fait :

    Get-Mailbox -ResultSize 2 | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
       
       $Results = New-Object PSObject -Property @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsedMB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       }
    }
    
    $Results | Select-Object DisplayName,TotalMaxMB,TotalUsedMB

    Mais il n'y a que le dernier utilisateur, normal vu que je met :

    $Results = New-Object PSObject -Property @{

    mais quand je rajoute le + pour mettre les résultats a la suite des autres j'ai une erreur:

    Je met:

    $Results += New-Object PSObject -Property @{

    j'obtiens:

    % : Échec lors de l’appel de la méthode, car [System.Management.Automation.PSObject] ne contient pas de méthode nommée « op_Addition ».
    Au caractère C:\ScriptsPS_En-creation\QuotasUtilisationBoitesMails_TEMP_02.ps1:1 : 29
    + Get-Mailbox -ResultSize 2 | % {
    +                             ~~~
        + CategoryInfo          : InvalidOperation : (op_Addition:String) [ForEach-Object], RuntimeException
        + FullyQualifiedErrorId : MethodNotFound,Microsoft.PowerShell.Commands.ForEachObjectCommand
    Suivit du dernier utilisateur.



    jeudi 4 juin 2015 09:11
  • Léa,

    Il faut créer ta liste avant de la remplir, et insérer des parenthèses aussi.

    Test :

    $Results = @()
    
    Get-Mailbox -ResultSize 2 | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
       
       $Results += (New-Object PSObject -Property @{
          DisplayName = $_.DisplayName
          TotalMaxMB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
          TotalUsedMB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
       })
    }
    
    $Results | Select-Object DisplayName,TotalMaxMB,TotalUsedMB


    Blog
    Scripts

    jeudi 4 juin 2015 10:10
  • Ca marche parfaitement, merci à tous pour l'aide.
    jeudi 4 juin 2015 11:47
  • Euh ... bon ça marche nickel pour les premiers utilisateurs, mais lorsque qu'il rencontre des utilisateurs qui ne se sont pas encore connectés, ou des boîtes mails particulières

    Mon script actuel:

    # Quotas Utilisation Boites Mails
    # ########################################
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\QuotasUtilisationBoitesMails_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       $Stats = Get-MailboxStatistics $_.UserPrincipalName
    
       $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
       $Results += (New-Object PSObject -Property @{
          DisplayName = $_.DisplayName
          TotalMaxGB = $MaxGB
          TotalUsedGB = $UsedGB
          Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
       })
    }
    
    $Results | Select-Object DisplayName,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath


    Les erreurs que j’obtiens:

    1er lancement avec Get-Mailbox -ResultSize unlimited

    La boîte aux lettres spécifiée "a@b.c" n'existe pas.
        + CategoryInfo          : NotSpecified: (:) [Get-MailboxStatistics], ManagementObjectNotFoundException
        + FullyQualifiedErrorId : [Server=DBXPR04MB176,RequestId=a2cb9962-5912-4630-b330-79d08352d8b4,TimeStamp=04/06/2015 13:56:21] [FailureCategory=Cmdlet-Mana 
       gementObjectNotFoundException] CDB3D996,Microsoft.Exchange.Management.MapiTasks.GetMailboxStatistics
        + PSComputerName        : pod51048psh.outlook.com
     
    % : Impossible d’appeler une méthode dans une expression Null.
    Au caractère C:\ScriptsPS_Operationnels\Stats_Mails\QuotasUtilisationBoitesMails.ps1:7 : 37
    + Get-Mailbox -ResultSize unlimited | % {
    +                                     ~~~
        + CategoryInfo          : InvalidOperation : (:) [ForEach-Object], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull,Microsoft.PowerShell.Commands.ForEachObjectCommand
    J'ai ensuite réessayé en mettant Get-Mailbox -ResultSize 500 (car en testant uniquement Get-Mailbox j'obtiens 470 utilisateurs), mais j'ai de-nouveau une erreur:
    AVERTISSEMENT : L'utilisateur ne s'est pas connecté à la boîte aux lettres 'd@b.c' ( '300c9f0a-6f59-4b84-91da-4d1a48002d9b' ) ; aucune donnée ne
     peut donc être renvoyée. Une fois la connexion établie, cet avertissement ne s'affichera plus.
    % : Impossible d’appeler une méthode dans une expression Null.
    Au caractère C:\ScriptsPS_Operationnels\Stats_Mails\QuotasUtilisationBoitesMails.ps1:7 : 31
    + Get-Mailbox -ResultSize 500 | % {
    +                               ~~~
        + CategoryInfo          : InvalidOperation : (:) [ForEach-Object], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull,Microsoft.PowerShell.Commands.ForEachObjectCommand

    Dans le fichier ou je redirige la sortie, je n'ai obtenu que 76 lignes (au lieu des 470 attendu)

    Et lorsque je relance une 3ème fois le script avec  Get-Mailbox | %  j'obtiens la même erreur que pour la 2ème fois mais pas avec la même boîte mail

    jeudi 4 juin 2015 14:47
  • Léa,

    On va mettre un peu de gestion d'erreur :

    # Quotas Utilisation Boites Mails
    # ########################################
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\QuotasUtilisationBoitesMails_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction Stop
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             DisplayName = $_.DisplayName
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{}
    }
    
    $Results | Select-Object DisplayName,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath

    Les erreurs seront cachées, tu peux mener des actions particulières en les ajoutant dans le block catch.


    Blog
    Scripts


    jeudi 4 juin 2015 15:48
  • Cela fonction, merci.

    Quelle est la différence entre -ErrorAction Stop et -ErrorAction SilentlyContinue ?

    jeudi 4 juin 2015 16:32
  • Cela fonction, merci.

    Quelle est la différence entre -ErrorAction Stop et -ErrorAction SilentlyContinue ?

    Léa,

    Le "Stop" permet de générer une erreur qui serra gérée par le try/catch, le "SilentlyContinue" va cacher l'erreur sans te donner l’opportunité de faire une action corrective.

    Dans notre cas précis, le "Stop" permet d’arrêter le tour de boucle en cours, et ne pas passer à la suite des commande si la première commande génère une erreur.


    Blog
    Scripts

    jeudi 4 juin 2015 19:34
  • Le "Stop" permet de générer une erreur qui serra gérée par le try/catch, le "SilentlyContinue" va cacher l'erreur sans te donner l’opportunité de faire une action corrective.

    Si justement je veux comment "action corrective" que pour les cas ou il y a une erreur, il met "NO-STATS" comme valeur pour TotalMaxGB, TotalUsedGB, et Percent ?

    Est-ce que il suffit de mettre dans le catch:

    $Results += (New-Object PSObject -Property @{
             DisplayName = $_.DisplayName
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })

    vendredi 5 juin 2015 08:42
  • Le "Stop" permet de générer une erreur qui serra gérée par le try/catch, le "SilentlyContinue" va cacher l'erreur sans te donner l’opportunité de faire une action corrective.

    Si justement je veux comment "action corrective" que pour les cas ou il y a une erreur, il met "NO-STATS" comme valeur pour TotalMaxGB, TotalUsedGB, et Percent ?

    Est-ce que il suffit de mettre dans le catch:

    $Results += (New-Object PSObject -Property @{
             DisplayName = $_.DisplayName
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })

    Oui, sauf que dans un catch $_ devient l'erreur courante, il faut donc passer par une autre variable pour avoir le nom de la boite :

    $DisplayName = $_.DisplayName

    Dans le try.


    Blog
    Scripts

    vendredi 5 juin 2015 08:52
  • Je n'ai pas bien compris quelle est la correction que je dois faire dans le try.

    De plus on m'a demandé de modifier le script pour que au lieu des DisplayName on ait LastName, FirstName, UserPrincipalName, et License

    Voici mon script actuel:

    # Utilisation des Boites Mails avec Licence associee
    # ########################################
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop
          $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $_.UserPrincipalName
             License = $User | Select -ExpandProperty Licenses | Select AccountSkuID
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{}
    }
    
    $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath

    Du coup avec ce script  je dois mettre pour le catch:

    $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName
    
    $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $_.UserPrincipalName
             License = $User | Select -ExpandProperty Licenses | Select AccountSkuID
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })
    n'est-ce pas ? Et dans ce cas, où est ce que je modifie le try pour mettre:
    $UserPrincipalName = $_.UserPrincipalName


    vendredi 5 juin 2015 09:17
  • Léa,

    # Utilisation des Boites Mails avec Licence associee # ######################################## $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv" $Results = @() Get-Mailbox -ResultSize unlimited | % { try{ $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1) $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1) $Results += (New-Object PSObject -Property @{ LastName = $User | Select LastName FirstName = $User | Select FirstName UserPrincipalName = $_.UserPrincipalName License = $User | Select -ExpandProperty Licenses | Select AccountSkuID TotalMaxGB = $MaxGB TotalUsedGB = $UsedGB Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0) }) } catch{

    $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $User | Select UserPrincipalName
             License = $User | Select -ExpandProperty Licenses | Select AccountSkuID
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })

    } } $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath


    Un truc dans ce genre là.


    Blog
    Scripts

    vendredi 5 juin 2015 09:47
  • Ca marche bien, merci.

    Par contre est-ce qu'il y a moyen de gérer un le cas particulier où des utilisateurs ont 2 licences ?

    Car du coup dans licence j'ai: "System.Object[]"

    En l’occurrence c'est ces utilisateur ont soit la licence Exchange Online Kiosk soit Exchange Online ‎(plan 1)‎ ainsi qu'une licence Skype Entreprise Online ‎(plan 1)‎

    Est-ce possible d'avoir les deux licences dans la colonne License (en mettant un espace pour les séparer ou quelque chose du genre) ?

    vendredi 5 juin 2015 10:10
  • Ca marche bien, merci.

    Par contre est-ce qu'il y a moyen de gérer un le cas particulier où des utilisateurs ont 2 licences ?

    Car du coup dans licence j'ai: "System.Object[]"

    En l’occurrence c'est ces utilisateur ont soit la licence Exchange Online Kiosk soit Exchange Online ‎(plan 1)‎ ainsi qu'une licence Skype Entreprise Online ‎(plan 1)‎

    Est-ce possible d'avoir les deux licences dans la colonne License (en mettant un espace pour les séparer ou quelque chose du genre) ?

    Léa,

    # Utilisation des Boites Mails avec Licence associee
    # ########################################
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop
          $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $_.UserPrincipalName
             License = $User | Select -ExpandProperty Licenses | Select AccountSkuID
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{
    
       $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $User | Select UserPrincipalName
             License = ($User | Select -ExpandProperty Licenses | Select AccountSkuID) -join ','
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })
    
       }
    }
    
    $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath

    Devrait faire l'affaire :)


    Blog
    Scripts

    vendredi 5 juin 2015 11:04
  • Je n'obtiens que "," dans la colonne License
    vendredi 5 juin 2015 12:27
  • Je n'obtiens que "," dans la colonne License
    Léa, essaie en faisant un -Expand sur AccountSkuID
    # Utilisation des Boites Mails avec Licence associee
    # ########################################
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop
          $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $_.UserPrincipalName
             License = $User | Select -ExpandProperty Licenses | Select AccountSkuID
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{
    
       $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $User | Select UserPrincipalName
             License = ($User | Select -ExpandProperty Licenses | Select -exp AccountSkuID) -join ','
             TotalMaxGB = "NO-STATS"
             TotalUsedGB = "NO-STATS"
             Percent = "NO-STATS"
          })
    
       }
    }
    
    $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath

    Blog
    Scripts

    vendredi 5 juin 2015 12:53
  • Cela fonctionne parfaitement, merci pour l'aide.

    A titre d'info, voici mon script final:

    # Utilisation des Boites Mails avec Licence associee
    # ########################################unlimited
    
    $DataPath = get-date -uformat "C:\ScriptsPS_temp\UtilisationBoitesMails_Licences_%Y-%m-%d.csv"
    $Results = @()
    
    Get-Mailbox -ResultSize unlimited | % {
       try{
          $Stats = Get-MailboxStatistics $_.UserPrincipalName -ErrorAction SilentlyContinue #Stop
          $User = Get-MsolUser -UserPrincipalName $_.UserPrincipalName
    
          $MaxGB = [math]::Round(($_.ProhibitSendReceiveQuota.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
          $UsedGB = [math]::Round(($Stats.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1GB),1)
       
          $Results += (New-Object PSObject -Property @{
             LastName = $User | Select LastName
             FirstName = $User | Select FirstName
             UserPrincipalName = $_.UserPrincipalName
             License = ($User | Select -ExpandProperty Licenses | Select -exp AccountSkuID) -join ', '
             TotalMaxGB = $MaxGB
             TotalUsedGB = $UsedGB
             Percent = [math]::Round(($UsedGB / $MaxGB * 100), 0)
          })
       }
       catch{
           $Results += (New-Object PSObject -Property @{
                 LastName = $User | Select LastName
                 FirstName = $User | Select FirstName
                 UserPrincipalName = $User | Select UserPrincipalName
                 License = ($User | Select -ExpandProperty Licenses | Select -exp AccountSkuID) -join ', '
                 TotalMaxGB = "NO-STATS"
                 TotalUsedGB = "NO-STATS"
                 Percent = "NO-STATS"
          })
       }
    }
    
    $Results | Select-Object LastName,FirstName,UserPrincipalName,License,TotalMaxGB,TotalUsedGB,Percent | Export-Csv -notypeinformation -Path $DataPath
    
    # Correction Affichage
    $content = Get-Content $DataPath | foreach { $_ -replace "@{AccountSkuId=","" } | 
                                       foreach { $_ -replace "@{LastName=","" } | 
                                       foreach { $_ -replace "@{FirstName=","" } | 
                                       foreach { $_ -replace "@{UserPrincipalName=","" } | 
                                       foreach { $_ -replace "}","" } | 
                                       foreach { $_ -replace "EXCHANGEDESKLESS","Exchange Online Kiosk" } | 
                                       foreach { $_ -replace "EXCHANGESTANDARD","Exchange Online (plan 1)" } | 
                                       foreach { $_ -replace "STANDARDPACK","Office 365 Entreprise E1" } | 
                                       foreach { $_ -replace "MCOIMP","Skype Entreprise Online (plan 1)" } 
    Set-Content -Path $DataPath -Value $content
    vendredi 5 juin 2015 13:36