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.bat
script 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.bat
script 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:
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.ini
y ClearPrintQueue.bat
en 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 .
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.bat
lugar de solo especificarla ClearPrintQueue.bat
como 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.
fuente
start -> run -> gpedit.msc
?Respuestas:
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:
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 unaNew Scheduled Task (at Least Windows 7)
, configurar la tarea para ejecutarse comoSystem
, 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.
fuente