Comment voir l’historique des connexions d’un utilisateur avec PowerShell

Les scripts PowerShell jouent un rôle inestimable dans les opérations et la sécurité informatiques, en automatisant des tâches et en extrayant des informations vitales à des fins d’analyse. Aujourd’hui, nous allons nous pencher sur un script qui vous permet d’afficher l’historique des connexions des utilisateurs, une fonction importante pour l’audit et le contrôle de l’accès au système.

Contexte

Les journaux d’accès sont une mine d’or pour les professionnels de l’informatique. Ils permettent de surveiller l’utilisation du système, de détecter les accès non autorisés et d’assurer la responsabilité. Le script fourni récupère les événements de démarrage et d’arrêt de la session de l’utilisateur, un ensemble de données essentiel pour toute stratégie de sécurité informatique solide. En excluant les comptes système et en se concentrant uniquement sur les utilisateurs authentiques, il présente un historique clair et concis des accès des utilisateurs, ce qui simplifie la vie des professionnels de l’informatique et des fournisseurs de services gérés (MSP) et les rend plus efficaces.

Le script

#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 {}

 

Accédez à plus de 700 scripts dans le Dojo NinjaOne

Obtenez l’accès

Description détaillée

  • Le script commence par une série de commentaires décrivant son utilisation et le format de sortie.
  • Il spécifie ensuite ses paramètres, permettant à l’utilisateur de filtrer les résultats par nom d’utilisateur ou par un nombre spécifique de jours écoulés.
  • Dans le bloc “begin”, le script définit ses exigences, notamment l’omission des comptes système et la spécification des identifiants d’événements pertinents du journal de sécurité Windows.
  • C’est dans le bloc “processus” que la magie opère. Tout d’abord, il s’assure que le script est exécuté avec des droits d’administrateur. Il récupère ensuite les fenêtres correspondant aux activités de connexion et de déconnexion, en filtrant les comptes système ou non pertinents.
  • Pour chaque événement, il détermine le nom d’utilisateur et s’il s’agit d’une connexion (SessionStart) ou d’une déconnexion (SessionStop).

Cas d’utilisation potentiels

Prenons l’exemple d’un administrateur informatique nommé Alex. Récemment, il y a eu des cas d’accès non autorisé à des données dans l’entreprise. Alex décide de passer en revue l’historique des connexions au cours de la semaine écoulée. En utilisant ce script avec le paramètre -Days 7, Alex peut obtenir une liste complète de tous les événements d’accès des utilisateurs, ce qui l’aide à repérer toute activité suspecte.

Comparaisons

Bien qu’il existe des outils et des plateformes dédiés au suivi de l’activité des utilisateurs, nombre d’entre eux sont souvent associés à des suites logicielles encombrantes ou ont un prix élevé. Ce script PowerShell offre une alternative légère, personnalisable et économique. De plus, d’autres méthodes peuvent nécessiter des configurations étendues, alors que ce script est prêt à l’emploi et ne nécessite qu’une configuration minimale.

FAQ

  • Est-il nécessaire d’exécuter le script avec des droits d’administrateur ?
    Oui, l’accès aux journaux de sécurité nécessite des autorisations élevées.
  • Puis-je récupérer des journaux datant de plus d’un mois ?
    Oui, réglez le paramètre -Days sur la valeur souhaitée.

Implications

Connaître les schémas d’accès des utilisateurs peut être une arme à double tranchant. Bien qu’elles permettent aux professionnels de l’informatique de maintenir l’intégrité du système, une mauvaise manipulation de ces informations pourrait enfreindre les directives en matière de protection de la vie privée. De plus, une surveillance persistante peut susciter des inquiétudes quant à la confiance sur le lieu de travail. Ainsi, si le script est un outil puissant, il est essentiel de l’utiliser judicieusement, en respectant les normes éthiques et juridiques.

Recommandations

  • Assurez-vous toujours que vous utilisez la dernière version de PowerShell pour des performances et une sécurité optimales.
  • Documentez tous les cas où vous utilisez ce script à des fins d’audit.
  • Sauvegardez régulièrement vos journaux pour éviter toute perte potentielle de données.

Conclusion

La gestion de l’accès des utilisateurs est un aspect crucial de la sécurité informatique. Ce script PowerShell offre un moyen efficace de consulter l’historique des connexions, ce qui permet de détecter les menaces et d’y répondre rapidement. Bien que le script soit une solution autonome, son intégration à des plateformes telles que NinjaOne peut accroître ses capacités et offrir une solution complète de gestion informatique.

L’utilisation de NinjaOne avec de tels scripts permet de consolider la journalisation, d’améliorer les mécanismes d’alerte et de fournir un tableau de bord unifié pour toutes les opérations informatiques, garantissant ainsi une infrastructure informatique performante, optimisée et sécurisée.

Pour aller plus loin

Pour créer une équipe informatique efficace et performante, il est essentiel d'avoir une solution centralisée qui joue le rôle de nœud principal pour vos services. NinjaOne permet aux équipes informatiques de surveiller, gérer, sécuriser et prendre en charge tous les appareils, où qu'ils soient, sans avoir besoin d'une infrastructure complexe sur site. Pour en savoir plus sur NinjaOne Endpoint Management, participez à une visite guidée, ou profitez d'un essai gratuit de la plateforme NinjaOne.

Catégories :

Vous pourriez aussi aimer

×

Voir NinjaOne en action !

En soumettant ce formulaire, j'accepte la politique de confidentialité de NinjaOne.

Termes et conditions NinjaOne

En cliquant sur le bouton “J’accepte” ci-dessous, vous indiquez que vous acceptez les termes juridiques suivants ainsi que nos conditions d’utilisation:

  • Droits de propriété: NinjaOne possède et continuera de posséder tous les droits, titres et intérêts relatifs au script (y compris les droits d’auteur). NinjaOne vous accorde une licence limitée pour l’utilisation du script conformément à ces conditions légales.
  • Limitation de l’utilisation: Les scripts ne peuvent être utilisés qu’à des fins personnelles ou professionnelles internes légitimes et ne peuvent être partagés avec d’autres entités.
  • Interdiction de publication: Vous n’êtes en aucun cas autorisé à publier le script dans une bibliothèque de scripts appartenant à, ou sous le contrôle d’un autre fournisseur de logiciels.
  • Clause de non-responsabilité: Le texte est fourni “tel quel” et “tel que disponible”, sans garantie d’aucune sorte. NinjaOne ne promet ni ne garantit que le script sera exempt de défauts ou qu’il répondra à vos besoins ou attentes particulières.
  • Acceptation des risques: L’utilisation du script est sous votre propre responsabilité. Vous reconnaissez qu’il existe certains risques inhérents à l’utilisation du script, et vous comprenez et assumez chacun de ces risques.
  • Renonciation et exonération de responsabilité: Vous ne tiendrez pas NinjaOne pour responsable des conséquences négatives ou involontaires résultant de votre utilisation du script, et vous renoncez à tout droit ou recours légal ou équitable que vous pourriez avoir contre NinjaOne en rapport avec votre utilisation du script.
  • EULA: Si vous êtes un client de NinjaOne, votre utilisation du script est soumise au contrat de licence d’utilisateur final qui vous est applicable (End User License Agreement (EULA)).