Como acessar e armazenar tamanhos de perfis de usuário do Windows com o PowerShell

É inegável que o PowerShell revolucionou a maneira como os profissionais de TI gerenciam os sistemas Windows, automatizam tarefas rotineiras e se aprofundam nos diagnósticos do sistema. Hoje, vamos nos aprofundar em um script do PowerShell desenvolvido para avaliar o tamanho dos perfis de usuário no Windows, uma ferramenta crucial para administradores de sistemas e provedores de serviços gerenciados (MSPs).

Histórico

Com o aumento do big data e dos aplicativos cada vez mais sofisticados, o gerenciamento do armazenamento e a garantia da utilização eficiente do disco se tornaram fundamentais. Os profissionais de TI e os MSPs frequentemente enfrentam desafios decorrentes do acúmulo de grandes quantidades de dados pelos usuários, às vezes sem saber. Esse script aborda essa preocupação, permitindo que os profissionais de TI determinem rapidamente os tamanhos dos perfis de usuário, garantindo o gerenciamento ideal do armazenamento e a integridade do sistema.

O roteiro

#Requires -Version 5.1

<#
.SYNOPSIS
    Updates a Custom Field with the total size of all User Profiles.
    If the Max parameter is specified then it will return an exit code of 1
     for any profile being over that Max threshold in GB.
.DESCRIPTION
    Updates a Custom Field with the total size of all User Profiles.
    If the Max parameter is specified then it will return an exit code of 1
     for any profile being over that Max threshold in GB.
.EXAMPLE
     -Max 60
    Returns and exit code of 1 if any profile is over 60GB
.EXAMPLE
     -CustomField "Something"
    Specifies the name of the custom field to update.
.EXAMPLE
    No Parameter needed.
    Uses the default custom field name: TotalUsersProfileSize
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes:
    Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [Alias("MaxSize", "Size", "ms", "m", "s")]
    [Double]
    $Max,
    [Parameter()]
    [Alias("Custom", "Field", "cf", "c", "f")]
    [String]
    $CustomField = "TotalUsersProfileSize"
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }
    function Format-FileSize {
        param($Length)
        switch ($Length) {
            { $_ / 1TB -gt 1 } { "$([Math]::Round(($_ / 1TB),2)) TB"; break }
            { $_ / 1GB -gt 1 } { "$([Math]::Round(($_ / 1GB),2)) GB"; break }
            { $_ / 1MB -gt 1 } { "$([Math]::Round(($_ / 1MB),2)) MB"; break }
            { $_ / 1KB -gt 1 } { "$([Math]::Round(($_ / 1KB),2)) KB"; break }
            Default { "$_ Bytes" }
        }
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }

    $Profiles = Get-ChildItem -Path "C:Users"
    $ProfileSizes = $Profiles | ForEach-Object {
        [PSCustomObject]@{
            Name   = $_.BaseName
            Length = Get-ChildItem -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue | Select-Object -Property Sum -ExpandProperty Sum
        }
    }
    $Largest = $ProfileSizes | Sort-Object -Property Length -Descending | Select-Object -First 1

    $Size = $ProfileSizes | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue | Select-Object -Property Sum -ExpandProperty Sum

    $FormattedSize = Format-FileSize -Length $Size

    $AllProfiles = $ProfileSizes | Sort-Object -Property Length -Descending | ForEach-Object {
        $FormattedSizeUser = Format-FileSize -Length $_.Length
        "$($_.Name) $($FormattedSizeUser)"
    }

    Write-Host "All Profiles - $FormattedSize, $($AllProfiles -join ', ')"

    Ninja-Property-Set -Name $CustomField -Value "$AllProfiles"

    if ($Max -and $Max -gt 0) {
        if ($Largest.Length -gt $Max * 1GB) {
            Write-Host "Found profile over the max size of $Max GB."
            Write-Host "$($Largest.Name) profile is $($Largest.Length / 1GB) GB"
            exit 1
        }
    }
    exit 0
}
end {}

 

Acesse mais de 300 scripts no NinjaOne Dojo

Obter acesso

Detalhamento

O script em questão é segmentado nas seguintes seções:

  • Vinculação e parâmetros de cmdlet: O script começa definindo parâmetros, como Max, que define um limite opcional para o tamanho do perfil, e CustomField, que especifica o nome do campo personalizado a ser atualizado.
  • Iniciar seção: Aqui, temos duas funções de utilidade:
    • Test-IsElevated: Verifica se o script é executado com privilégios de administrador.
    • Format-FileSize: Converte bytes em um formato de tamanho de arquivo legível.
  • Seção de Processos:
    • O script verifica se há privilégios de administrador.
    • Em seguida, ele obtém todos os perfis de usuário de “C:Users” e calcula seus tamanhos.
    • Os perfis são classificados e o tamanho total é calculado.
    • Os dados são enviados para o host e a função “Ninja-Property-Set” atualiza o campo personalizado.
    • Se um parâmetro Max for especificado, o script verificará se há perfis que excedem esse tamanho e sairá com um código apropriado.

Casos de uso em potencial

Considere um MSP que supervisiona o armazenamento de um cliente corporativo. De repente, a empresa se depara com restrições de armazenamento. Em vez de optar por upgrades de armazenamento caros, o MSP usa esse script para identificar qualquer perfil de usuário superdimensionado. Munidos desses dados, eles podem entrar em contato com usuários ou departamentos específicos para gerenciar e otimizar melhor o armazenamento.

Comparação

Tradicionalmente, a obtenção de tamanhos cumulativos de perfis de usuários do Windows exigia navegação manual pelas propriedades, aplicativos de terceiros ou scripts complicados. Esse script do PowerShell oferece uma abordagem simplificada, usando as funcionalidades nativas do Windows para fornecer insights precisos e acionáveis.

Implicações

Embora esse script seja imensamente benéfico, se não for utilizado corretamente, pode gerar problemas de privacidade. A extração e o possível compartilhamento de tamanhos de perfis de usuários podem ser vistos como invasivos por alguns usuários. Além disso, para a segurança de TI, compreender os padrões de armazenamento do usuário pode ser uma maneira proativa de detectar picos incomuns nos dados, o que pode indicar malware ou uma possível violação de dados.

Recomendações

  • Sempre execute scripts de diagnóstico fora do horário de pico para evitar possíveis atrasos no sistema.
  • Certifique-se de ter obtido as permissões necessárias e informado as partes interessadas antes da execução.
  • Atualize e mantenha o script regularmente para atender às mudanças nas estruturas e nos requisitos do sistema.

Considerações finais

Uma plataforma de gerenciamento de TI como o NinjaOne pode aumentar significativamente a utilidade desse script, fornecendo aos profissionais de TI uma visão mais holística da integridade, do desempenho e das anomalias do sistema. A integração desses scripts no NinjaOne pode oferecer percepções em tempo real, tornando o gerenciamento de armazenamento uma tarefa fácil.

FAQs

Sim, o script requer privilégios de administrador para ser executado.

O script emitirá uma mensagem indicando qual perfil excede o tamanho e retornará um código de saída 1.

É “TotalUsersProfileSize”.

Próximas etapas

Montar uma equipe de TI eficaz requer uma solução centralizada que seja a principal ferramenta de entrega de serviços. Com NinjaOne, a TI monitora, gerencia, protege e oferece suporte a todos os dispositivos, onde quer que estejam, dispensando infraestrutura complexa no local.

Saiba mais sobre a solução NinjaOne Remote Script Deployment, agende uma demonstração, ou inicie sua avaliação gratuita da plataforma NinjaOne.

Categories:

You might also like