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