BvSiT

Obtenir un aperçu des tailles des profils utilisateurs avec Powershell

En particulier dans le cas d'un terminal server il est important de contrôler les tailles des profils utilisateurs. Ceci peut s'avérer une tache assez difficile. Bienqu’on puisse utiliser disk quota à fin d’empêcher un profil utilisateur d’occuper trop d’espace disque, quelques problèmes pourraient néanmoins se présenter. Par exemple si un utilisateur a consommé tout l’espace disque qui lui est accordé il pourrait ne pas pouvoir se connecter à la prochaine tentative.

Le contrôle de tous les fichiers temporaires et les mises à jour qu’un utilisateur peut laisser dans son profil sans le savoir pourrait également s’avérer problématique. Beaucoup de choses peuvent être accomplies par l’utilisation des stratégies de groupe (GPO) mais il peut toujours être important d’inspecter les profils de temps en temps et de déterminer quels dossiers et fichiers sont à l’origine d’une utilisation excessive de l’espace disque.

L’explorateur des fichiers de toutes les versions Windows jusqu’à présent réussissent mal à fournir des informations sur la taille des dossiers. Sur internet vous trouverez l’excellent outil GetFolderSize et en plus c’est gratuit! Le problème avec tous les outils que l’on peut trouver sur internet c’est qu’évidemment on devrait être extrêmement hésitant à installer n’importe lequel d’entre eux sur un réseau d’entreprise et encore plus sur un serveur d’entreprise. Bien qu’il soit très tentant je dois admettre, surtout quand on a passé des heures – comme il m’est arrivé moi-même – à rechercher l’outil approprié dans le système Windows server lui-même ou sur les sites de Microsoft.

Powershell permet d’obtenir un bel aperçu des tailles des dossiers sans avoir besoin d’installer aucun outil tiers. Il faut admettre qu’il est très primitif en comparaison de GetFolderSize. De plus il est beaucoup plus lent à produire les résultats attendus. Mais en définitive il produit quand-même les informations nécessaires.

Powershell connait le cmdlet Measure-Object qui permet d’obtenir la taille des dossiers. Dans ce script les informations par utilisateur sont sauvegardées dans un objet customisé pour pouvoir classer toute une liste de profils utilisateurs.

 

#    NAME:    GetProfilesize.ps1
#    PURPOSE: Show an overview of various foldersizes in the user profiles on a machine. 

$ErrAction = "SilentlyContinue"

$rootPath = "C:\Users\" #This could also be a network path e.g. "\\terminalserver\c$\users"

$colProfileSizes = @()

$ProfSubfolder = @()
$ProfSubfolder += @{
                   Name="TemporaryInternetFiles"
                   SubPath="\AppData\Local\Microsoft\Windows\Temporary Internet Files\"
                   Size = 0
                   }
                   
$ProfSubfolder +=  @{Name="Desktop"
                   SubPath="\Desktop\"
                   Size=0
                   }                   
                   
$ProfSubfolder += @{Name="Appdata"
                   SubPath="\AppData\"
                   Size=0
                   } 
                   
#You could add more subfolders here the same way as above. Then also add an extra line to format$
                   
$ProfileSizes = @{FullName=""
                 TotalSize=0
                 }                                     
$ProfileSizes = New-Object PSObject -Property $ProfileSizes

for ($i=0; $i -lt $ProfSubfolder.length; $i++) {
    $ProfileSizes | Add-Member -type NoteProperty -name $ProfSubfolder[$i].Name `
                                                                     -value $ProfSubfolder[$i].Size -force
}

$colUserProfiles = Get-ChildItem $rootPath |Where {($_.psIsContainer -eq $true)}

foreach ($UserProfile in $colUserProfiles)
{
     $colItems = (Get-ChildItem -recurse $UserProfile.FullName -force -ErrorAction $ErrAction |
                                               Measure-Object -property length -sum -ErrorVariable errors `
                                                                                   -ErrorAction $ErrAction)
     $ProfileSizes.FullName = $UserProfile.FullName
     $ProfileSizes.TotalSize = $colItems.sum
     for ($i=0; $i -lt $ProfSubfolder.length; $i++) {
        $colItems = Get-ChildItem -recurse ($UserProfile.FullName + $ProfSubfolder[$i].SubPath) `
                 -force -ErrorAction $ErrAction | 
                         Measure-Object -property length -sum -ErrorVariable errors  -ErrorAction $ErrAction  
        $ProfileSizes.($ProfSubfolder[$i].Name) = $colItems.sum        
     }     
     $ProfileSizes | ft
     $colProfileSizes += $ProfileSizes
     $ProfileSizes = $ProfileSizes.PSObject.Copy()
}

$format = 
    @{Expression={$_.FullName};Label="Path Profile";width=40},
    @{Expression={"{0:N2}" -f ($_.TotalSize / 1MB)};Label="TotalSize(KB)";align="right";width=10}
    
$format +=  @{Expression={"{0:N2}" -f ($_.($ProfSubfolder[0].Name)/ 1KB)};
                                Label= $ProfSubfolder[0].Name;align="right";width=10}
$format +=  @{Expression={"{0:N2}" -f ($_.($ProfSubfolder[1].Name)/ 1KB)};
                                Label= $ProfSubfolder[1].Name;align="right";width=10}
$format +=  @{Expression={"{0:N2}" -f ($_.($ProfSubfolder[2].Name)/ 1KB)};
                                Label= $ProfSubfolder[2].Name;align="right";width=10}
  
$colProfileSizes | Sort-Object TotalSize -descending | ft $format -autosize