viernes, 5 de noviembre de 2010

Mapeos unidades de red

PowerShell incluye varios cmdlet para la gestión de unidades ya sean locales o de red. son los cmdlets con nombre PSDrive y verbos Get, New y Remove. El problema de estos cmdlets es que solo actúan en las sesiones de PowerShell, es decir, si creamos un mapeo de red desde PowerShell con el cmdlet New-Psdrive, la unidad mapeada solo es visible en la consola de PowerShell, y no en el explorador de Windows, por ejemplo. Por lo que tenemos que hacer uso de objetos COM para el mapeo correcto de las unidades de red.

El siguiente ejemplo mapea unidades de red a un usuario basándose en la pertenencia a determinados grupos:

#Función que mapea la unidad de red.

function mapear_unidad([string]$unidad, [string]$ruta)
{
$net = New-Object -com WScript.Network;
$unidades=$net.EnumNetworkDrives();
if ($unidades -like $unidad) { $net.removenetworkdrive($unidad,$true)}
$net.mapnetworkdrive($unidad,$ruta)
}


#Obtenemos el usuario que inicia la sesión.

$usuario = $env:username
$filtro = "(&(objectCategory=User)(samAccountName=$usuario))"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.Filter = $filtro
$objPath = $objSearcher.FindOne()
$objUser = $objPath.GetDirectoryEntry()

#Obtenemos los grupos a los que pertenece.
$groups=$objUser.memberOf

#Los grupos están en formato LDAP, vamos a quedarnos con el nombre CN

function new-array {,$args}
$groupCN= new-array
foreach($i in $groups)
{ $groupCN+=($i.split(",")[0]).split("=")[1] }

#Mapeo de unidad personal
$carpetausuario=$objUser.sAMAccountName
mapear_unidad -unidad "K:" -ruta "\\Servidor\Personales\$carpetausuario"


#Mapeo de unidades de grupo

foreach ($group in $groupCN)
{

switch ($group)
{

Grupo1 { mapear_unidad -unidad "T:" -ruta "\\Servidor\CarpetaGrupo1" }
Grupo2 { mapear_unidad -unidad "M:" -ruta "\\Servidor\CarpetaGrupo2" }
default {"No hay mapeos para el grupo $group"}
}
}

No hay comentarios:

Publicar un comentario