Script de inicio de sesión de PowerShell

En este artículo, voy a mostraros un ejemplo de script de inicio de sesión escrito en PowerShell.

¿Por qué escribir un script de inicio de sesión en PowerShell cuando VBScript funciona tal y como se muestra en los siguientes tutoriales:

Por una razón «simple»: el lenguaje VBS dejará de ser compatible de forma nativa con Windows 11 en el año 2024, pasando a ser una funcionalidad opcional. Recursos para funciones obsoletas

En su lugar, a continuación les propongo un script de PowerShell como alternativa para asignar unidades de red e impresoras al iniciar sesión.

<#
    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"]
            }
        }
    }
}

De lo contrario, la alternativa es utilizar las políticas de grupo (GPO) para realizar estas operaciones.

Si tienes otros scripts en VBS, aún estás a tiempo de planificar su migración.

Romain Drouche

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.

GHinM▶