O script de desligamento não é executado se a estação de trabalho não estiver conectada à rede

8

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.batscript é 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.batscript é 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:

Propriedades de desligamento

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.inie ClearPrintQueue.batno 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 .

Captura de pacotes Wireshark mostrando como o script é retirado do disco no momento do desligamento

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.batvez de apenas a especificação de ClearPrintQueue.batum 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.

Per von Zweigbergk
fonte
E se você adicionar esse script às políticas locais ? Por exemplo start -> run -> gpedit.msc?
Lenniey
@Lenniey Obrigado, mas o uso de políticas locais não é prático no meu ambiente, tenho cerca de 35 máquinas nas quais preciso que funcione.
Por von Zweigbergk,

Respostas:

9

É por design. A Microsoft nunca disse que os scripts de inicialização / desligamento serão executados quando o computador estiver offline.

O cache local que você encontrou não existe para processamento offline, mas para evitar que os clientes sobrecarreguem os controladores de domínio. Você pode encontrar mais detalhes sobre esse ponto específico aqui: Protocolo Principal da Diretiva de Grupo: Cache da versão do GPO

Além disso, a extensão de script de diretiva de grupo exige que o cliente possa validar a fonte do script. E como você pode ver no diagrama a seguir, o servidor GP (controlador de domínio) é o núcleo da extensão de scripts de diretiva de grupo:

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

Para resolver seu problema, sugiro que tente isso:

Criar uma tarefa agendada através de políticas de grupo Preferences ( Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks) e criar um New Scheduled Task (at Least Windows 7), configurar a tarefa para ser executada como System, adicione o seguinte gatilho: On disconnect from user session.

Em seguida, crie outra preferência ("Arquivo" em vez de "Tarefa agendada") para copiar seu script em um caminho local seguro nos computadores (os usuários não devem poder escrever nesse arquivo para evitar a escalada de privilégios). Você pode usar outra coisa para copiar o arquivo, se desejar, mas não se esqueça de referenciá-lo na Preferência de tarefa agendada.

Swisstone
fonte
3
Ele não precisa ser uma tarefa agendada; você ainda pode usar um script de desligamento; o script só precisa estar no disco local em vez de estar no GPO.
Harry Johnston
2
Obrigado pelos links, eles de fato explicam por que a Diretiva de Grupo faz o que faz. Pelo meu entendimento, isso me diz que não há um bom motivo para colocar um script dentro de uma pasta GPO de qualquer maneira. Colocá-lo fora impede que ele seja copiado desnecessariamente em cada estação de trabalho e colocá-lo dentro não confere benefícios. Acabei usando um "Arquivo" no GPO para copiar explicitamente o script na máquina a partir de um compartilhamento de rede e, em seguida, usei um caminho de arquivo absoluto para executá-lo. Eu não acabei usando uma tarefa agendada. Obrigado pela dica sobre segurança também.
Por Von Zweigbergk,