Script d’ouverture de session (Logon Script) en PowerShell

Dans ce article, je vais vous donner un exemple de script d’ouverture de session écrit en PowerShell.

Pourquoi écrire un script en PowerShell d’ouverture de session alors que VBScript fonctionne comment présenter dans les tutoriels suivants :

Pour une raison « simple », le langage vbs ne va plus être pris en charge nativement dans Windows 11 dans l’année 2024, cela sera une fonctionnalité facultative. Resources for deprecated features

A la place, je vous propose ci-après un script PowerShell en alternative pour mapper les lecteurs réseaux et imprimantes en ouverture de session.

<#
    Sample login script with Network Drives mapping and Printer
#>

$NetworkDrives = @{
    "Drive1" = @{
        "letter" = "M"
        "unc" = "\\file-server-1\share-name"
        "memberof" = "GL_SHARE-XX"
    };
    "Drive2" = @{
        "letter" = "N"
        "unc" = "\\file-server-2\share-name"
        "memberof" = ""
    }
}

$NetworkPrinters = @{
    "printer1" = @{
        "unc" = "\\printer-server\printer-share-1"
        "memberof" = ""
    };
    "printer2" = @{
        "unc" = "\\printer-server\printer-share-2"
        "memberof" = "GL_PRINTER-XX"
    }
}

function Test-ADGroupMembership {
    param (
        [string]$GroupName
    )
    
    # Fetch identity information about current user
    $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()

    # Grab group SIDs from the users token
    $groupTokenSIDs = $currentUser.Groups

    # Translate the SID references to account/group names
    $Groups = $groupTokenSIDs |Where-Object { $_.AccountDomainSid } |ForEach-Object { $_.Translate([System.Security.Principal.NTAccount]) }

    # Test if list contains target group
    if($Groups |Where-Object { $_.Value -like "*\$GroupName" }){
        #"$env:USERNAME is a member of $GroupName"
        return $true
    }

    return $false
}

Foreach( $NetworkDrive in $NetworkDrives ){

    Foreach( $Drive in $NetworkDrive.Values ){
        
        if( $Drive["memberof"] -eq ""){
            # Add Drive
            New-PSDrive -Name $Drive["letter"] -Root $Drive["unc"] -Persist -PSProvider FileSystem -Scope Global
        }else{
            $isMember = Test-ADGroupMembership -GroupName $Drive["memberof"]
            if( $isMember ){
                # Add Drive
                New-PSDrive -Name $Drive["letter"] -Root $Drive["unc"] -Persist -PSProvider FileSystem -Scope Global
            }
        }
    }
}

Foreach( $NetworkPrinter in $NetworkPrinters ){

    Foreach( $Printer in $NetworkPrinter.Values ){
        
        if( $Printer["memberof"] -eq ""){
            # Add Printer
            Add-Printer -ConnectionName $Printer["unc"]
        }else{
            $isMember = Test-ADGroupMembership -GroupName $Drive["memberof"]
            if( $isMember ){
                # Add Printer
                Add-Printer -ConnectionName $Printer["unc"]
            }
        }
    }
}

Sinon l’alternative est d’utilisé les stratégies de groupe (GPO) pour faire ces opérations.

Si vous avez d’autre script en VBS, c’est encore le moment d’anticipé leur migration.

Romain Drouche
Architecte Système | MCSE: Core Infrastructure
Expert en infrastructures IT avec plus de 15 ans d’expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d’Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.

Laisser un commentaire