Eu tenho um requisito para executar um script em lote sempre que um sistema for desligado, independentemente de o computador estar conectado à rede ou não. (Não deve importar para a pergunta, mas o script em questão limpa a fila de impressão da máquina.
No entanto, não consigo executar esse script quando o PC está offline da rede, quando uso esse método abaixo.
Devo também acrescentar que o PC em questão está executando o Windows 10 Pro x64 (versão 1809). O controlador de domínio está executando o Windows Server 2008 R2, e também é aqui que eu corro gpedit.msc
.
O que eu fiz até agora:
- Criou um objeto de diretiva de grupo do Active Directory com um script de desligamento da máquina.
- Adicionado o script à pasta GPO no SYSVOL .
- Confirmou-se que este GPO é realmente baixado para o disco rígido da estação de trabalho em questão e, portanto, deve estar acessível offline.
- Os caminhos especificados no GPO são relativos, não absolutos.
O que eu quero que aconteça:
- Quando o PC é desligado, o
ClearPrintQueue.bat
script é executado independentemente de o PC atualmente ter uma conexão de rede ou não.
O que realmente acontece:
- Quando o PC é desligado, o
ClearPrintQueue.bat
script é executado apenas se o PC puder alcançar o compartilhamento SYSVOL na rede.
Detalhes:
O que fiz foi criar um Objeto de Diretiva de Grupo no domínio e vinculá-lo a uma UO de Teste que contém a máquina em questão.
Editei o GPO e naveguei para Configuração do computador -> Políticas -> Configurações do Windows -> Scripts (Inicialização / Desligamento) -> Desligamento
As propriedades de desligamento conforme abaixo:
Ao clicar em Mostrar arquivos ... o explorer abre para revelar a pasta\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown
O conteúdo desta pasta e o arquivo ClearPrintQueue.bat são os seguintes:
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:\>
Ao investigar um PC local, posso descobrir que o script é realmente copiado no repositório GPO local do PC: s:
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 dentro scripts.ini
e ClearPrintQueue.bat
no disco local do 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:\>
Ou seja, o computador tem tudo o que precisa para executar o script de desligamento sem chegar à rede. No entanto, observei que o script não parece ser executado quando falta uma conexão de rede.
Uma investigação mais aprofundada usando uma captura de pacotes e o WireShark parecem provar que o PC de fato retira o script do compartilhamento SYSVOL (por que! Está lá no disco ...) Os carimbos de hora correspondem a quando o computador estava sendo desligado .
Solução possível:
Uma solução possível que ainda não testei envolve a especificação manual do caminho absoluto do script, em C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat
vez de apenas a especificação de ClearPrintQueue.bat
um caminho relativo. Isso parece muito hacky, porém, e não parece ser como "deveria" funcionar. Antes de seguir esse caminho, adoraria ver se alguém tem uma idéia melhor.
Por que estou tentando fazer isso:
Tenho usuários móveis que gostam de imprimir acidentalmente na impressora errada, e esses são colocados na fila localmente em cada estação de trabalho e, subseqüentemente, quando o PC é conectado ao site em que a impressora está, um dilúvio de papel sai da impressora. O software VPN é executado no nível "usuário" e, portanto, o software VPN pode não estar em execução na hora do desligamento.
Estou tentando mitigar isso limpando a fila de impressão no desligamento, para que os trabalhos de impressão antigos não fiquem na fila para sempre.
start -> run -> gpedit.msc
?