Skrip shutdown tidak berjalan jika workstation tidak terhubung ke jaringan

8

Saya memiliki persyaratan untuk menjalankan skrip batch setiap kali sistem dimatikan, tidak peduli apakah komputer terhubung ke jaringan atau tidak. (Seharusnya tidak masalah untuk pertanyaan itu, tetapi skrip yang dimaksud membersihkan antrian cetak mesin.

Namun, saya tidak bisa menjalankan skrip ini ketika PC sedang offline dari jaringan, ketika saya menggunakan metode ini di bawah.

Saya mungkin juga menambahkan bahwa PC tersebut menjalankan Windows 10 Pro x64 (versi 1809). Pengontrol domain menjalankan Windows Server 2008 R2, dan ini juga tempat saya menjalankan gpedit.msc.

Apa yang telah saya lakukan sejauh ini:

  • Membuat objek kebijakan grup direktori aktif dengan skrip shutdown mesin.
  • Menambahkan skrip ke folder GPO di SYSVOL .
  • Dikonfirmasi bahwa GPO ini memang diunduh ke hard disk workstation yang bersangkutan dan karenanya harus dapat diakses secara luring.
  • Jalur yang ditentukan dalam GPO adalah relatif, tidak absolut.

Apa yang saya inginkan terjadi:

  • Ketika PC dimatikan, ClearPrintQueue.batskrip dijalankan terlepas dari apakah PC saat ini memiliki koneksi jaringan atau tidak.

Apa yang sebenarnya terjadi:

  • Ketika PC dimatikan, ClearPrintQueue.batskrip hanya dijalankan jika PC saat ini dapat mencapai berbagi SYSVOL melalui jaringan.

Detail:

Apa yang saya lakukan adalah membuat Objek Kebijakan Grup di domain dan menautkannya ke OU Uji yang berisi mesin yang dimaksud.

Saya mengedit GPO dan menavigasi ke Konfigurasi Komputer -> Kebijakan -> Pengaturan Windows -> Skrip (Startup / Shutdown) -> Shutdown

The Shutdown Properti yang sesuai di bawah ini:

Properti Shutdown

Ketika mengklik pada Tampilkan File ... explorer terbuka untuk mengungkapkan folder\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown

Isi folder ini dan file ClearPrintQueue.bat adalah seperti di bawah ini:

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

Saat menyelidiki PC lokal, saya dapat menemukan bahwa skrip tersebut memang disalin ke PC: toko GPO lokal:

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

Investigasi ke scripts.inidan ClearPrintQueue.batpada disk lokal PC kami temukan:

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

Yaitu komputer memiliki segala yang dibutuhkan untuk benar-benar menjalankan skrip shutdown tanpa menjangkau jaringan. Namun, saya telah mengamati bahwa skrip tampaknya tidak berjalan ketika koneksi jaringan hilang.

Penyelidikan lebih lanjut menggunakan paket capture dan WireShark lebih lanjut tampaknya membuktikan bahwa PC memang menarik skrip dari berbagi SYSVOL (mengapa! Ada di sana pada disk ...) Perangko waktu sesuai dengan ketika komputer sedang dimatikan .

Pengambilan paket Wireshark menunjukkan bagaimana skrip ditarik turun dari disk pada waktu shutdown

Kemungkinan solusi:

Salah satu solusi yang mungkin belum saya uji adalah melibatkan secara manual menentukan path absolut dari skrip C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.batdaripada hanya menentukan ClearPrintQueue.batsebagai path relatif. Tapi ini kelihatannya sangat tidak jelas, dan sepertinya itu tidak dimaksudkan untuk bekerja. Sebelum saya menempuh rute itu, saya ingin melihat apakah ada orang lain yang memiliki ide yang lebih baik.

Mengapa saya mencoba melakukan ini:

Saya memiliki pengguna ponsel yang suka mencetak secara tidak sengaja ke printer yang salah, dan mereka kemudian antri secara lokal di setiap stasiun kerja, dan kemudian ketika PC terhubung ke situs tempat printer itu berada, setumpuk kertas keluar dari printer. Perangkat lunak VPN dijalankan pada level "pengguna", dan dengan demikian perangkat lunak VPN mungkin tidak akan berjalan ketika tiba saatnya untuk dimatikan.

Saya mencoba mengurangi ini dengan membersihkan antrian cetak pada saat shutdown, sehingga pekerjaan cetak kuno tidak duduk dalam antrian selamanya.

Per von Zweigbergk
sumber
Bagaimana jika Anda menambahkan skrip ini ke kebijakan lokal ? Misalnya start -> run -> gpedit.msc?
Lenniey
@Lenniey Terima kasih, tetapi menggunakan kebijakan lokal tidak praktis di lingkungan saya, saya memiliki sekitar 35 mesin yang saya perlukan untuk dijalankan.
Per von Zweigbergk

Jawaban:

9

Ini dengan desain. Microsoft tidak pernah mengatakan bahwa skrip startup / shutdown akan dieksekusi ketika komputer sedang offline.

Tembolok lokal yang Anda temukan tidak ada di sana untuk diproses secara offline, tetapi untuk menghindari bahwa klien membanjiri pengontrol domain. Anda dapat menemukan rincian lebih lanjut tentang titik khusus ini di sini: Protokol Inti Kebijakan Grup: Tembolok dari Versi GPO

Selain itu, Ekstensi Skrip Kebijakan Grup mengharuskan klien harus dapat memvalidasi sumber skrip. Dan seperti yang Anda lihat pada diagram berikut, Server GP (Pengontrol Domain) adalah inti dari Ekstensi Skrip Kebijakan Grup:

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

Untuk menyelesaikan masalah Anda, saya sarankan Anda untuk mencoba ini sebagai gantinya:

Buat Scheduled Task melalui Kebijakan Preferensi Group ( Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks) dan membuat New Scheduled Task (at Least Windows 7), mengkonfigurasi tugas untuk menjalankan sebagai System, menambahkan pemicu berikut: On disconnect from user session.

Kemudian, buat Preferensi lain ("File" alih-alih "Tugas Terjadwal") untuk menyalin skrip Anda di jalur lokal aman di komputer (pengguna tidak dapat menulis dalam file ini untuk menghindari eskalasi hak istimewa). Anda dapat menggunakan sesuatu yang lain untuk menyalin file jika Anda mau, tetapi jangan lupa untuk merujuknya di Preferensi Tugas Terjadwal.

Batu Swis
sumber
3
Tidak harus tugas terjadwal, Anda masih dapat menggunakan skrip shutdown, skrip hanya perlu berada di disk lokal daripada duduk di GPO.
Harry Johnston
2
Terima kasih atas tautannya, mereka memang menjelaskan mengapa Kebijakan Grup melakukan apa yang dilakukannya. Dari pemahaman saya, ini memberitahu saya bahwa tidak ada alasan yang baik untuk memasukkan skrip ke dalam folder GPO. Menempatkannya di luar menghentikannya disalin ke setiap workstation tanpa perlu, dan meletakkannya di dalam tidak memberikan manfaat. Saya akhirnya menggunakan "File" di GPO untuk secara eksplisit menyalin skrip ke mesin dari jaringan berbagi, dan kemudian menggunakan jalur file absolut untuk menjalankannya. Saya tidak menggunakan tugas yang dijadwalkan. Terima kasih atas tipnya tentang keamanan juga.
Per von Zweigbergk