Cambiar permisos en shares con RMTSHARE + Powershell

Es posible que necesites migrar recursos compartidos de un servidor a otro porque se ha quedado corto de espacio.
Es posible que durante la migración quieras dejar compartidos los shares antiguos como solo lectura y es posible que se trate de tal numero de shares que necesites encontrar la manera de automatizarlo.

Con la utilidad RMTSHARE (disponible en el Resource Kit de NT4) y un poco de Powershell podemos automatizar el proceso.

Vamos a dar por hecho que tenemos un listado con los shares a modificar
$servidor="AE1345"
$shares=get-content("shares.txt")
Recorremos todos los shares y recogemos el listado de permisos actual para cada share.
foreach ($share in $shares)
{
write-host $share
#recogemos los permisos actuales
$val=rmtshare \\$servidor\$share
#sigue...




Como es un comando de linea de comandos y no un cmdlet, el recuperar el dato concreto de permisos es bastante artesanal.
$count=0
    foreach ($v in $val){if ($v -eq "Permissions:"){break}else{$count++}} #posicion de Permissions,5
    for ($i=-2;$val[$i] -ne $val[$count];$i--) #-1 = The command completed successfully
    {
    $campo=$val[$i].split(":")
    $perm=$campo[0].trim()
    write-host "$($val[$i]) -> $perm"
#sigue...
Es decir, la linea The command completed successfully es la -1 asi que recorremos hacia arriba la -2, -3, -4 etc hasta llegar a la linea Permissions y para cada una de esas lineas volvemos a ejecutar rmtshare con el parametro /GRANT <usuario>:READ para establecer permisos de lectura para el usuario/grupo que hemos recuperado con el comando anterior.
#cambio los permisos del share a solo lectura
    rmtshare \\$servidor\$share /GRANT "$perm":READ
    }#fin de listado de permisos por share
}#fin foreach shares
Aqui esta el Script completo:
$servidor="AE1345"
$shares="Compras","Sistemas","Finanzas","Desarrollo","Direccion"
foreach ($share in $shares)
{
write-host $share
#recogemos los permisos actuales
$val=rmtshare \\$servidor\$share
$count=0
    foreach ($v in $val){if ($v -eq "Permissions:"){break}else{$count++}} #posicion de Permissions,5
    for ($i=-2;$val[$i] -ne $val[$count];$i--) #-1 = The command completed successfully
    {
    $campo=$val[$i].split(":")
    $perm=$campo[0].trim()
    write-host "$($val[$i]) -> $perm"
    #cambio los permisos del share a solo lectura
    rmtshare \\$servidor\$share /GRANT "$perm":READ
    }#fin de listado de permisos por share

}#fin foreach shares

Comentarios