Lo script di spegnimento non viene eseguito se la workstation non è connessa alla rete


8

Ho l'obbligo di eseguire uno script batch ogni volta che un sistema viene spento, indipendentemente dal fatto che il computer sia connesso o meno alla rete. (Non dovrebbe importare per la domanda, ma lo script in questione cancella la coda di stampa della macchina.

Tuttavia, non riesco a far funzionare questo script quando il PC è offline dalla rete, quando utilizzo questo metodo di seguito.

Potrei anche aggiungere che il PC in questione esegue Windows 10 Pro x64 (versione 1809). Il controller di dominio esegue Windows Server 2008 R2, ed è anche qui che ho eseguito gpedit.msc.

Quello che ho fatto finora:

  • Creato un oggetto Criteri di gruppo di Active Directory con uno script di spegnimento del computer.
  • Aggiunto lo script alla cartella GPO su SYSVOL .
  • Confermato che questo oggetto Criteri di gruppo viene effettivamente scaricato sul disco rigido della workstation in questione e deve pertanto essere accessibile offline.
  • I percorsi specificati nell'oggetto Criteri di gruppo sono relativi, non assoluti.

Quello che voglio succedere:

  • Quando il PC viene spento, lo ClearPrintQueue.batscript viene eseguito indipendentemente dal fatto che il PC abbia attualmente una connessione di rete o meno.

Cosa succede realmente:

  • Quando il PC viene spento, lo ClearPrintQueue.batscript viene eseguito solo se il PC può attualmente raggiungere la condivisione SYSVOL sulla rete.

Dettagli:

Quello che ho fatto è creare un oggetto Criteri di gruppo nel dominio e collegarlo a un'unità organizzativa di prova che contiene la macchina in questione.

Ho modificato l'oggetto Criteri di gruppo e sono passato a Configurazione computer -> Criteri -> Impostazioni di Windows -> Script (Avvio / Arresto) -> Arresto

Le proprietà di spegnimento come di seguito:

Proprietà di spegnimento

Quando si fa clic su Mostra file ... l'esploratore si apre per rivelare la cartella\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown

I contenuti di questa cartella e del file ClearPrintQueue.bat sono i seguenti:

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:\>

Quando indaga su un PC locale, trovo che lo script sia effettivamente copiato nel PC: s GPO store locale:

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:\>

Indagando sul scripts.inie ClearPrintQueue.batsul disco locale del PC troviamo:

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:\>

Vale a dire che il computer ha tutto il necessario per eseguire effettivamente lo script di spegnimento senza raggiungere la rete. Tuttavia, ho osservato che lo script non sembra funzionare quando manca una connessione di rete.

Ulteriori indagini con l'acquisizione di pacchetti e WireShark sembrano ulteriormente dimostrare che il PC effettivamente estrae lo script dalla condivisione SYSVOL (perché! È proprio lì sul disco ...) I timestamp corrispondono a quando il computer veniva spento .

Acquisizione di pacchetti di Wireshark che mostra come lo script viene rimosso dal disco al momento dell'arresto

Possibile soluzione alternativa:

Una possibile soluzione alternativa che non ho ancora testato riguarda la specifica manuale del percorso assoluto dello script C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.batanziché la specifica ClearPrintQueue.batcome percorso relativo. Questo sembra molto confuso, e non sembra essere il modo in cui "intende" funzionare. Prima di percorrere questa strada mi piacerebbe vedere se qualcun altro ha un'idea migliore.

Perché sto anche provando a fare questo:

Ho utenti mobili a cui piace stampare accidentalmente sulla stampante sbagliata, e questi vengono quindi messi in coda localmente su ogni workstation e, successivamente, quando il PC è collegato al sito in cui si trova quella stampante, dalla stampante esce un diluvio di carta. Il software VPN viene eseguito a livello di "utente", pertanto è possibile che il software VPN non sia in esecuzione quando è il momento dello spegnimento.

Sto cercando di mitigarlo cancellando la coda di stampa allo spegnimento, in modo che i lavori di stampa antichi non restino in coda per sempre.


Cosa succede se si aggiunge questo script alle politiche locali ? Ad esempio start -> run -> gpedit.msc?
Lenniey,

@Lenniey Grazie, ma l'utilizzo delle politiche locali non è pratico nel mio ambiente, ho circa 35 macchine su cui ho bisogno per farlo funzionare.
Per von Zweigbergk,

Risposte:


9

È di progettazione. Microsoft non ha mai detto che gli script di avvio / arresto verranno eseguiti quando il computer è offline.

La cache locale che hai trovato non è lì per l'elaborazione offline, ma per evitare che i client sovraccarichino i controller di dominio. Puoi trovare maggiori dettagli su questo particolare punto qui: Protocollo Core Criteri di gruppo: cache della versione dell'oggetto Criteri di gruppo

Inoltre, l' estensione dello script di criteri di gruppo richiede che il client sia in grado di convalidare l'origine dello script. E come puoi vedere nel diagramma seguente, GP Server (controller di dominio) è il nucleo dell'estensione degli script di criteri di gruppo:

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

Per risolvere il tuo problema, ti suggerisco di provare questo:

Creare un'operazione pianificata tramite criteri di gruppo Preferenze ( Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks) e creare una New Scheduled Task (at Least Windows 7), configurare l'attività per l'esecuzione come System, aggiungere il seguente trigger: On disconnect from user session.

Quindi, creare un'altra preferenza ("File" anziché "Attività pianificata") per copiare lo script in un percorso locale protetto sui computer (gli utenti non devono essere in grado di scrivere in questo file per evitare l'escalation dei privilegi). Se lo desideri, puoi utilizzare qualcos'altro per copiare il file, ma non dimenticare di fare riferimento a Preferenza attività pianificata.


3
Non deve essere un'attività pianificata, è comunque possibile utilizzare uno script di arresto, lo script deve solo trovarsi sul disco locale anziché essere nell'oggetto Criteri di gruppo.
Harry Johnston,

2
Grazie per i collegamenti, in effetti chiariscono perché i Criteri di gruppo fanno ciò che fa. Da quanto ho capito, questo mi dice che non c'è alcun buon motivo per mettere comunque uno script all'interno di una cartella GPO. Metterlo all'esterno impedisce di copiarlo inutilmente su ciascuna workstation e inserirlo all'interno non conferisce alcun vantaggio. Ho finito per usare un "File" nell'oggetto Criteri di gruppo per copiare esplicitamente lo script sulla macchina da una condivisione di rete e quindi utilizzare un percorso file assoluto per eseguirlo. Non ho finito per usare un'attività pianificata. Grazie anche per il suggerimento sulla sicurezza.
Per von Zweigbergk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.