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.bat
script 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.bat
script 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:
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.ini
e ClearPrintQueue.bat
sul 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 .
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.bat
anziché la specifica ClearPrintQueue.bat
come 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.
start -> run -> gpedit.msc
?