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: Core Infrastructure

Experto en infraestructuras de TI con más de 15 años de experiencia sobre el terreno. Actualmente, como jefe de proyectos de sistemas y redes y referente en seguridad de los sistemas de información (SSI), pongo mi experiencia al servicio de la fiabilidad y la seguridad de los entornos tecnológicos.

GHinM▶