El script de apagado no se ejecuta si la estación de trabajo no está conectada a la red

8

Tengo el requisito de ejecutar un script por lotes cada vez que se apaga un sistema, sin importar si la computadora está conectada a la red o no. (No debería importar la pregunta, pero el script en cuestión borra la cola de impresión de la máquina.

Sin embargo, no puedo ejecutar este script cuando la PC está desconectada de la red, cuando uso este método a continuación.

También podría agregar que la PC en cuestión ejecuta Windows 10 Pro x64 (versión 1809). El controlador de dominio ejecuta Windows Server 2008 R2, y aquí también es donde lo ejecuté gpedit.msc.

Lo que he hecho hasta ahora:

  • Creó un objeto de directiva de grupo de Active Directory con un script de apagado de la máquina.
  • Se agregó el script a la carpeta GPO en SYSVOL .
  • Confirmó que este GPO se ha descargado en el disco duro de la estación de trabajo en cuestión y, por lo tanto, debería ser accesible sin conexión.
  • Las rutas especificadas en el GPO son relativas, no absolutas.

Lo que quiero que suceda:

  • Cuando la PC se apaga, el ClearPrintQueue.batscript se ejecuta independientemente de si la PC tiene una conexión de red o no.

Lo que realmente sucede:

  • Cuando la PC se apaga, el ClearPrintQueue.batscript solo se ejecuta si la PC puede alcanzar el recurso compartido SYSVOL en la red.

Detalles:

Lo que he hecho es crear un objeto de directiva de grupo en el dominio y vincularlo a una unidad organizativa de prueba que contiene la máquina en cuestión.

Edité el GPO y navegué a Configuración de la computadora -> Políticas -> Configuración de Windows -> Scripts (inicio / apagado) -> Apagar

Las propiedades de apagado de la siguiente manera:

Propiedades de apagado

Al hacer clic en Mostrar archivos ... el explorador se abre para revelar la carpeta\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown

El contenido de esta carpeta y el archivo ClearPrintQueue.bat son los siguientes:

PS C:\> Get-ChildItem "\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown"


    Directory: \\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019-04-23     15:00             71 ClearPrintQueue.bat


PS C:\> Get-Content "\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat"
net stop spooler
del %systemroot%\System32\spool\printers\* /Q /F /S
PS C:\>

Al investigar una PC local, puedo encontrar que el script está copiado en la tienda de GPO local de la PC:

PS C:\> Get-ChildItem -Recurse -Force -File "C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}"  


    Directory: C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}                            


Mode                LastWriteTime         Length Name                           
----                -------------         ------ ----                           
-a----       2019-04-23     15:00             59 gpt.ini                        


    Directory: C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts            


Mode                LastWriteTime         Length Name                           
----                -------------         ------ ----                           
-a-h--       2019-04-23     15:00            118 scripts.ini                    


    Directory: C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown   


Mode                LastWriteTime         Length Name                           
----                -------------         ------ ----                           
-a----       2019-04-23     15:00             71 ClearPrintQueue.bat            


PS C:\>

Investigando en scripts.iniy ClearPrintQueue.baten el disco local de la PC encontramos:

PS C:\> Get-Content "C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\scripts.ini"                                                                              

[Shutdown]                                                                      
0CmdLine=ClearPrintQueue.bat                                                    
0Parameters=                                                                    
PS C:\> Get-Content "C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat"                                                             
net stop spooler                                                                
del %systemroot%\System32\spool\printers\* /Q /F /S                             
PS C:\>

Es decir, la computadora tiene todo lo que necesita para ejecutar el script de apagado sin llegar a la red. Pero, sin embargo, he observado que el script no parece ejecutarse cuando falta una conexión de red.

Una investigación más exhaustiva utilizando una captura de paquetes y WireShark parece demostrar que la PC de hecho retira el script del recurso compartido SYSVOL (¡por qué! Está justo allí en el disco ...) Las marcas de tiempo corresponden a cuando la computadora se estaba apagando .

Captura de paquetes de Wireshark que muestra cómo el script se extrae del disco en el momento del apagado

Posible solución:

Una posible solución alternativa que aún no he probado implica especificar manualmente la ruta absoluta del script en C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.batlugar de solo especificarla ClearPrintQueue.batcomo una ruta relativa. Sin embargo, esto parece muy hacky, y no parece ser cómo se "debe" trabajar. Antes de seguir esa ruta, me encantaría ver si alguien más tiene una mejor idea.

Por qué incluso estoy tratando de hacer esto:

Tengo usuarios de dispositivos móviles a los que les gusta imprimir accidentalmente en la impresora incorrecta, y que luego se ponen en cola localmente en cada estación de trabajo, y posteriormente cuando la PC está conectada al sitio donde está esa impresora, sale una avalancha de papel de la impresora. El software VPN se ejecuta en el nivel de "usuario" y, por lo tanto, es posible que el software VPN no se ejecute cuando llegue el momento del apagado.

Estoy tratando de mitigar esto limpiando la cola de impresión en el apagado, para que los trabajos de impresión antiguos no permanezcan en la cola para siempre.

Per von Zweigbergk
fuente
¿Qué sucede si agrega este script a las políticas locales ? Por ejemplo start -> run -> gpedit.msc?
Lenniey el
@Lenniey Gracias, pero el uso de políticas locales no es práctico en mi entorno, tengo alrededor de 35 máquinas en las que necesito ejecutar esto.
Per von von Zweigbergk

Respuestas:

9

Es por diseño. Microsoft nunca dijo que las secuencias de comandos de inicio / apagado se ejecutarán cuando la computadora esté fuera de línea.

El caché local que encontró no está allí para el procesamiento fuera de línea, sino para evitar que los clientes abrumen a los controladores de dominio. Puede encontrar más detalles sobre este punto en particular aquí: Protocolo principal de directiva de grupo: caché de la versión de GPO

Además, la Extensión de secuencia de comandos de directiva de grupo requiere que el cliente debe poder validar la fuente de la secuencia de comandos. Y como puede ver en el siguiente diagrama, el servidor GP (controlador de dominio) es el núcleo de la extensión de secuencias de comandos de directiva de grupo:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gpscr/ms-gpscr_files/image001.png

Para resolver su problema, le sugiero que pruebe esto en su lugar:

Crear una tarea programada a través de directivas de grupo Preferencias ( Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks) y crear una New Scheduled Task (at Least Windows 7), configurar la tarea para ejecutarse como System, añadir el siguiente trigger: On disconnect from user session.

Luego, cree otra Preferencia ("Archivo" en lugar de "Tarea programada") para copiar su secuencia de comandos en una ruta local segura en las computadoras (los usuarios no deben poder escribir en este archivo para evitar la escalada de privilegios). Puede usar otra cosa para copiar el archivo si lo desea, pero no olvide hacer referencia a él en la Preferencia de tarea programada.

Swisstone
fuente
3
No tiene que ser una tarea programada, aún puede usar un script de apagado, el script solo necesita estar en el disco local en lugar de estar en el GPO.
Harry Johnston el
2
Gracias por los enlaces, de hecho aclaran por qué la Política de grupo hace lo que hace. Según tengo entendido, esto me dice que de todos modos no hay una buena razón para poner un script dentro de una carpeta de GPO. Ponerlo afuera evita que se copie innecesariamente en cada estación de trabajo, y ponerlo dentro no confiere ningún beneficio. Terminé usando un "Archivo" en GPO para copiar explícitamente el script en la máquina desde un recurso compartido de red, y luego usar una ruta de archivo absoluta para ejecutarlo. No terminé usando una tarea programada. Gracias por el consejo sobre seguridad también.
Per von Zweigbergk