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
Arquitecto de sistemas | MCSE: Infraestructura básica
Experto en infraestructura de TI con más de 15 años de experiencia en el sector. Actualmente, como Gerente de Proyectos de Sistemas y Redes y experto en Seguridad de Sistemas de Información (ISS), utilizo mi experiencia para garantizar la fiabilidad y seguridad de los entornos tecnológicos.

Deja un comentario