Comment surveiller la dernière connexion d’un utilisateur avec PowerShell

Aujourd’hui, nous nous penchons sur un script PowerShell qui permet de surveiller la dernière connexion d’un utilisateur. Dans la gestion moderne de l’informatique, l’une des tâches essentielles consiste à surveiller les comptes d’utilisateurs, en particulier à identifier les comptes dormants. Cette tâche ne se limite pas à la maintenance habituelle. Elle est directement liée à la sécurité, à la conformité et à la gestion efficace des ressources.

Contexte

Le script fourni est conçu pour identifier et signaler les comptes d’utilisateurs en fonction de leur dernière heure de connexion, en particulier ceux qui n’ont pas été utilisés pendant une durée déterminée. Pour les professionnels de l’informatique et les fournisseurs de services gérés (MSP), il est essentiel de s’assurer que les comptes inutilisés sont identifiés et gérés. Les comptes dormants présentent des risques pour la sécurité et deviennent souvent des cibles faciles pour les cybercriminels. De plus, les entreprises soumises à des règles de conformité sont tenues de suivre l’activité des utilisateurs et de désactiver les comptes inutilisés.

Le script

#Requires -Version 5.1

<#
.SYNOPSIS
    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 90 days or a custom amount of days.
.DESCRIPTION
    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 90 days or a custom amount of days.
.EXAMPLE
    No parameters needed.
    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 90 days.
.EXAMPLE
    -IncludeDisabled
    Returns exit code of 1 if any Enabled or Disabled accounts that haven't been logged in over 90 days.
.EXAMPLE
    -Days 60
    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 60 days.
.EXAMPLE
    -Days 60 -IncludeDisabled
    Returns exit code of 1 if any Enabled or Disabled accounts that haven't been logged in over 60 days.
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 7, Windows Server 2012
    Exit code 1: Found users that haven't logged in over X days and are enabled.
    Exit code 2: Calling "net.exe user" or "Get-LocalUser" failed.
    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).
.COMPONENT
    ManageUsers
#>

[CmdletBinding()]
param (
    [Parameter()]
    [int]
    $Days = 90,
    [Parameter()]
    [switch]
    $IncludeDisabled
)

begin {}
process {
    if ($Days -lt 0) {
        # Change negative days to the expected positive days
        $Days = 0 - $Days
    }
    $Accounts = if ($(Get-Command "Get-LocalUser").Name -like "Get-LocalUser") {
        try {
            Get-LocalUser | Select-Object Name, Enabled, SID, LastLogon
        }
        catch {
            exit 2
        }
    }
    else {
        # 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($_)) }
            # 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"
                }
                # Get the Last logon property
                $LastLogon = $(
                    $(
                        $(net.exe user $_) | Where-Object {
                            $_ -like "Last logon*"
                        }
                    ) -split 's+' | Select-Object -Skip 2
                ) -join ' '
                # Get the Password last set property
                $PasswordLastSet = $(
                    $(
                        $(net.exe user $_) | Where-Object {
                            $_ -like "Password last set*"
                        }
                    ) -split 's+' | Select-Object -Skip 3
                ) -join ' '
                # Output Name and Enabled almost like how Get-LocalUser displays it's data
                [PSCustomObject]@{
                    Name      = $_
                    Enabled   = if ($Enabled -like "*Yes*") { $true }else { $false }
                    LastLogon = if ($LastLogon -like "*Never*") { [DateTime]::Parse($PasswordLastSet) } else { [DateTime]::Parse($LastLogon) }
                }
            }
        }
        else {
            exit 2
        }
    }
    $Output = $Accounts | Where-Object {
        if ($IncludeDisabled) {
            $_.LastLogon -lt $(Get-Date).AddDays(0 - $Days)
        }
        else {
            $_.Enabled -and $_.LastLogon -lt $(Get-Date).AddDays(0 - $Days)
        }
    }
    $Output | Out-String | Write-Host
    if ($null -ne $Output) {
        exit 1
    }
}
end {}

 

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

Obtenez l’accès

Description détaillée

Le script commence par définir une durée par défaut de 90 jours pour vérifier l’inactivité. Il utilise ensuite la cmdlet “Get-LocalUser” ou la commande “net.exe user”, en fonction de ce qui est disponible.

  • Si la cmdlet “Get-LocalUser” est présente, elle récupère directement les détails.
  • Si ce n’est pas le cas, il recourt à la commande “net.exe user”. Cette commande récupère les données et analyse ensuite les résultats pour en extraire les détails nécessaires.

La première démarche consiste à vérifier si la dernière date de connexion de chaque utilisateur est supérieure au seuil défini. Si une correspondance est trouvée, elle est affichée et le script se termine avec un code de 1. Un code de sortie de 2 est utilisé pour les exceptions lors de l’extraction des données de l’utilisateur.

Cas d’utilisation potentiels

Imaginez Jane, informaticienne dans une entreprise de taille moyenne. Récemment, l’entreprise a été confrontée à une faille de sécurité mineure. Après l’incident, Jane a été chargée de renforcer la sécurité. L’une des suggestions était de vérifier régulièrement les comptes inactifs et de les désactiver. À l’aide de ce script, elle peut mettre en place une routine mensuelle pour récupérer une liste de ces comptes, garantissant ainsi que le répertoire des utilisateurs de l’entreprise reste actif et sécurisé.

Comparaisons

Bien que le script utilise PowerShell, une autre approche pourrait consister à interroger directement l’Active Directory (s’il est disponible) pour obtenir des informations sur les comptes d’utilisateurs. Des outils comme ADManager Plus ou même Active Directory Users and Computers (ADUC) peuvent être utilisés. Cependant, notre script offre une alternative légère, personnalisable et gratuite.

FAQ

  • Que faire si je veux vérifier une durée d’inactivité différente ?
    Vous pouvez personnaliser le paramètre $Days.
  • Le script peut-il identifier les comptes activés et désactivés ?
    Oui, en utilisant l’option -IncludeDisabled, le script peut récupérer les comptes activés et désactivés.

Implications

Au-delà de l’identification des comptes dormants, ce script a un impact plus vaste sur la sécurité informatique. Les comptes inactifs peuvent être facilement compromis et donner lieu à un accès non autorisé. Des contrôles périodiques de l’inactivité des utilisateurs et des mesures appropriées peuvent prévenir les violations potentielles.

Recommandations

  • Testez toujours le script dans un environnement bac à sable (sandbox) avant de le déployer dans un environnement réel.
  • Planifiez l’exécution périodique de ce script afin d’assurer une surveillance continue.
  • En cas d’identification de comptes dormants, prenez les mesures appropriées, telles que la désactivation du compte ou la notification à l’utilisateur ou à son responsable.

Conclusion

Tandis que ce script constitue une solution efficace, l’intégration d’outils tels que NinjaOne permet d’améliorer encore les capacités, en rendant les tâches plus automatisées et en fournissant un tableau de bord centralisé pour la gestion. Des outils tels que NinjaOne sont conçus pour gérer efficacement ces tâches, ce qui permet aux professionnels de l’informatique comme Jane de se concentrer sur des tâches plus stratégiques, en utilisant des scripts tels que celui présenté ci-dessus.

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)).