En los últimos años Microsoft, en sus sistemas para servidores, parece haberse dado cuenta que encadenar todo la administración a una interfaz gráfica plagada de opciones no es la mejor solución para automatizar las operaciones más comunes.
Uno de los últimos intentos ha sido la inclusión de una interfaz de comandos llamada powershell. Para aquellos que vengan del mundo Unix no será nada revolucionado, e incluso puede ser frustrante cuando intentan usarla porque ha sido hecha al mejor estilo Microsoft: Un tipo de letra horrible, un autocompletar demente y una integración entre las diversas partes un tanto dudosas.
Para terminar de potenciar la interfaz han incluido un lenguaje de programación, de nuevo al estilo de los sistemas Unix, que permita automatizar las operaciones más comunes. Hemos visto en esta página algunos ejemplos sobre como usarlo.
El problema es que Microsoft tiene una capacidad innata para convertir en basura casi todas las buenas ideas que pasan por sus manos, y esto no es más que el siguiente hito en el camino. El sistema no es compatible entre diferentes versiones, hay demasiadas formas de hacer las cosas, y dependiendo desde donde lo ejecutes puedes obtener resultados distintos.
Creación automatizada de directorios y asignación de permisos desde línea de comandos para una lista de usuarios:
Un ejemplo típico de la utilidad de las herramientas de administración mediante consola es la siguiente: Imaginemos que nos han pasado una lista con cien usuarios, y ha sido redactada de la siguiente forma:
-
Usuario1
Usuario2
Usuario3
Y que queremos, en uno de nuestros servidores, crear un directorio a modo de repositorio con el nombre de casa usuario en el que sólo tenga permiso de acceso dicho usuario.
Desde la interfaz gráfica deberíamos situarnos en el directorio, crear un directorio, ir a las propiedades del mismo y asignar los permisos. Son cien usuarios, pues eso mismo cien veces.
Los permisos se pueden asignar desde la interfaz gráfica, como hemos dicho en el punto anterior, o bien recurrir a la herramienta icacls desde la línea de comandos:
PS C:\> icacls directorio /remove \"Usuarios del dominio"
#Damos permiso total (full control) al usuario:
PS C:\> icacls directorio /grant usuario:F
Sin embargo, aun teniendo la herramienta icacls, el crear los directorios uno por uno y asignar los permisos uno a uno es una tarea farragosa e ingrata. Lo ideal sería poder recorrer la lista anterior y, para cada usuario, crear un directorio, borrar los permisos para todo el mundo y agregar los del usuario.
Para hacerlo con el lenguaje de programación de powershell necesitaríamos una manera de ejecutar un comando externo, algo que seguramente exista, pero de todas las opciones probadas no he logrado que funcione ninguna (seguramente por culpa mía, claro)
Al final la opción más sencilla resulto hacer un programa en python y ejecutar los comandos desde allí.
import os
from subprocess import call
def ensure_dir( d ):
if not os.path.exists(d):
print ("creando directorio %s") % ( d )
os.makedirs(d)
#------------------------------------
if(len(sys.argv) > 1):
fichero = sys.argv[1]
print "Abriendo " + fichero
f = open( fichero, "r" )
for line in f:
datos = line.strip ()
if ( len ( datos )> 3 ):
print ("---%s--") % (datos)
dir = ".\\" + datos
print dir
ensure_dir ( dir )
cmd = "icacls " + datos + " /remove \"Usuarios del dominio\""
os.system( cmd )
cmd = "icacls " + datos + " /remove Everyone"
os.system ( cmd )
cmd = "icacls " + datos + " /grant " + datos + ":F"
os.system ( cmd )
f.close()
else:
print "Debes indicar el nombre del archivo"
El programa se encarga de abrir el fichero, recorrer cada línea, crear un directorio con ese nombre y asignar los permisos correspondientes. EL truco es que el nombre de usuario se llama exactamente igual que el directorio.

