permission only mir maintain vbscript active-directory robocopy active-directory-group

only - Vbscript: crear un script que refleje varios conjuntos de carpetas



robocopy ntfs security (2)

Eliminar archivos viejos en el cliente

Aquí hay una secuencia de comandos que elimina los archivos en el directorio de la plantilla, la máquina del usuario no está presente en uno de los grupos de archivos copiados. Para mayor claridad, el código está al final de esta respuesta. Aquí se explica cómo usar el script en su solución actual que no usa /MIR .

En el código para cada grupo copiado, agregue una llamada de método adicional a ''ListFiles'' - esto rastrea los archivos copiados desde el servidor:

If User is MemberOf (group3) Then RoboCopy.exe //fileserver/templates/group3/ c:/templates/workgroup *.* /E /XO ListFiles("//fileserver/templates/group3/", userTemplates) End if

Haga esto por cada grupo copiado. (Está bien si la misma plantilla aparece en más de un grupo).

Después de que se hayan copiado todos los grupos, agregue este bloque de código:

ListFiles "c:/templates/workgroup", toDelete removeAllFrom toDelete, userTemplates

Esto enumera todos los archivos en la carpeta de plantillas locales del usuario para toDelete . Todos los archivos que acaba de copiar se eliminan de ese conjunto, dejando solo los archivos que no se copiaron del servidor. A continuación, podemos imprimir los archivos para eliminar y luego eliminarlos.

echoDictionary "deleting old user templates", toDelete '' deleteFiles c:/templates/workgroup", toDelete

La llamada a deleteFiles comentó: ¡probablemente sea mejor hacer una prueba primero! El primer argumento para eliminar archivos es el directorio de plantillas del usuario; no debe tener una barra inclinada.

Con estos cambios en su lugar, se eliminarán todos los archivos en la carpeta de plantillas en la máquina de los usuarios que no se copiaron del servidor, lo que proporciona una sincronización efectiva entre varios directorios.

Ahora viene el guion. El primer bloque se puede pegar en la parte superior de su archivo, y el resto en la parte inferior, para ayudar a evitar el desorden.

// script to remove files not present on one of the group folders on the fileserver Set fs = CreateObject("Scripting.FileSystemObject") Set userTemplates = CreateObject("Scripting.Dictionary") userTemplates.CompareMode = 1 Set toDelete = CreateObject("Scripting.Dictionary") toDelete.CompareMode = 1 -- under here are just procedures so they can go at -- the bottom of your script if desired Sub deleteFiles(basedir, dictionary) for each key in dictionary.Keys fs.DeleteFile(basedir+"/"+key) next End Sub Sub echoDictionary(msg, dictionary) for each key in dictionary.Keys Wscript.Echo msg & ": " & key next End Sub Sub removeAllFrom(target, toRemove) for each key in toRemove.Keys if target.Exists(key) then target.remove key end if next End Sub Sub ListFiles(folderName, dictionary) Set folder = fs.GetFolder(folderName) ListSubFolders folder, "", dictionary End Sub Sub ListSubFolders(folder, prefix, dictionary) Set files = folder.Files For Each file in files qualifiedName = prefix & file.Name dictionary.add qualifiedName, file Next For Each Subfolder in Folder.SubFolders qualifiedName = prefix+Subfolder.Name & "/" ListSubFolders Subfolder, qualifiedName, dictionary dictionary.add qualifiedName, Subfolder Next End Sub

Ok, este es mi problema. Estoy haciendo un inicio de sesión que básicamente copia las plantillas de Microsoft Word desde un servidor en una ruta local de cada computadora. Esto se hace usando un cheque para membresía grupal.

If MemberOf(ObjGroupDict, "g_group1") Then oShell.Run "%comspec% /c %LOGONSERVER%/SYSVOL/mydomain.com/scripts/ROBOCOPY //server/Templates/Group1/OFFICE2003/ " & TemplateFolder & "/" & " * /E /XO", 0, True End If

Previamente utilicé el modificador / MIR de robocopy, que es excelente. Pero, si un usuario es miembro de más de un grupo, el modificador / MIR elimina el contenido del primer grupo, ya que refleja el contenido del segundo grupo. Es decir, no puedo tener ambos contenidos.

Esto se "resuelve" al no usar el modificador / MIR y simplemente dejar que el contenido se copie de todos modos. PERO la idea de tener las plantillas en un servidor es para poder controlar el contenido que los usuarios reciben a través del script. Entonces, si elimino un archivo o una carpeta de la ruta del servidor, esto no se replica en la computadora local. Como ya no uso el modificador / MIR. Comprende?

¿Entonces qué hago? Hice un pequeño script que, básicamente, comprueba las carpetas y archivos y luego los elimina en consecuencia, pero en realidad terminó siendo la misma funcionalidad que el modificador / MIR de todos modos. ¿Cómo resuelvo este problema?

Editar: descubrí que lo que realmente necesito es una rutina que escanee mi carpeta de plantillas local para buscar archivos y carpetas y compruebe si existe la misma estructura en cualquiera de las carpetas de plantillas de origen.

Las carpetas de plantilla del servidor están configuradas así:

//fileserver/templates/group1/ //fileserver/templates/group2/ //fileserver/templates/group3/ //fileserver/templates/group4/ //fileserver/templates/group5/ //fileserver/templates/group6/

Y el script que hace la copia es estructuras como esta (pseudo):

If User is MemberOf (group1) Then RoboCopy.exe //fileserver/templates/group1/ c:/templates/workgroup *.* /E /XO End if If User is MemberOf (group2) Then RoboCopy.exe //fileserver/templates/group2/ c:/templates/workgroup *.* /E /XO End if If User is MemberOf (group3) Then RoboCopy.exe //fileserver/templates/group3/ c:/templates/workgroup *.* /E /XO End if

Etc, etc. Con el modificador / E, me aseguro de que también copie las subcarpetas. Y el modificador / XO solo copia archivos y carpetas que son más nuevos que los de mi ruta local. Pero no considera si la ruta local contiene archivos o carpetas que no existen en la ruta de la plantilla del servidor.

Entonces, después de que se realiza la copia, me gustaría verificar si alguno de los archivos o carpetas en mi c: / templates / workgroup existe realmente en cualquiera de las fuentes. Y si no lo hacen, elimínelos de mi ruta local. Algo que podría combinarse en estas evaluaciones de miembros quizás?


Usando una tabla de búsqueda

Sugeriría un enfoque que coloque todas las plantillas en un directorio de servidor de archivos común y use una tabla de búsqueda para asignar plantillas a grupos.

El beneficio sería que sus plantillas estarían garantizadas para estar sincronizadas; es decir, no tiene que preocuparse de que una plantilla para el grupo A, B y C sea realmente igual en todas las carpetas específicas del grupo en su servidor de archivos.

Otra ventaja es una tabla de configuración mantenible que le permite asignar plantillas a grupos sin la necesidad de realizar cambios en su secuencia de comandos de inicio de sesión.

El archivo de configuración de la tabla de búsqueda se vería como

group1;/templateA.dot;/templateA.dot group2;/B/templateB.dot;/B/templateB.dot group3;/B/C/templateC.dot;/templateC.dot

con la columna 1 que enumera los nombres de su grupo AD; la columna 2 la ruta fuente y la columna 3 la ruta destino. Esto también permitiría aplanar su carpeta de plantilla en el lado del cliente.

En cualquier caso, puede evitar tener que mantener múltiples copias de todas sus plantillas en su servidor de archivos y agregar más grupos o plantillas no requiere tocar su secuencia de comandos de inicio de sesión sino simplemente el archivo de configuración.

En su secuencia de comandos de inicio de sesión puede iterar sobre todas las líneas y copiar las que tienen grupos coincidentes

Código de script de inicio de sesión

open lookup table config file For Each line In lookup table If MemberOf(ObjGroupDict, groupname_column_value) Then execute Robocopy templatename_column_value local_target End If Next