Desvendando o histórico de login do usuário com o PowerShell

Os scripts do PowerShell desempenham um papel inestimável nas operações e na segurança de TI, automatizando tarefas e extraindo informações vitais para análise. Hoje, vamos nos aprofundar em um script que permite visualizar o histórico de login do usuário, uma função importante para auditar e monitorar o acesso ao sistema.

Histórico

Os registros de acesso são uma mina de ouro para os profissionais de TI. Eles ajudam a monitorar o uso do sistema, detectar acesso não autorizado e manter a responsabilidade. O script fornecido obtém eventos de início e parada de sessão do usuário, um conjunto de dados essencial para qualquer estratégia robusta de segurança de TI. Ao excluir as contas do sistema e concentrar-se apenas nos usuários genuínos, ele apresenta um histórico limpo e conciso do acesso do usuário, tornando a vida dos profissionais de TI e dos provedores de serviços gerenciados (MSPs) mais simples e eficiente.

O roteiro


#Requires -Version 5.1

<#
.SYNOPSIS
    This will return user session start and stop events.
.DESCRIPTION
    This will return user session start and stop events. Excluding system accounts.
.EXAMPLE
    No params needed
    Returns all login events for all users.
.EXAMPLE
     -UserName "Fred"
    Returns all user login events of the user Fred.
.EXAMPLE
     -Days 7
    Returns the last 7 days of login events for all users.
.EXAMPLE
     -Days 7 -UserName "Fred"
    Returns the last 7 days of login events for the user Fred.
.EXAMPLE
    PS C:> Get-User-Login-History.ps1 -Days 7 -UserName "Fred"
    Returns the last 7 days of login events for the user Fred.
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes:
    Initial Release
.OUTPUTS
    Time                  Event        User  ID
    ----                  -----        ----  --
    10/7/2021 3:51:48 PM  SessionStop  User1 4634
    10/7/2021 3:51:48 PM  SessionStart User1 4624
.COMPONENT
    ManageUsers
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 (
    # Specify one user
    [Parameter(Mandatory = $false)]
    [String]
    $UserName,
    # How far back in days you want to search, this is in 24 hour increments from the time it executes
    [Parameter(Mandatory = $false)]
    [int]
    $Days
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
        { Write-Output $true }
        else
        { Write-Output $false }
    }

    # System accounts that we don't want
    $SystemUsers = @(
        "SYSTEM"
        "NETWORK SERVICE"
        "LOCAL SERVICE"
    )
    # Filter for only getting session start and stop events from Security event log
    $FilterHashtable = @{
        LogName = "Security";
        id      = 4634, 4624
    }
    # If Days was specified then add this parameter
    if ($Days) {
        $FilterHashtable.Add("EndTime", (Get-Date).AddDays(-$Days))
    }
    # Creating a hash table for parameter splatting
    $Splat = @{
        FilterHashtable = $FilterHashtable
    }
}

process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }
    # Get windows events, filter out everything but logins and logouts(Session starts and ends)
    Get-WinEvent @Splat | ForEach-Object {
        # UserName in the two event types are in different places in the Properties array
        if ($_.Id -eq 4634) {
            # Events with ID 4634 the user name is the second item in the array. Arrays start at 0 in PowerShell.
            $User = $_.Properties[1].Value
        }
        else {
            # Events with ID 4634 the user name is the sixth item in the array. Arrays start at 0 in PowerShell.
            $User = $_.Properties[5].Value
        }

        # Filter out system accounts and computer logins(Active Directory related)
        # DWM-0  = Desktop Window Manager
        # UMFD-0 = User Mode Framework Driver
        if ($SystemUsers -notcontains $User -and $User -notlike "DWM-*" -and $User -notlike "UMFD-*" -and $User -notlike "*$") {
            # If the UserName parameter was specified then only return that user's events
            if ($UserName -and $UserName -like $User) {
                # Write out to StandardOutput
                [PSCustomObject]@{
                    Time  = $_.TimeCreated
                    Event = if ($_.Id -eq 4634) { "SessionStop" } else { "SessionStart" }
                    User  = $User
                    ID    = $_.ID
                }
            } # If the UserName parameter was not specified return all users events
            elseif (-not $UserName) {
                # Write out to StandardOutput
                [PSCustomObject]@{
                    Time  = $_.TimeCreated
                    Event = if ($_.Id -eq 4634) { "SessionStop" } else { "SessionStart" }
                    User  = $User
                    ID    = $_.ID
                }
            }
        }
        # Null $User just in case the next loop iteration doesn't set it, we can then see that the user name is missing
        $User = $null
    }
}

end {}

 

Acesse mais de 300 scripts no NinjaOne Dojo

Obter acesso

Detalhamento

  • O script começa com uma série de comentários que descrevem seu uso e formato de saída.
  • Em seguida, ele especifica seus parâmetros, permitindo que o usuário filtre os resultados por nome de usuário ou por um número específico de dias anteriores.
  • No bloco begin, o script estabelece seus requisitos, incluindo a omissão de contas do sistema e a especificação de IDs de eventos relevantes do log de segurança do Windows.
  • O bloco de processo é onde a mágica acontece. Primeiro, ele garante que o script seja executado com privilégios de administrador. Em seguida, ele obtém os eventos do Windows correspondentes às atividades de login e logout, filtrando contas do sistema ou irrelevantes.
  • Para cada evento, ele determina o nome de usuário e se o evento foi um login (SessionStart) ou um logout (SessionStop), gerando esses detalhes.

Casos de uso em potencial

Considere um administrador de TI chamado Alex. Recentemente, houve casos de acesso não autorizado a dados na empresa. Alex decide revisar o histórico de login da última semana. Ao usar esse script com o parâmetro -Days 7, Alex pode obter uma lista abrangente de todos os eventos de acesso do usuário, ajudando-o a identificar qualquer atividade suspeita.

Comparações

Embora existam ferramentas e plataformas dedicadas que oferecem rastreamento da atividade do usuário, muitas delas geralmente estão associadas a conjuntos de software volumosos ou têm um preço elevado. Esse script do PowerShell oferece uma alternativa leve, personalizável e econômica. Além disso, outros métodos podem exigir configurações extensas, enquanto esse script é plug-and-play, exigindo um mínimo de configuração.

Implicações

Conhecer os padrões de acesso dos usuários pode ser uma faca de dois gumes. Embora isso permita que os profissionais de TI mantenham a integridade do sistema, o manuseio incorreto dessas informações pode violar as diretrizes de privacidade. Além disso, o monitoramento persistente pode gerar preocupações quanto à confiança no local de trabalho. Portanto, embora o script seja uma ferramenta poderosa, é essencial usá-lo criteriosamente, aderindo aos padrões éticos e legais.

Recomendações

  • Certifique-se sempre de estar executando a versão mais recente do PowerShell para otimizar o desempenho e a segurança.
  • Documente todas as instâncias em que você utiliza esse script para fins de auditoria.
  • Faça backup regularmente dos seus registros para evitar possíveis perdas de dados.

Considerações finais

O gerenciamento do acesso do usuário é um aspecto crucial da segurança de TI. Esse script do PowerShell oferece uma maneira eficiente de visualizar o histórico de login, auxiliando na detecção e na resposta oportunas a ameaças. Embora o script seja uma solução autônoma, integrá-lo a plataformas como o NinjaOne pode elevar seus recursos, oferecendo uma solução holística de gerenciamento de TI.

O uso do NinjaOne junto com esses scripts pode consolidar o registro, aprimorar os mecanismos de alerta e fornecer um painel unificado para todas as operações de TI, garantindo uma infraestrutura de TI robusta, simplificada e segura.

FAQs

Sim, o acesso aos registros de segurança requer permissões elevadas.

Absolutamente, ajuste o parâmetro -Days (Dias ) para o intervalo desejado.

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.

Categorias:

Recomendados para você

Aprimoramento da comunicação de TI: Domínio das mensagens pop-up do PowerShell

Simplifique a configuração de sua VPN: Configurar uma VPN com o PowerShell

Automatização da criação de atalhos para a área de trabalho remota usando o PowerShell

Como criar uma nova conta de usuário local com o PowerShell

Dominando o gerenciamento de energia do Windows: Um guia do PowerShell para profissionais de TI e MSPs

Como renomear máquinas Windows com o PowerShell

Termos e condições NinjaOne

Ao clicar no botão “Aceito” abaixo, você indica sua aceitação dos seguintes termos legais, bem como dos nossos Termos de Uso:

  • Direitos de propriedade: A NinjaOne é proprietária e continuará a ser proprietária de todos os direitos, títulos e interesses relativos ao script (incluindo os direitos autorais). A NinjaOne está concedendo a você uma licença limitada para usar o script de acordo com os presentes termos legais.
  • Limitação de uso: Você só poderá usar o script para fins comerciais internos ou pessoais legítimos, sendo vedado compartilhar o script com terceiros.
  • Proibição de republicação: Em nenhuma circunstância você tem permissão para republicar o script em qualquer biblioteca de scripts pertencente ou sob o controle de qualquer outro fornecedor de software.
  • Isenção de responsabilidade da garantia: O script é fornecido “no estado em que se encontra” e “conforme disponível”, sem qualquer tipo de garantia. A NinjaOne não promete ou garante que o script estará livre de defeitos ou que atenderá às suas necessidades ou expectativas específicas.
  • Assunção de riscos: O uso do script é por sua própria conta e risco. Você reconhece que há certos riscos inerentes ao uso do script, e você compreende e assume cada um desses riscos.
  • Renúncia e isenção de responsabilidade: Você não responsabilizará a NinjaOne por consequências adversas ou não intencionais resultantes do seu uso do script e renunciará a quaisquer direitos ou tutelas legais que possa ter contra a NinjaOne em relação ao seu uso do script.
  • EULA: Se você for cliente da NinjaOne, o uso do script está sujeito ao Contrato de Licença de Usuário Final aplicável a você (EULA).