ابحث في خدمات Windows لديك، وعاين كل تغيير، واعرف ما الذي انحرف منذ أمس

Better Windows Services هو services.msc بعد إعادة بنائه لمن يديرون أجهزة Windows: نافذة وسطر أوامر يعملان على محرك واحد. اسأل الجهاز سؤالًا بدل التمرير عبر 800 صف. وشاهد ما سيفعله أي تغيير قبل أن تضغط أي شيء. والجزء الذي لم يكن في services.msc قط: جمّد كل الخدمات في ملف، وبعد أسبوع اسأل عمّا تغيّر.

  • مجاني ومفتوح المصدر، GPL-3.0
  • ملف واحد، أو برنامج تثبيت
  • لا حاجة إلى صلاحيات المسؤول للاطلاع
  • لا يتصل بالإنترنت أبدًا
النافذة وقد حُدّد فيها خمسة عناصر، وظهرت فوق القائمة خطة تشغيلها: خمس خطوات، وملاحظة بأن اثنين منها في تلك الحالة أصلًا، وسطر bws start لكل عنصر، وزر Start 5 entries.
عناصر محددة، وخطة تُعرض قبل أن يحدث أي شيء، وسطر bws الذي يطلب الأمر نفسه تمامًا. البرنامج يتحدث الإنجليزية: تقرأ النافذة ملف لغة يوضع بجانبها، فالترجمة ممكنة دون إعادة بناء.
نصف دقيقة معه

كيف يبدو أثناء الاستخدام

جلسة حقيقية على نظام Windows مثبّت باللغة البولندية. الأسماء المعروضة تأتي من Windows فهي بلغته. أما النافذة نفسها فتتحدث الإنجليزية.

أربعة عناصر محددة وخطة تشغيلها، وإعادة تشغيل قسرية للخدمة Local Session Manager تحذّر خطتها من أن الجهاز لا يعمل بدونها وتطلب اسمها قبل أن يعمل الزر، والأسئلة المقترحة تحت مربع البحث الفارغ، وخدمة Print Spooler وقد عُثر عليها بكتابة جزء من اسمها ثم شُغّلت.
أربعة عناصر محددة وخطة تشغيلها، وإعادة تشغيل قسرية تطلب اسم خدمة يحتاجها الجهاز، والأسئلة تحت مربع البحث الفارغ، وخدمة Print Spooler وقد عُثر عليها بالكتابة ثم شُغّلت.
شاشة البداية: ثلاث بطاقات أرقام عن هذا الجهاز، هي الخدمات العاملة، والخدمات المضبوطة على البدء التلقائي ولم تبدأ، والخدمات المضبوطة على البدء التلقائي وملفها غير موجود، وزر Show the list.
تُفتح على بضعة أرقام عن هذا الجهاز. كل رقم سؤال: انقر عليه فينتقل السؤال إلى مربع البحث.
قائمة الخدمات مع ثلاث قوائم فوق مربع البحث، ومربع بحث فارغ، وأزرار التصفية مفتوحة في صفوف للحالة ونوع بدء التشغيل والتوقيع والتعارضات والمشغّلات، والقائمة أسفلها.
أزرار التصفية تكتب في مربع البحث، فما نقرت عليه هو استعلام يمكنك قراءته وتعديله.
لماذا وُجد هذا

services.msc لم يتغير تقريبًا منذ Windows 2000

يقضي المسؤولون فيه ساعات كل أسبوع وهم يصطدمون بالجدران نفسها.

  • لا بحث. التنقل الوحيد هو القفز إلى الحرف الأول من الاسم المعروض.
  • لا تصفية. لا توجد طريقة لتسأل أرني ما هو مضبوط على البدء التلقائي ولا يعمل.
  • صف واحد في كل مرة. إعادة تشغيل 12 خدمة تعني 12 نقرة يمينية و12 انتظارًا.
  • «Stopping...» إلى الأبد، ولا مخرج إلا Task Manager وتخمين العملية.
  • لا سجل تاريخي. لا أحد يعرف من ضبط نوع بدء التشغيل على Disabled، أو متى.
  • بيانات مخفية. العملية والمشغّلات والامتيازات ومن وقّع الملف التنفيذي، ومعها security descriptor، كل ذلك يحتاج إلى sc.exe من الذاكرة، أو إلى السجل.
  • لا تكافؤ في سطر الأوامر. لغة sc.exe تعود إلى التسعينيات، والأمر Get-Service الذي يأتي مع Windows، في Windows PowerShell 5.1، لا يعرض الحساب الذي تعمل به الخدمة فضلًا عن وصفها. أما PowerShell 7 فيعرض الاثنين، ويُثبَّت بشكل منفصل.

كل أداة أخرى تعالج جزءًا منه

يعرض Process Hacker و System Informer قائمة غنية ويمكنهما إنهاء العملية قسرًا، لكن لا تدقيق فيهما ولا سطر أوامر. أما sc.exe وPsService فيستطيعان كل شيء ولا يخبرانك بشيء. وأوامر *-Service في PowerShell قابلة للبرمجة لكنها سطحية.

لا أحد يجمع بين قائمة قابلة للبحث، ومعاينة قبل كل تغيير، وسجل لما تغيّر عبر الزمن. وهذا السجل هو سبب إبقاء هذه الأداة على الجهاز بعد أول ظهيرة.

المقارنة الكاملة
ماذا يفعل

نافذة وسطر أوامر على محرك واحد

اسأل بدل أن تمرّر

start:auto !status:running تعني ما يجب أن يعمل ولا يعمل. لغة واحدة، في مربع البحث وفي bws list --query، مع اقتراح الحقول أثناء الكتابة.

اعرض الخطة قبل أن يحدث أي شيء

كل إيقاف وبدء وإعادة تشغيل وتغيير لنوع بدء التشغيل يُعاين مع الخدمات التي يوقفها معه، والمعاينة هي ما يُنفَّذ.

يخبرك بما انحرف ومن غيّره

الأمر bws snapshot create يجمّد الجهاز في ملف، والأمر bws snapshot diff يقول ما تغيّر منذئذٍ، فيفصل التكوين عمّا بدأ أو توقف فحسب. والأمر bws history يقول من غيّر نوع بدء التشغيل ومن ثبّت خدمة، من سجل System. وتؤدي النافذة الأعمال الثلاثة كلها تحت Audit....

أصلح مشكلة شائعة بضغطة واحدة

تبويب Tools والأمر bws tool fix يعيدان تشغيل الخدمة الواقفة خلف طابعة لا تطبع أو صوت اختفى أو بحث عالق، مع ما يعتمد عليها، عبر الخطة نفسها التي يمر بها كل شيء آخر.

أوقف خدمة لا تتوقف

يطلب منها بلطف أولًا ولا ينهي العملية إلا إذا فشل ذلك، مسمّيًا كل خدمة أخرى تعيش فيها.

أظهر ما يخفيه services.msc

من وقّع الملف التنفيذي وهل يثق به Windows، والمشغّلات، والامتيازات، وكذلك security descriptor، والعملية وذاكرتها. أعمدةً، وأشياء يمكن البحث بها.

أبلغ عندما يتعذر عليه قراءة شيء

الحقل الذي تعذرت قراءته يُبلَّغ عنه على أنه لم يُقرأ ولا يُعرض فارغًا أبدًا. واللقطة المأخوذة بلا صلاحيات المسؤول تقول ذلك داخل الملف.

يتكامل مع السكربتات

الخيار --json في كل أمر، ورمز خروج لكل نهاية، والرمز 5 عندما تجد المقارنة انحرافًا.

يعمل من ملف واحد ودون اتصال

فك الضغط عن الملف وشغّله، أو ثبّته لكل الجهاز. لا حاجة إلى تثبيت .NET ولا يتصل بالإنترنت أبدًا. القراءة لا تحتاج إلى صلاحيات المسؤول. GPL-3.0.

الجزء الذي لم يفعله services.msc قط

ما الذي تغيّر منذ أمس

اللقطة هي الجهاز كله في لحظة واحدة: كل خدمة وبرنامج تشغيل، مع نوع بدء التشغيل والحساب ومسار التشغيل، وقيمة التجزئة لملفها وموقّعه، وتبعياتها ومشغّلاتها وامتيازاتها، إضافةً إلى security descriptor الخاص بها. وهي JSON بحقل واحد في كل سطر، فتدخل مستودعًا ويقرؤها git diff.

$ bws snapshot diff before.json --live --exit-code
Changed (2):
  Spooler  Print Spooler
    startType: Manual -> Automatic
    status: Stopped -> Running  (running state, not configuration)
  wlidsvc  Microsoft Account Sign-in Assistant
    status: Stopped -> Running  (running state, not configuration)

Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
  • يُبلَّغ عن التكوين وحالة التشغيل كلٌّ على حدة. لقطتان بينهما يوم تختلفان فيما يعمل مصادفةً، وما من ذلك انحراف تقريبًا. السطر الذي يجب قراءته هو نوع بدء التشغيل الذي تغيّر.
  • ما تعذرت مقارنته يُسرد ولا يُخفى. الحقل الذي لم تقرأه إحدى اللقطتين قط يظهر على أنه لم تتم مقارنته، فالمقارنة التي تقول لم يتغير شيء تعني أنه لم يتغير شيء فيما استطاع الطرفان رؤيته.
  • الخيار --exit-code ينتهي بالرمز 5 عندما يختلف التكوين، فتستطيع مهمة مجدولة أن تأخذ لقطة عند النشر وتنبّه أحدًا في أول ليلة ينحرف فيها الجهاز.
  • جهازان، ملفان. خذ لقطة على بيئة التجهيز وأخرى على بيئة الإنتاج وقارن بينهما في أي مكان.
كيف تعمل اللقطات والانحراف
لا شيء يحدث دون خطة

المعاينة هي التنفيذ

كل عملية تكتب تبني خطة أولًا، وهذه الخطة نفسها هي المعاينة، وتسلسل الخدمات التابعة، والرفض قبل أن تضغط أي شيء، وسطر الأوامر الذي يطلب الأمر نفسه، وطريق العودة بعد ذلك.

$ bws stop Winmgmt --dry-run --dependents
Plan: stop Winmgmt  (2 steps)
  1. stop  vmms      (would break otherwise)
  2. stop  Winmgmt   (asked for)

Warnings:
  - Stopping Winmgmt also stops one other entry: vmms
  - Winmgmt starts automatically, so it will be back after the next restart.
  • شغّله دون --dry-run فتكون هذه هي الخطوات، بهذا الترتيب، وبجانبها الأسباب نفسها. لا يوجد مسار برمجي ثانٍ للتنفيذ الفعلي.
  • ما يسقط معه موجود في الخطة. الخدمات التي ستتعطل خطوات قائمة بذاتها، والخطة التي ستوقف شيئًا يحتاجه الجهاز تقول ذلك في تحذيراتها.
  • الرفض يسبق الزر. برنامج تشغيل، أو خدمة لا يقبل المدير طلب إيقافها، أو عملية يحميها النظام: يُرفض ذلك عند بناء الخطة مع بيان السبب. وتُظهر النافذة الزر باهتًا وتذكر السبب بجانبه.
  • الإيقاف القسري خطوتان، والثانية مشروطة. يطلب bws kill من الخدمة أن تتوقف ولا ينهي عمليتها إلا إذا لم ينجح ذلك، مسمّيًا كل خدمة أخرى تعيش فيها.
عندما لا تتوقف الخدمة
دقيقتان معه

من سطر الأوامر

المحرك نفسه الذي تعمل به النافذة، للسكربتات والمهام المجدولة وCI. البيانات تذهب إلى الإخراج القياسي وكل ما عداها إلى الخطأ القياسي، فيعمل bws list --json | jq ولا يصل تحذير إلى JSON أبدًا.

bws list --query "start:auto !status:running"     ما يجب أن يعمل ولا يعمل
bws list --query "file:missing"                   الخدمات التي اختفى ملفها التنفيذي
bws list --query "signed:no peruser:no"           غير الموقّعة، دون نسخ الجلسات
bws show Spooler                                  كل ما هو معروف عن عنصر واحد
bws stop Winmgmt --dry-run --dependents           ما الذي سيتوقف معها عند إيقافها
bws kill Spooler --dry-run                        ما الذي سيذهب معها عند إنهاء عمليتها
bws start-type Spooler manual --dry-run           ما الذي سيحدث إن أُزيل عنها البدء التلقائي
bws snapshot create before.json                   جمّد الجهاز قبل التغيير
bws snapshot diff before.json --live --exit-code  ما الذي تغيّر منذئذٍ، والرمز 5 إن تغيّر الإعداد
bws history Spooler                               من غيّر نوع بدء تشغيلها ومتى
bws tool fix printer --dry-run                    ما الذي سيفعله الإصلاح السريع لطابعة عالقة
كل أمر وكل خيار وكل رمز خروج
احصل عليه

فك الضغط وشغّل، أو ثبّت

Windows 10 الإصدار 1809 أو Windows Server 2019 وما بعدهما، 64 بت. الأرشيفات لا تحتاج إلى برنامج تثبيت ولا تكتب شيئًا في السجل، والاطلاع لا يحتاج إلى صلاحيات المسؤول. أما تغيير أي شيء فيحتاج إلى جلسة مرفوعة الصلاحيات، وكلا النصفين يقولان ذلك بدل أن يفشلا بصمت: تعرض النافذة Restart as admin.

الملفما هو
BetterWindowsServices-win-x64.zipالنافذة، ملف تنفيذي واحد قائم بذاته، ولا حاجة إلى تثبيت .NET
bws-cli-win-x64.zipسطر الأوامر، ملف تنفيذي واحد قائم بذاته، للسكربتات وCI
BetterWindowsServices-win-x64.msiبرنامج التثبيت: البرنامجان معًا لكل حساب على الجهاز، والنافذة في قائمة Start والأمر bws في PATH

الملفات التنفيذية موقّعة بتوقيع Authenticode، فيذكر Windows اسم الناشر بدل أن يحذّر من ناشر مجهول.