O PowerShell é uma ferramenta potente no arsenal dos profissionais de TI, muitas vezes aproveitada por sua capacidade de automatizar tarefas e extrair dados sem problemas. Uma tarefa crítica frequentemente encontrada pelos provedores de serviços gerenciados (MSPs) e administradores de sistemas é listar os usuários em um sistema de computador. Hoje, vamos nos aprofundar em um script do PowerShell criado especificamente para isso: listar usuários locais.
Histórico
Não há como negar que, no atual ambiente de TI de ritmo acelerado, a capacidade de extrair rapidamente dados sobre os usuários do sistema é inestimável. Isso é particularmente verdadeiro em grandes empresas ou sempre que um novo equipamento ou software estiver sendo implementado. Os administradores de sistemas e MSPs geralmente precisam entender quem tem acesso a quê e quando. O script do PowerShell fornecido atende a essa necessidade, listando os usuários locais em uma máquina Windows, permitindo que os profissionais obtenham insights rapidamente.
O roteiro
#Requires -Version 2.0
<#
.SYNOPSIS
Lists local computers' users.
.DESCRIPTION
Lists local computers' users. By default it lists only the enabled users.
.EXAMPLE
No parameters needed.
Lists enabled users on the local computer.
.EXAMPLE
-AllUsers
Lists enabled and disabled users on the local computer.
.EXAMPLE
PS C:> List-Users.ps1 -AllUsers
Lists enabled and disabled users on the local computer.
.OUTPUTS
System.Management.Automation.SecurityAccountsManager.LocalUser[]
.NOTES
Minimum OS Architecture Supported: Windows 7, Windows Server 2012
Release Notes:
Initial Release
.COMPONENT
ManageUsers
#>
[CmdletBinding()]
param (
# Will return disabled users as well as enabled users
[Switch]
$AllUsers
)
begin {
Write-Output "Starting List Users"
}
process {
# If we are running powershell under a 32bit OS or running a 32bit version of powershell
# or we don't have access to Get-LocalUser
if (
[Environment]::Is64BitProcess -ne [Environment]::Is64BitOperatingSystem -or
(Get-Command -Name "Get-LocalUser" -ErrorAction SilentlyContinue).Count -eq 0
) {
# Get users from net.exe user
$Data = $(net.exe user) | Select-Object -Skip 4
# Check if the command ran the way we wanted and the exit code is 0
if ($($Data | Select-Object -last 2 | Select-Object -First 1) -like "*The command completed successfully.*" -and $LASTEXITCODE -eq 0) {
# Process the output and get only the users
$Users = $Data[0..($Data.Count - 3)] -split 's+' | Where-Object { -not $([String]::IsNullOrEmpty($_) -or [String]::IsNullOrWhiteSpace($_)) }
# Loop through each user
$Users | ForEach-Object {
# Get the Account active property look for a Yes
$Enabled = $(net.exe user $_) | Where-Object {
$_ -like "Account active*" -and
$($_ -split 's+' | Select-Object -Last 1) -like "Yes"
}
# Output Name and Enabled almost like how Get-LocalUser displays it's data
[PSCustomObject]@{
Name = $_
Enabled = if ($Enabled -like "*Yes*") { $true }else { $false }
}
} | Where-Object { if ($AllUsers) { $_.Enabled }else { $true } }
}
else {
exit 1
}
}
else {
try {
if ($AllUsers) {
Get-LocalUser
}
else {
Get-LocalUser | Where-Object { $_.Enabled -eq $true }
}
}
catch {
Write-Error $_
exit 1
}
}
}
end {
Write-Output "Completed List Users"
}
Acesse mais de 300 scripts no NinjaOne Dojo
Detalhamento
Em sua essência, o roteiro é bastante simples. Ele começa definindo um parâmetro, $AllUsers, que, quando invocado, inclui usuários habilitados e desabilitados em sua saída. No bloco ‘process’, o script primeiro verifica a arquitetura do sistema e a disponibilidade do cmdlet Get-LocalUser. Se houver uma incompatibilidade ou se o cmdlet não estiver disponível, ele voltará a usar o comando legado net.exe user. Os dados derivados de qualquer um dos métodos são processados para listar os usuários. Quando o comando net.exe user é utilizado, o script obtém o status do usuário, verificando se cada conta está ativa. Em seguida, ele gera esses dados de forma estruturada. Em cenários em que Get-LocalUser está disponível, ele busca e lista os usuários diretamente, filtrando apenas os habilitados, a menos que o parâmetro $AllUsers seja invocado.
Casos de uso em potencial
Imagine uma profissional de TI, Jane, implementando uma nova atualização de software em sua empresa. Antes de implementar a atualização, ela precisa verificar as contas de usuário em cada máquina para garantir que todas as licenças de software sejam atribuídas corretamente. Em vez de verificar manualmente cada computador, ela utiliza o script do PowerShell, economizando horas de seu valioso tempo.
Comparações
Embora o script utilize o cmdlet Get-LocalUser sempre que possível, sua abordagem alternativa usando o usuário net.exe é uma referência aos sistemas legados. Alguns outros scripts podem depender exclusivamente de cmdlets ou métodos mais recentes. A abordagem dupla do script fornecido garante a compatibilidade com uma ampla gama de sistemas Windows, tornando-o versátil em diversos ambientes.
Implicações
Uma lista de usuários em um computador pode fornecer uma visão geral dos possíveis pontos de acesso para pessoas não autorizadas. No contexto da segurança de TI, entender esses usuários e seus status é uma etapa fundamental para garantir que somente indivíduos autorizados tenham acesso.
Recomendações
- Atualize regularmente seu PowerShell para ter acesso aos cmdlets mais recentes.
- Sempre execute scripts de fontes confiáveis para garantir a segurança do sistema.
- Audite regularmente as listas de usuários para garantir que contas não autorizadas não tenham sido adicionadas.
Considerações finais
O NinjaOne, com suas soluções robustas de gerenciamento de TI, complementa ferramentas como esse script do PowerShell. Quando os profissionais de TI listam os usuários locais usando nosso script do PowerShell, eles podem utilizar a plataforma abrangente da NinjaOne para gerenciar, monitorar e proteger esses usuários, garantindo que a infraestrutura de TI permaneça otimizada e segura.