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.
fonte
start -> run -> gpedit.msc
?Respostas:
É 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:
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 umNew Scheduled Task (at Least Windows 7)
, configurar a tarefa para ser executada comoSystem
, 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.
fonte