Ejemplo de script (en aplicación de consola Delphi 6) que crea una carpeta de perfil del usuario, copia los accesos directos de un origen dado y crea un acceso directo en el escritorio del usuario para esta carpeta de perfil. Agregamos una directiva de seguridad en el AD DS (Active Directory Domain Services) de Windows Server para que ejecute el script en el inicio de sesión del usuario. Creamos un filtro WMI y lo aplicamos a la directiva para que sólo se ejecute en determinados servidores.
- Código fuente en Delphi 6 de la aplicación de consola.
- Agregar directiva de seguridad GPO en AC DC para que se ejecute el script anterior al iniciar la sesión los usuarios.
- Aplicar filtro WMI a directiva GPO para que sólo se aplique en determinados servidores.
- Resultado de ejecución del script en el escritorio del usuario.
Código fuente en Delphi 6 de la aplicación de consola
A continuación mostramos el código fuente completo de la aplicación de consola (Console Applitacion), desarrollada en Borland Delphi 6:
Que realiza las siguientes acciones:
- Crea la carpeta de perfil del usuario en la ruta indicada del servidor. Para ello obtiene el nombre de usuario que ha iniciado sesión.
- Copia el contenido de la carpeta «origen» indicada a la carpeta de perfil del usuario creada anteriormente.
- Crea el acceso directo a la carpeta del perfil en el escritorio del usuario.
- Registra un log de acceso del usuario en un fichero .ini, guardando el último servidor al que se ha conectado el usuario, las veces que se ha conectado, la fecha de último acceso. También almacenará los servideores a los que se ha conectado el usuario y el número de veces a cada servidor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
program AccesosDirectosTS; {$APPTYPE CONSOLE} uses SysUtils, windows, shellapi, inifiles, ShlObj, ActiveX, ComObj; //Obtiene una variable de entorno function obtenerVariableEntorno (variable : string) : String; var Env : PChar; valorVariable : string; begin Result := ''; Env := GetEnvironmentStrings; While Env^ <> #0 do begin valorVariable := StrPas(Env); if Pos (variable, valorVariable) = 1 then begin Result := copy (valorVariable, length(variable) + 1, length(valorVariable)); exit; end; Inc(Env, StrLen(Env) + 1); end; end; //Obtener ruta de carpetas especiales de Windows function obtenerRutaCarpetasSistema (Folder: Integer; ForceDir: Boolean): string; var Path: array [0..255] of char; begin SHGetSpecialFolderPath(0, @Path[0], Folder, ForceDir); Result := Path; end; //Crear acceso directo procedure crearAccesoDirecto (const rutaObjeto, rutaEnlace, descripcion, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin CoInitialize(nil); IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(descripcion)); SetPath(PChar(rutaObjeto)); end; PFile.Save(PWChar(WideString(rutaEnlace)), FALSE); end; var rutaPerfil : string; nombreUsuario, servidorTS, equipoCliente : string; perfilUsuarioEnServidorTS : string; rutaEscritorioUsuario : string; rutaAccesoDirecto : string; sh: TSHFileOpStruct; rutaRaiz : string; numConexiones : integer; //Para crear acceso directo IObject : IUnknown; ISLink : IShellLink; IPFile : IPersistFile; PIDL : PItemIDList; InFolder : array[0..MAX_PATH] of Char; TargetName : String; LinkName : WideString; const docLog = '\\servidor\admin\log\ts\accesos_ts.ini'; begin //Creamos la carpeta \\servidor\perfiles\x si no existe para //accesos directos de los servidores de Escritorio Remoto try nombreUsuario := obtenerVariableEntorno ('USERNAME='); servidorTS := obtenerVariableEntorno('COMPUTERNAME='); equipoCliente := obtenerVariableEntorno ('CLIENTNAME='); perfilUsuarioEnServidorTS := obtenerVariableEntorno ('USERPROFILE='); rutaRaiz := '\\servidor\perfiles\copiar\'; rutaPerfil := '\\servidor\perfiles\' + nombreUsuario; //Si no existe la carpeta de perfil la creamos if not DirectoryExists (rutaPerfil) then MkDir(rutaPerfil); //Copiamos los archivos de carpeta_raiz a carpeta_perfil if DirectoryExists (rutaPerfil) then begin sh.wFunc := FO_COPY; sh.pFrom := PChar(rutaRaiz + '*.*' + #0); sh.pTo := PChar(rutaPerfil + #0); sh.fFlags := FOF_SILENT or FOF_MULTIDESTFILES; sh.fFlags := sh.fFlags or FOF_NOERRORUI; sh.fFlags := sh.fFlags or FOF_NOCONFIRMATION; ShFileOperation(sh); end; //Obtenemos la carpeta del escritorio del usuario rutaEscritorioUsuario := obtenerRutaCarpetasSistema(CSIDL_DESKTOP, False); rutaAccesoDirecto := IncludeTrailingPathDelimiter(rutaEscritorioUsuario) + 'Accesos directos.lnk'; //Si no existe el acceso directo en el escritorio del servidor TS para el usuario lo creamos if not FileExists(rutaAccesoDirecto) then crearAccesoDirecto (rutaPerfil, rutaAccesoDirecto, 'Accesos directos', ''); //Registramos un log para saber que se está ejecutando el script with tinifile.create (docLog) do try WriteString (nombreUsuario, 'Último acceso', DateTimeToStr(now)); WriteString (nombreUsuario, 'Equipo cliente', equipoCliente); //Obtenemos el número de conexiones al servidor TS actual numConexiones := ReadInteger (nombreUsuario, servidorTS, 0); //Guardamos las conexiones más una WriteInteger (nombreUsuario, servidorTS, numConexiones + 1); //Obtenemos el número de conexiones total del usuario a los TS numConexiones := ReadInteger (nombreUsuario, 'Conexiones total', 0); //Guardamos las conexiones totales más una WriteInteger (nombreUsuario, 'Conexiones total', numConexiones + 1); finally free; end; except //silenciosa end; end. |
Compilaremos la aplicación anterior, que nos generará el ejecutable AccesosDirectosTS.exe:
Agregar directiva de seguridad GPO en AC DC para que se ejecute el script anterior al iniciar la sesión los usuarios
La finalidad del script anterior es para que se le cree al usuario un acceso directo a la carpeta del perfil con los accesos directos a las aplicación de la organización. Este proceso se realizará cuando el usuario inicie sesión en alguno de los servidores de Escritorio Remoto (antiguo Terminal Server) de Windows. Por ello crearemos una directiva GPO para que ejecute el script anterior AccesosDirectosTS.exe cuando el usuario inicie sesión.
En primer lugar copiaremos el fichero de script generado anteriormente AccesosDirectosTS.exe en la carpeta del dominio donde Microsoft recomienda colocar los scripts:
\\proyectoa.local\SysVol\proyectoa.local\Policies{68604133-2257-4EDD-AC50-523512A20A56}\User\Scripts\Logon
Esta carpeta, que puede variar según el dominio, se abre al agregar un nuevo script en la directiva. Copiaremos en esta carpeta (o en cualquier otra que consideremos) el fichero ejecutable anterior.
Nos aseguraremos de que los usuarios tienen permiso, al menos de lectura/ejecución en la carpeta y fichero anterior.
Para crear la directiva, accederemos a alguno de los controladores de dominio y abriremos «Administración de directivas de grupo». Pulsaremos con el botón derecho del ratón sobre «Objetos de directiva de grupo» y elegiremos «Nuevo»
Introduciremos el nombre para la directiva GPO, por ejemplo «AccesosDirectos»:
Pulsaremos con el botón derecho del ratón sobre la directiva creada «AccesosDirectos» y elegiremos «Editar»:
Accederemos a la rama de «Configuración de usuario» [1], a «Directivas» [2], a «Configuración de Windows» [3] y pulsaremos en «Scripts (inicio de sesión o cierre de sesión)» [4]. Pulsaremos con el botón derecho del ratón sobre «Iniciar sesión» y pulsaremos en «Propiedades» [4]:
En la pestaña «Scripts» pulsaremos en «Agregar»:
Pulsaremos en «Examinar»:
Buscaremos la carpeta donde hemos copiado el script AccesosDirectosTS.exe y seleccionaremos el fichero ejecutable:
Pulsaremos «Aceptar». Desde esta ventana podremos pasarle algún parámetro, si el script lo requiere:
Pulsaremos «Aceptar» para guardar el script que se ejecutará al iniciar la sesión el usuario:
Tras crear la directiva, el último paso será vincularla a los usuarios a los que queramos que se les ejecute. Para ello seleccionaremos la Unidad Organizativa de los usuarios a los que queramos aplicar la directiva. Pulsaremos con el botón derecho del ratón sobre la Unidad Organizativa y elegiremos «Vincular un GPO existente…»:
Seleccionaremos la directiva creada «AccesosDirectos»:
Y quedará con vínculo habilitado, de forma que en cuanto un usuario inicie sesión en el equipo se ejecutará el script y hará sus funciones:
Para el caso de la finalidad de este script, sólo queremos que se ejecute en el inicio de sesión de determinados servidores. Por ello deberemos aplicar un filtro WMI a la directiva, como explicamos en el siguiente punto.
Aplicar filtro WMI a directiva GPO para que sólo se aplique en determinados servidores
Para que la directiva anterior sólo se aplique a los servidores con nombre SRV1, SRV2 y SRV3, y con sistema operativo Windows Server, crearemos un filtro WMI, pulsando con el botón derecho del ratón sobre «Filtros WMI» y eligiendo «Nuevo…»:
Introduciremos el nombre para el filtro WMI, por ejemplo «Servidores_Escritorio_Remoto» y pulsaremos en «Agregar»:
Introduciremos la siguiente consulta WMI:
1 2 3 |
Select ProductType, csname FROM Win32_OperatingSystem WHERE ProductType != "1" AND (csname = 'SRV1' or csname = 'SRV2' or csname = 'SRV3') |
Y pulsaremos «Aceptar»:
Guardaremos el filtro WMI:
Y lo aplicaremos a la directiva creada anteriormente. Seleccionaremos la directiva [1] y pulsaremos en el desplegable de Filtrado WMI [2]:
Elegiremos el filtro WMI creado:
Pulsaremos «Sí» en el mensaje de confirmación de cambio de filtro WMI para la directiva:
De esta forma la directiva sólo se aplicará en los equipos que cumplan el filtro WMI.
Resultado de ejecución del script en el escritorio del usuario
Cuando el usuario haya iniciado sesión en los servidores que cumplen el criterio del filtro WMI, se le creará, de forma automática, un acceso directo en su escritorio llamado «Accesos directos» que apunta a su carpeta de accesos directos, también creada por el script:
El acceso directo creado apuntará a la carpeta establecida en el script para el usuario: \\servidor\perfiles\nombre_usuario:
El script, además, habrá creado/actualizado el fichero de log de accesos: