Με ποιον χρήστη ξεκινούν οι υπηρεσίες στα Windows. Υπηρεσίες Windows. Τι είναι οι υπηρεσίες

Τρόποι λειτουργίας

Στις περισσότερες περιπτώσεις, οι υπηρεσίες απαγορεύεται να αλληλεπιδρούν με την κονσόλα ή την επιφάνεια εργασίας των χρηστών (τόσο τοπικές όσο και απομακρυσμένες), ωστόσο, για ορισμένες υπηρεσίες, είναι δυνατή μια εξαίρεση - αλληλεπίδραση με την κονσόλα (αριθμός συνεδρίας 0, στην οποία ο χρήστης είναι συνδεδεμένος τοπικά ή όταν ξεκινά η υπηρεσία mstscμε το κλειδί /console).

Υπάρχουν διάφοροι τρόποι για τις υπηρεσίες:

  • Απαγορεύεται η εκτόξευση·
  • χειροκίνητη εκκίνηση (κατόπιν αιτήματος).
  • αυτόματη εκκίνηση κατά την εκκίνηση του υπολογιστή.
  • αυτόματη (καθυστερημένη) εκκίνηση (παρουσιάστηκε στα Windows Vista και στον Windows Server 2008).
  • απαιτούμενη υπηρεσία/πρόγραμμα οδήγησης (αυτόματη εκκίνηση και αδυναμία (για τον χρήστη) διακοπής της υπηρεσίας).

Λειτουργία φόντου

Έναρξη, διακοπή και αλλαγή υπηρεσιών Windows

Οι υπηρεσίες και τα χαρακτηριστικά τους μπορούν να αλλάξουν στο MMC:

Σε διάφορες εκδοχές λειτουργικά συστήματαΟρισμένες υπηρεσίες μπορεί να υπάρχουν και άλλες όχι. Ορισμένες εφαρμογές και προγράμματα που εγκαθίστανται χωριστά μπορούν επίσης να δημιουργήσουν τις δικές τους υπηρεσίες.

Λίστα υπηρεσιών λειτουργικού συστήματος Microsoft Windows

Εμφανιζόμενο όνομα Ονομα Υπηρεσίας Λειτουργίες Περιγραφή
πελάτης DHCP dhcp Καταχωρεί και ενημερώνει διευθύνσεις IP και εγγραφές DNS για αυτόν τον υπολογιστή. Εάν διακοπεί αυτή η υπηρεσία, αυτός ο υπολογιστής δεν θα μπορεί να αποκτήσει δυναμικές διευθύνσεις IP και να εκτελεί ενημερώσεις DNS.
πελάτης DNS dnscache Η υπηρεσία πελάτη DNS (dnscache) αποθηκεύει προσωρινά τα ονόματα DNS (Domain Name System) και καταχωρεί το πλήρως αναγνωρισμένο όνομα αυτός ο υπολογιστής. Εάν η υπηρεσία διακοπεί, η ανάλυση ονόματος DNS θα συνεχιστεί. Ωστόσο, τα αποτελέσματα των ουρών ονομάτων DNS δεν θα αποθηκευτούν προσωρινά και το όνομα του υπολογιστή δεν θα καταχωρηθεί.
KtmRm για συντονιστή κατανεμημένων συναλλαγών KtmRm Συντονίζει τις συναλλαγές μεταξύ του MSDTC και του Kernel Transaction Manager (KTM).
ReadyBoost EMDMgmt ReadyBoost Υποστήριξη για τη βελτίωση της απόδοσης του συστήματος με την τεχνολογία ReadyBoost.
Superfetch SysMain Superfetch Διατηρεί και βελτιώνει την απόδοση του συστήματος.
Windows Audio Audiosrv Διαχείριση ήχου για προγράμματα Windows. Εάν διακοπεί αυτή η υπηρεσία, οι συσκευές ήχου και τα εφέ δεν θα λειτουργούν σωστά.
Χώρος καρτών Windows IDSVC Παρέχει έναν ασφαλή τρόπο δημιουργίας, διαχείρισης και έκθεσης ψηφιακών ταυτοτήτων.
Αυτόματη ενημέρωση WUAUSERV Περιλαμβάνει λήψη και εγκατάσταση Ενημερώσεις των Windows. Εάν η υπηρεσία είναι απενεργοποιημένη, δεν θα μπορείτε να χρησιμοποιήσετε τις δυνατότητες σε αυτόν τον υπολογιστή. αυτόματη ενημέρωσηή στον ιστότοπο του Windows Update.

Λίστα υπηρεσιών που δημιουργούνται από εφαρμογές και προγράμματα της Microsoft

Λίστα υπηρεσιών που δημιουργούνται από εφαρμογές και προγράμματα τρίτων

δείτε επίσης

Λίστα υπηρεσιών Windows

Συνδέσεις

  • pcs.suite101.com/article.cfm/index_of_services: Ευρετήριο υπηρεσιών Windows XP - Ευρετήριο των υπηρεσιών που εκτελούνται στα Windows XP λειτουργικό σύστημα
  • Πώς να διαγράψετε μια υπηρεσία Windows Vistaή Windows XP
  • Υπηρεσίες Windows XP (Ρωσικά)

Ίδρυμα Wikimedia. 2010 .

Δείτε τι είναι το "Windows Services" σε άλλα λεξικά:

    Windows SharePoint Services (WSS) δωρεάν πρόσθετοπρος την Microsoft Windows Server 2003 και 2008, ο οποίος υλοποιεί μια πλήρεις δυνατότητες διαδικτυακής πλατφόρμας με υποστήριξη για τις ακόλουθες δυνατότητες: Σύστημα διαχείρισης περιεχομένου Εργαλεία συνεργασίας ... ... Wikipedia

    Microsoft Developer Windows OS Family ... Wikipedia

    Microsoft Windows Component ... Wikipedia


Η υπηρεσία Windows NT (υπηρεσία Windows NT) είναι μια ειδική διαδικασία που διαθέτει ενοποιημένη διεπαφή για αλληλεπίδραση με το λειτουργικό σύστημα. Σύστημα Windows NT. Οι υπηρεσίες χωρίζονται σε δύο τύπους - υπηρεσίες Win32 που αλληλεπιδρούν με το λειτουργικό σύστημα μέσω του Service Control Manager (SCM) και προγράμματα οδήγησης που λειτουργούν μέσω του πρωτοκόλλου προγράμματος οδήγησης. συσκευές Windows NT. Για το υπόλοιπο αυτού του άρθρου, θα συζητήσουμε μόνο τις υπηρεσίες Win32.

Εφαρμογή υπηρεσιών

Μία από τις πιο σημαντικές ιδιότητες μιας υπηρεσίας είναι η μη διαδραστικότητα. Μια τυπική υπηρεσία εκτελείται στο παρασκήνιο, αόρατη στον μέσο χρήστη. Εξαιτίας αυτού, οι υπηρεσίες είναι οι πλέον κατάλληλες για την υλοποίηση των ακόλουθων τύπων εφαρμογών:

  • Διακομιστές σε αρχιτεκτονική πελάτη-διακομιστή (για παράδειγμα, MS SQL, MS Exchange Server)
  • Δίκτυο υπηρεσίες windows NT (Διακομιστής, Σταθμός Εργασίας);
  • Στοιχεία διακομιστή (με την έννοια της λειτουργικότητας) κατανεμημένων εφαρμογών (για παράδειγμα, διάφορα προγράμματα παρακολούθησης).

Βασικές ιδιότητες των υπηρεσιών

Μια υπηρεσία διαφέρει από μια κανονική εφαρμογή Win32 σε 3 βασικούς τρόπους. Ας εξετάσουμε το καθένα από αυτά.

Πρώτον, είναι η δυνατότητα να σταματήσετε με χάρη (να αναστείλετε) την υπηρεσία. Ο χρήστης ή άλλη εφαρμογή που χρησιμοποιεί τυπικούς μηχανισμούς έχει τη δυνατότητα να αλλάξει την κατάσταση της υπηρεσίας - να τη μετακινήσει από την κατάσταση λειτουργίας στην κατάσταση παύσης ή ακόμα και να σταματήσει τη λειτουργία της. Σε αυτήν την περίπτωση, πριν αλλάξει η κατάστασή της, η υπηρεσία λαμβάνει μια ειδική ειδοποίηση, χάρη στην οποία μπορεί να εκτελέσει τις απαραίτητες ενέργειες για τη μετάβαση σε μια νέα κατάσταση, για παράδειγμα, να ελευθερώσει κατειλημμένους πόρους.

Δεύτερον, η δυνατότητα εκκίνησης της υπηρεσίας πριν από την εγγραφή χρήστη και, ως εκ τούτου, η δυνατότητα εργασίας χωρίς καθόλου εγγεγραμμένο χρήστη. Οποιαδήποτε υπηρεσία μπορεί να ξεκινήσει αυτόματα κατά την έναρξη του λειτουργικού συστήματος και να αρχίσει να λειτουργεί ακόμη και πριν ο χρήστης συνδεθεί στο σύστημα.

Και τέλος, η ικανότητα εργασίας σε ένα αυθαίρετο πλαίσιο ασφάλειας. Συμφραζόμενα Ασφάλεια των WindowsΤο NT ορίζει ένα σύνολο δικαιωμάτων πρόσβασης διεργασιών σε διάφορα αντικείμενα και δεδομένα συστήματος. Σε αντίθεση με μια κανονική εφαρμογή Win32, η οποία εκτελείται πάντα στο πλαίσιο ασφαλείας του χρήστη που είναι συνδεδεμένος αυτήν τη στιγμή στο σύστημα, το πλαίσιο ασφαλείας εκτέλεσης μιας υπηρεσίας μπορεί να προκαθοριστεί. Αυτό σημαίνει ότι για μια υπηρεσία είναι δυνατό να καθοριστεί εκ των προτέρων ένα σύνολο δικαιωμάτων πρόσβασης σε αντικείμενα συστήματος και έτσι να περιοριστεί το εύρος των δραστηριοτήτων της. Για τις υπηρεσίες, υπάρχει ένα ειδικό είδος προεπιλεγμένου περιβάλλοντος ασφαλείας που ονομάζεται Τοπικό σύστημα. Μια υπηρεσία που εκτελείται σε αυτό το πλαίσιο έχει δικαιώματα μόνο στους πόρους του τοπικού υπολογιστή. Δεν μπορούν να εκτελεστούν λειτουργίες δικτύου με δικαιώματα τοπικού συστήματος, καθώς αυτό το πλαίσιο έχει νόημα μόνο τοπικός υπολογιστήςκαι δεν αναγνωρίζεται από άλλους υπολογιστές στο δίκτυο.

Αλληλεπίδραση υπηρεσίας με άλλες εφαρμογές

Οποιαδήποτε εφαρμογή έχει τα κατάλληλα δικαιώματα μπορεί να αλληλεπιδράσει με την υπηρεσία. Η αλληλεπίδραση, πρώτα απ 'όλα, συνεπάγεται μια αλλαγή στην κατάσταση της υπηρεσίας, δηλαδή τη μεταφορά της σε μία από τις τρεις καταστάσεις - λειτουργία (Έναρξη), αναστολή (Παύση), διακοπή και πραγματοποιείται με την υποβολή αιτημάτων SCM. Τα αιτήματα είναι τριών τύπων - μηνύματα από υπηρεσίες (διόρθωση των καταστάσεων τους), αιτήματα που σχετίζονται με την αλλαγή της διαμόρφωσης μιας υπηρεσίας ή τη λήψη πληροφοριών σχετικά με αυτήν και αιτήματα από εφαρμογές για αλλαγή της κατάστασης μιας υπηρεσίας.

Για να διαχειριστείτε μια υπηρεσία, πρέπει πρώτα να αποκτήσετε τη λαβή της χρησιμοποιώντας τη συνάρτηση Win32 OpenService API. Η λειτουργία StartService ξεκινά την υπηρεσία. Εάν είναι απαραίτητο, η αλλαγή της κατάστασης της υπηρεσίας γίνεται καλώντας τη λειτουργία ControlService.

Βάση δεδομένων υπηρεσιών

Οι πληροφορίες για κάθε υπηρεσία αποθηκεύονται στο μητρώο - στο κλειδί HKLM\SYSTEM\CurrentControlSet\Services\ServiceName. Περιέχει τις ακόλουθες πληροφορίες:

  • Τύπος υπηρεσίας. Υποδεικνύει εάν αυτή η εφαρμογή υλοποιεί μόνο μία υπηρεσία (αποκλειστική) ή εάν υπάρχουν πολλές υπηρεσίες στην εφαρμογή. Μια αποκλειστική υπηρεσία μπορεί να εκτελεστεί σε οποιοδήποτε πλαίσιο ασφαλείας. Πολλαπλές υπηρεσίες εντός της ίδιας εφαρμογής μπορούν να εκτελεστούν μόνο στο περιβάλλον LocalSystem.
  • Τύπος εκκίνησης. Αυτόματη - η υπηρεσία ξεκινά κατά την εκκίνηση του συστήματος. On Demand - Η υπηρεσία ξεκινά χειροκίνητα από τον χρήστη. Απενεργοποιήθηκε - Η υπηρεσία δεν μπορεί να ξεκινήσει.
  • Το όνομα της εκτελέσιμης μονάδας (αρχείο EXE).
  • Έναρξη παραγγελίας σε σχέση με άλλες υπηρεσίες. Σε ορισμένες περιπτώσεις, η σωστή λειτουργία μιας υπηρεσίας απαιτεί να εκτελούνται μία ή περισσότερες άλλες υπηρεσίες. Σε αυτήν την περίπτωση, το μητρώο περιέχει πληροφορίες σχετικά με τις υπηρεσίες που ξεκίνησαν πριν από αυτήν.
  • πλαίσιο ασφαλείας εκτέλεσης υπηρεσίας ( όνομα δικτύουκαι κωδικός πρόσβασης). Το προεπιλεγμένο πλαίσιο ασφαλείας είναι το LocalSystem.

Οι εφαρμογές που πρέπει να λάβουν πληροφορίες σχετικά με μια συγκεκριμένη υπηρεσία ή να αλλάξουν μια συγκεκριμένη ρύθμιση μιας υπηρεσίας ουσιαστικά πρέπει να αλλάξουν τις πληροφορίες στη βάση δεδομένων της υπηρεσίας στο μητρώο. Αυτό μπορεί να γίνει μέσω των κατάλληλων λειτουργιών Win32 API:

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle - για να δημιουργήσετε (άνοιγμα) μια υπηρεσία.
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - για να λάβετε πληροφορίες σχετικά με την υπηρεσία.
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus - για να αλλάξετε τις πληροφορίες διαμόρφωσης της υπηρεσίας.

Εσωτερικά σέρβις.

Για να λειτουργήσει, η εφαρμογή πρέπει να τακτοποιηθεί με τον κατάλληλο τρόπο, δηλαδή, να περιλαμβάνει ένα συγκεκριμένο σύνολο συναρτήσεων (σε όρους C ++) με μια συγκεκριμένη λειτουργικότητα. Ας εξετάσουμε εν συντομία καθένα από αυτά.

κύρια λειτουργία

Όπως γνωρίζετε, η κύρια λειτουργία είναι το σημείο εισόδου οποιασδήποτε εφαρμογής κονσόλας Win32. Όταν ξεκινά η υπηρεσία, αρχίζει να εκτελείται πρώτος ο κώδικας αυτής της συνάρτησης. Εντός 30 δευτερολέπτων από την έναρξη, η κύρια συνάρτηση πρέπει απαραίτητα να καλέσει το StartServiceCtrlDispatcher για να δημιουργήσει μια σύνδεση μεταξύ της εφαρμογής και του SCM. Όλη η επικοινωνία μεταξύ οποιασδήποτε υπηρεσίας σε αυτήν την εφαρμογή και του SCM πραγματοποιείται εντός της συνάρτησης StartServiceCtrlDispatcher, η οποία εξέρχεται μόνο όταν έχουν σταματήσει όλες οι υπηρεσίες στην εφαρμογή.

Λειτουργία ServiceMain

Εκτός από το σημείο εισόδου σε όλη τη διαδικασία, υπάρχει επίσης ένα ξεχωριστό σημείο εισόδου για καθεμία από τις υπηρεσίες που υλοποιούνται στην εφαρμογή. Τα ονόματα των συναρτήσεων που είναι τα σημεία εισόδου των υπηρεσιών (για απλότητα, ας τις ονομάσουμε όλες το ίδιο - ServiceMain) μεταβιβάζονται στο SCM σε μία από τις παραμέτρους κατά την κλήση του StartServiceCtrlDispatcher. Όταν ξεκινά κάθε υπηρεσία, δημιουργείται ένα ξεχωριστό νήμα για την εκτέλεση του ServiceMain.

Αφού αποκτήσει τον έλεγχο, το ServiceMain πρέπει πρώτα να καταχωρήσει έναν χειριστή αιτημάτων υπηρεσίας, μια συνάρτηση Handler, για καθεμία από τις υπηρεσίες της εφαρμογής. Μετά από αυτό, το ServiceMain ακολουθείται συνήθως από κάποια ενέργεια για την προετοιμασία της υπηρεσίας - εκχώρηση μνήμης, ανάγνωση δεδομένων κ.λπ. Αυτές οι ενέργειες πρέπει να συνοδεύονται από ειδοποιήσεις προς το SCM ότι η υπηρεσία βρίσκεται ακόμη σε διαδικασία εκκίνησης και δεν έχουν σημειωθεί βλάβες. Οι ειδοποιήσεις αποστέλλονται χρησιμοποιώντας κλήσεις στη λειτουργία SetServiceStatus. Όλες εκτός από την πιο πρόσφατη κλήση πρέπει να είναι SERVICE_START_PENDING και η πιο πρόσφατη πρέπει να είναι SERVICE_RUNNING. Η συχνότητα των κλήσεων καθορίζεται από τον προγραμματιστή της υπηρεσίας με βάση την ακόλουθη συνθήκη: η διάρκεια του χρονικού διαστήματος μεταξύ δύο γειτονικών κλήσεων στο SetServiceStatus δεν πρέπει να υπερβαίνει την τιμή της παραμέτρου dwWaitHint που μεταβιβάστηκε στο SCM κατά την πρώτη από τις δύο κλήσεις. Διαφορετικά, η SCM θα διακόψει αναγκαστικά την υπηρεσία εάν δεν λάβει έγκαιρα άλλη ειδοποίηση. Αυτή η μέθοδος αποφεύγει την κατάσταση της υπηρεσίας στην αρχή ως αποτέλεσμα της εμφάνισης ορισμένων αστοχιών (υπενθυμίζεται ότι οι υπηρεσίες είναι συνήθως μη διαδραστικές και μπορούν να ξεκινήσουν απουσία χρήστη). Η συνήθης πρακτική είναι ότι μετά την ολοκλήρωση του επόμενου βήματος αρχικοποίησης, ειδοποιείται το SCM.

Λειτουργία χειριστή

Όπως αναφέρθηκε παραπάνω, το Handler είναι το πρωτότυπο μιας συνάρτησης επανάκλησης, ενός χειριστή αιτημάτων υπηρεσίας, ειδικά για κάθε υπηρεσία στην εφαρμογή. Ο χειριστής καλείται όταν η υπηρεσία λαμβάνει ένα αίτημα (έναρξη, παύση, συνέχιση, διακοπή, μήνυμα τρέχουσας κατάστασης) και εκτελεί τις απαραίτητες ενέργειες σύμφωνα με το αίτημα, μετά από τις οποίες αναφέρει τη νέα κατάσταση στο SCM.

Ένα αίτημα συγκεκριμένα πρέπει να σημειωθεί - το αίτημα που έρχεται κατά τον τερματισμό λειτουργίας του συστήματος (Shutdown). Αυτό το αίτημα σηματοδοτεί την ανάγκη πραγματοποίησης αποαρχικοποίησης και τερματισμού. Η Microsoft ισχυρίζεται ότι κάθε υπηρεσία έχει 20 δευτερόλεπτα για να τερματιστεί, μετά από τα οποία αναγκάζεται να σταματήσει. Ωστόσο, οι δοκιμές έδειξαν ότι αυτή η προϋπόθεση δεν πληρούται πάντα και η υπηρεσία διακόπτεται αναγκαστικά πριν λήξει αυτή η χρονική περίοδος.

Σύστημα ασφαλείας υπηρεσιών

Οποιαδήποτε ενέργεια σε υπηρεσίες απαιτεί η εφαρμογή να έχει τα κατάλληλα δικαιώματα. Όλες οι εφαρμογές έχουν δικαιώματα σύνδεσης στο SCM, απαρίθμησης υπηρεσιών και ελέγχου εάν η βάση δεδομένων υπηρεσιών είναι κλειδωμένη. Μόνο οι εφαρμογές που έχουν δικαιώματα διαχειριστή μπορούν να καταχωρήσουν μια νέα υπηρεσία στο σύστημα ή να αποκλείσουν τη βάση δεδομένων της υπηρεσίας.

Κάθε υπηρεσία έχει έναν περιγραφέα ασφαλείας που περιγράφει ποιοι χρήστες είναι εξουσιοδοτημένοι να εκτελέσουν ποια λειτουργία. Προκαθορισμένο:

  • Όλοι οι χρήστες έχουν τα δικαιώματα SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE και SERVICE_USER_DEFINED_CONTROL.
  • Οι χρήστες της ομάδας Power Users και του λογαριασμού LocalSystem έχουν επιπλέον τα δικαιώματα SERVICE_START, SERVICE_PAUSE_CONTINUE και SERVICE_STOP.
  • Οι χρήστες στις ομάδες Διαχειριστές και Διαχειριστές συστήματος έχουν το δικαίωμα SERVICE_ALL_ACCESS.

Υπηρεσίες και διαδραστικότητα

Από προεπιλογή, οι διαδραστικές υπηρεσίες μπορούν να εκτελούνται μόνο στο πλαίσιο ασφαλείας LocalSystem. Αυτό οφείλεται στις ιδιαιτερότητες της εμφάνισης μιας οθόνης στα Windows NT, όπου, για παράδειγμα, υπάρχει ένα αντικείμενο όπως "Desktop", για να εργαστείτε με το οποίο πρέπει να έχετε τα κατάλληλα δικαιώματα πρόσβασης, τα οποία μπορεί να μην είναι διαθέσιμα σε αυθαίρετο λογαριασμός, εκτός από το LocalSystem. Παρά το γεγονός ότι στη συντριπτική πλειονότητα των περιπτώσεων αυτός ο περιορισμός δεν είναι σημαντικός, εντούτοις, μερικές φορές υπάρχει ανάγκη να δημιουργηθεί μια υπηρεσία που θα εμφανίζει πληροφορίες στην οθόνη της οθόνης και ταυτόχρονα θα εκτελείται σε περιβάλλον ασφαλείας διαφορετικό από το LocalSystem, για παράδειγμα, ένα στοιχείο διακομιστή εφαρμογών για εκτέλεση εφαρμογών σε απομακρυσμένο υπολογιστή.

Απόσπασμα κώδικα από . δείχνει αυτή τη δυνατότητα.

Σε αυτό το τμήμα, ως απάντηση σε ένα αίτημα που στάλθηκε από την πλευρά του πελάτη της εφαρμογής ως συνέπεια RPC, η υπηρεσία εμφανίζει ένα μήνυμα κειμένου στην οθόνη της οθόνης.

Παράδειγμα υπηρεσίας (αποσπάσματα κλειδιού)

Ας δούμε ένα παράδειγμα των βασικών τμημάτων μιας εφαρμογής C++ που υλοποιεί μια υπηρεσία Windows NT. Για λόγους σαφήνειας, παραλείπονται τα μη βασικά μέρη του κώδικα.

κύρια λειτουργία

Εμφανίζεται ο κωδικός για την κύρια λειτουργία.

Λειτουργία ServiceMain

Ένα χαρακτηριστικό του κώδικα που περιέχεται στο ServiceMain είναι ότι είναι συχνά αδύνατο να προβλεφθεί εκ των προτέρων ο χρόνος εκτέλεσης μιας λειτουργίας, ειδικά όταν θεωρείτε ότι η εκτέλεσή της λαμβάνει χώρα σε ένα λειτουργικό σύστημα με προληπτικές πολλαπλές εργασίες. Εάν η λειτουργία διαρκεί περισσότερο από το χρονικό διάστημα που καθορίζεται στην παράμετρο κλήσης SetServiceStatus, η υπηρεσία δεν θα μπορεί να στείλει την επόμενη ειδοποίηση εγκαίρως, με αποτέλεσμα η SCM να σταματήσει τη λειτουργία της. Παραδείγματα πιθανών λειτουργιών είναι οι κλήσεις σε λειτουργίες δικτύωσης με μεγάλα χρονικά διαστήματα ή μια εφάπαξ ανάγνωση ένας μεγάλος αριθμόςπληροφορίες από αργά μέσα. Επιπλέον, αυτή η προσέγγιση είναι εντελώς ανεφάρμοστη κατά τον εντοπισμό σφαλμάτων μιας υπηρεσίας, καθώς η εκτέλεση του προγράμματος στο πρόγραμμα εντοπισμού σφαλμάτων συνοδεύεται από μεγάλες παύσεις που είναι απαραίτητες για τον προγραμματιστή.

Για να ξεπεραστεί αυτό το πρόβλημα, όλες οι αλληλεπιδράσεις με το SCM θα πρέπει να εκτελούνται σε ξεχωριστό νήμα, ανεξάρτητα από τις ενέργειες που πραγματοποιούνται κατά τη φάση προετοιμασίας.

Το B δείχνει έναν αλγόριθμο για τη σωστή εκκίνηση μιας υπηρεσίας χρησιμοποιώντας ένα βοηθητικό νήμα.

Λειτουργία χειριστή

Το B δείχνει τον κωδικό για τη συνάρτηση Handler και τα βοηθητικά νήματα. Για αιτήματα "Stop" και "Shutdown", χρησιμοποιείται ο αλγόριθμος για τη χαριτωμένη διακοπή της υπηρεσίας, παρόμοιος με αυτόν που χρησιμοποιείται κατά την εκκίνηση της υπηρεσίας, με τη μόνη διαφορά ότι η παράμετρος SERVICE_STOP_PENDING μεταβιβάζεται στο SetserviceStatus αντί για την παράμετρο SERVICE_START_PENDING και SERVICE_STOPPED αντί για SERVICE_RUNNING.

Στην ιδανική περίπτωση, τα ερωτήματα "Παύση" και "Συνέχεια" θα πρέπει επίσης να χρησιμοποιούν αυτήν την προσέγγιση. Ένας περίεργος αναγνώστης μπορεί εύκολα να το εφαρμόσει με βάση αυτά τα παραδείγματα.

συμπέρασμα

Εν κατακλείδι, θα ήθελα να σημειώσω ότι με τη μετάβαση στα Windows NT 2000, η ​​ανάπτυξη των υπηρεσιών δεν έχει αλλάξει. Οι υπηρεσίες συνεχίζουν να αποτελούν σημαντικό μέρος του λογισμικού στην πλατφόρμα των Windows, δίνοντας στους προγραμματιστές πολλή δουλειά να κάνουν.


// Λειτουργία παρόμοια με το MessageBox Win32 API int ServerMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) ( DWORD dwThreadId; HWINSTA hwinsta hwinstaKWINHDES; αντικείμενα " και "Επιφάνεια εργασίας". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Αλλάξτε το περιβάλλον ασφαλείας σε αυτό που καλεί το //C και //C αποκτήστε πρόσβαση στα αντικείμενα χρήστη // "Window station" και "Desktop". ) SetProcessWindowStation( hwinstaUser); hdeskUser = OpenDesktop("Προεπιλογή", 0, FALSE, MAXIMUM_ALLOWED); RpcRevertToSelf(); if (hdeskUser == NULL) ( SetProcessWindowStation(hWinstaSaveSaveSave)); urn0; ) SetThreadDesktop(hdeskUser); // Εμφάνιση ενός κανονικού πλαισίου κειμένου. αποτέλεσμα = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Επαναφορά αποθηκευμένων αντικειμένων // "Window station" και "Desktop". SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); αποτέλεσμα επιστροφής? ) void main() ( SERVICE_TABLE_ENTRY steTable = ( (SERVICENAME, ServiceMain), (NULL, NULL)); // Δημιουργία σύνδεσης με το SCM. Μέσα σε αυτήν τη συνάρτηση // λαμβάνονται και αποστέλλονται αιτήματα. StartServiceCtrlDispatcher(steTable); ) Winapi ServiceMain (DWORD DWARGC, LPSTR *PSARGV) (// Εγγραφείτε αμέσως στον χειριστή αιτήματος HSS = RegisterServicectrlHandler (ServiceName, ServiceHandler); dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; sStatus.dwServiceSpecificExitCode = 0; ; sStatus.dwWaitHint = 0; sStatus.dwWin32, η συνάρτηση για να καλείται η αρχική =//ERROCode; Το σύστημα δεν // ξεφορτώνει την υπηρεσία κατά τη διαδικασία προετοιμασίας, ξεκινά ένα νήμα που αναφέρει μία φορά κάθε // δευτερόλεπτο ότι η υπηρεσία βρίσκεται σε διαδικασία προετοιμασίας. // Δημιουργείται ένα συμβάν για τον συγχρονισμό του νήματος. // Μετά από αυτό, το νήμα εργάτη έχει ξεκινήσει, για Για να συγχρονίσετε ποιο // ένα συμβάν δημιουργείται επίσης. hSendStartPending = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hSendStartThread; DWORD dwThreadId; hSendStartThread = CreateThread(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Όλη η προετοιμασία της υπηρεσίας γίνεται εδώ. InitService(); SetEvent(hSendStartPending); if(WaitForSingleObject(hSendStartThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStartThread, 0); ) CloseHandle(hSendStartPending); CloseHandle(hSendStartThread); hWork = CreateEvent(NULL, TRUE, FALSE, NULL); hServiceThread = CreateThread(NULL, 0, ServiceFunc, 0, 0, &dwThreadId); sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); ) // Μια συνάρτηση νήματος που στέλνει ειδοποιήσεις στο SCM κάθε δευτερόλεπτο // ότι η διαδικασία προετοιμασίας βρίσκεται σε εξέλιξη. Η συνάρτηση τελειώνει // όταν έχει οριστεί το συμβάν hSendStartPending //. DWORD WINAPI SendStartPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // "Sleep το συμβάν έχει λήξει από το/1 δευτερόλεπτο το /Ptend" για 1 δευτερόλεπτο. κατάσταση σηματοδότησης ( // η προετοιμασία της υπηρεσίας δεν έχει τελειώσει), στέλνουμε μια άλλη ειδοποίηση, // ρυθμίζοντας το μέγιστο χρονικό διάστημα // στα 2 δευτερόλεπτα, προκειμένου να έχουμε ένα χρονικό περιθώριο πριν από // την επόμενη ειδοποίηση. ενώ (true) ( SetServiceStatus(hSS, &sStatus); sStatus .dwCheckPoint++;if(WaitForSingleObject(hSendStartPending, 1000)!=WAIT_TIMEOUT) break; ) sStatus.dwCheckPoint;nFucement = 0. Ανάγνωση δεδομένων, // εκχώρηση μνήμης, κ.λπ. void InitService() ( ... ) // Συνάρτηση που περιέχει τον κωδικό υπηρεσίας. DWORD WINAPI ServiceFunc(LPVOID) ( while (true) (‘if (!bPause) ( // Αυτό περιέχει κώδικα που συνήθως // εκτελεί κάποιο είδος κυκλικής λειτουργίας... ) if (WaitForSingleObject(hWork, 1000)!=WAIT_TIMEOUT ) break; ) return 0; ) // Request handler from SCM void WINAPI ServiceHandler(DWORD dwCode) ( switch (dwCode) ( case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: ReportStatusToSCMgr(SERVICE_PENDE0Tending=SERVICE_PENDE0L); TRUE, FALSE, NULL); hSendStopThread = CreateThread(NULL, 0, SendStopPending, NULL, 0, & dwThreadId); SetEvent(hWork); if (WaitForSingleObject(hServiceThread(hServiceThread)ThServiceThread(hServiceThread00)hread, 10; ) SetEvent(hSendStopPending); CloseHandle(hServiceThread); CloseHandle(hWork); if(WaitForSingleObject(hSendStopThread, 2000) != WAIT_OBJECT_0) (TerminateThreadThServiceThread);(TerminateThreadTh)ThStopSendSend; Κατάσταση υπηρεσίας (hSS, &sStatus); Διακοπή; περίπτωση SERVICE_CONTROL_PAUSE: bPause = true; sStatus.dwCurrentState = SERVICE_PAUSED; SetServiceStatus(hSS, &sStatus); Διακοπή; περίπτωση SERVICE_CONTROL_CONTINUE: bPause = true; sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); Διακοπή; περίπτωση SERVICE_CONTROL_INTERROGATE: SetServiceStatus(hSS, &sStatus); Διακοπή; προεπιλογή: SetServiceStatus(hSS, &sStatus); Διακοπή; ) ) // Λειτουργία νήματος παρόμοια με το SendStartPending // για διακοπή της υπηρεσίας. Dword winapi sendstoppending (lpvoid) (sstatus.dwcheckpoint = 0, sstatus.dwcurrentState = service_stop_pending · sstatus.dwwaithint = 2000, ενώ (true) (setservicestatus (hss & sstatus) ! =WAIT_TIMEOUT) διάλειμμα; ) sStatus.dwCheckPoint = 0; επιστροφή 0; )

Πώς να εκτελέσετε μια εφαρμογή ως υπηρεσία Windows

Είναι δυνατή η εκτέλεση μιας εφαρμογής πελάτη ως υπηρεσία; Σε ένα από αυτά, περιέγραψα πώς να δημιουργήσετε μια υπηρεσία Windows χρησιμοποιώντας κανονικά εργαλεία λειτουργικού συστήματος. Ωστόσο, δεν θα είναι δυνατή η εκτέλεση κάθε εφαρμογής κονσόλας ως υπηρεσία και τα προγράμματα με γραφική διεπαφή, κατ 'αρχήν, δεν μπορούν να λειτουργήσουν με αυτόν τον τρόπο. Αλλά υπάρχει ακόμα μια ευκαιρία να τρέξουμε την εφαρμογή ως υπηρεσία και το πρόγραμμα με το αρχικό όνομα θα μας βοηθήσει σε αυτό. Υπεύθυνος Υπηρεσιών που δεν ρουφάει.

Το NSSM είναι δωρεάν λογισμικόΜε ανοιχτή πηγήκαι υποστηρίζει όλα τα λειτουργικά συστήματα της Microsoft από τα Windows 2000 έως τα Windows 8. Το NSSM δεν απαιτεί εγκατάσταση, απλώς κατεβάστε το και αποσυσκευάστε το. Το κιτ διανομής περιλαμβάνει εκδόσεις για λειτουργικό σύστημα 32-bit και 64-bit. Μπορείτε να πάρετε το πρόγραμμα από το site nssm.cc, αυτή τη στιγμή η τελευταία σταθερή έκδοση είναι η 2.21.1, την οποία θα χρησιμοποιήσω.

Για να δείξουμε τις δυνατότητες του NSSM, ας προσπαθήσουμε να τρέξουμε Σημειωματάριο των Windowsως υπηρεσία στα Windows 8.1.

Δημιουργήστε μια υπηρεσία

Για να δημιουργήσετε μια υπηρεσία με το όνομα μπλοκ ΣΗΜΕΙΩΣΕΩΝεκκινήστε την κονσόλα εντολών, μεταβείτε στο φάκελο με το μη συσκευασμένο NSSM (για Windows 64-bit) και πληκτρολογήστε την εντολή nssm install notepad , που ανοίγει το παράθυρο του προγράμματος εγκατάστασης γραφικών NSSM. Για να δημιουργήσετε μια υπηρεσία, αρκεί να καθορίσετε τη διαδρομή προς το εκτελέσιμο αρχείο στο πεδίο Διαδρομή και να κάνετε κλικ στο κουμπί "Εγκατάσταση υπηρεσίας". Επιπλέον, στο πεδίο Επιλογές, μπορείτε να καθορίσετε τα κλειδιά που απαιτούνται για την έναρξη της υπηρεσίας.

Επίσης, στο στάδιο της δημιουργίας μιας νέας υπηρεσίας, μπορείτε να καθορίσετε ορισμένες πρόσθετες παραμέτρους.

Η καρτέλα Τερματισμός παραθέτει τις μεθόδους τερματισμού λειτουργίας και τα χρονικά όρια που χρησιμοποιούνται κατά τον κανονικό τερματισμό λειτουργίας ή τον τερματισμό έκτακτης ανάγκης της εφαρμογής. Όταν το NSSM λαμβάνει μια εντολή διακοπής (π.χ. όταν μια εφαρμογή τερματίζεται), επιχειρεί να σταματήσει την ελεγχόμενη εφαρμογή με τον κανονικό τρόπο. Εάν η εφαρμογή δεν ανταποκριθεί, τότε το NSSM μπορεί να τερματίσει αναγκαστικά όλες τις διαδικασίες και τις υποδιεργασίες αυτής της εφαρμογής.

Υπάρχουν τέσσερα βήματα τερματισμού της εφαρμογής συνολικά και από προεπιλογή θα χρησιμοποιούνται με αυτή τη σειρά:

Στο πρώτο βήμα, το NSSM προσπαθεί να δημιουργήσει και να στείλει ένα συμβάν ctrl+c.Αυτή η μέθοδος λειτουργεί καλά για εφαρμογές κονσόλας ή σενάρια, αλλά όχι για εφαρμογές γραφικών.
Στη συνέχεια, το NSSM εντοπίζει όλα τα παράθυρα που δημιουργούνται από την εφαρμογή και τους στέλνει ένα μήνυμα WM_CLOSE για να αναγκάσει την εφαρμογή να βγει.
Στο τρίτο βήμα, το NSSM αξιολογεί όλα τα νήματα που δημιουργούνται από την εφαρμογή και τους στέλνει ένα μήνυμα WM_QUIT, το οποίο θα ληφθεί εάν η εφαρμογή έχει ουρά μηνυμάτων νήματος.
Και ως έσχατη λύση, το NSSM μπορεί να καλέσει τη μέθοδο TerminateProcess(), τερματίζοντας αναγκαστικά την εφαρμογή.

Ωστόσο, είναι δυνατό να απενεργοποιήσετε ορισμένες ή ακόμα και όλες τις μεθόδους διαφορετικές εφαρμογέςλειτουργούν διαφορετικές μέθοδοι και για τον σωστό τερματισμό της εφαρμογής, συνιστάται να αφήνετε τα πάντα ως έχουν.

Από προεπιλογή, όταν μια υπηρεσία διακόπτεται, το NSSM προσπαθεί να την επανεκκινήσει. Στην καρτέλα "Ενέργειες εξόδου", μπορείτε να αλλάξετε την αυτόματη ενέργεια σε περίπτωση μη φυσιολογικού τερματισμού λειτουργίας της εφαρμογής, καθώς και να ορίσετε μια καθυστέρηση πριν από την αυτόματη επανεκκίνηση της εφαρμογής.

Στην καρτέλα "Είσοδος / Έξοδος (I / O)", μπορείτε να ορίσετε την ανακατεύθυνση της εισόδου / εξόδου της εφαρμογής στο καθορισμένο αρχείο.

Στην καρτέλα "Περιβάλλον", μπορείτε να ορίσετε νέες μεταβλητές περιβάλλοντος για την υπηρεσία ή να παρακάμψετε τις υπάρχουσες.

Μπορείτε επίσης να μην χρησιμοποιήσετε το κέλυφος γραφικών και να δημιουργήσετε αμέσως μια υπηρεσία στην κονσόλα με την ακόλουθη εντολή:

Σημειωματάριο εγκατάστασης nssm ″C:\Windows\system32\notepad.exe″

Διαχείρισης υπηρεσιών

Αφού δημιουργήσετε την υπηρεσία χρησιμοποιώντας το NSSM, μεταβείτε στο συμπληρωματικό πρόγραμμα Υπηρεσίες και βρείτε την υπηρεσία σημειωματάριο. Όπως μπορείτε να δείτε, στην εμφάνιση δεν διαφέρει από άλλες υπηρεσίες, μπορούμε επίσης να το ξεκινήσουμε, να το σταματήσουμε ή να αλλάξουμε τη λειτουργία εκκίνησης. Σημειώστε, ωστόσο, ότι το nssm.exe παρατίθεται ως το εκτελέσιμο.

Και αν μεταβείτε στη Διαχείριση εργασιών, θα δούμε την ακόλουθη εικόνα: Το NSSM εκτελείται ως κύρια (γονική) διαδικασία, η υπηρεσία σημειωματάριου εκτελείται ως θυγατρική διαδικασία και η εφαρμογή Σημειωματάριο εκτελείται ήδη σε αυτήν τη θυγατρική διαδικασία.

Αφαίρεση υπηρεσίας

Για να καταργήσετε την υπηρεσία, πληκτρολογήστε την εντολή nssm remove notepad και επιβεβαιώστε την αφαίρεσή της. Και πληκτρολογώντας nssm remove notepad confirm , μπορείτε να το κάνετε χωρίς επιβεβαίωση.

Διαδραστική έναρξη μιας υπηρεσίας

Βασική διαφορά προσαρμοσμένη εφαρμογήαπό την υπηρεσία είναι ότι μετά την εκκίνηση, η εφαρμογή ενδέχεται να απαιτήσει πρόσθετες ενέργειες από την πλευρά του χρήστη για να συνεχίσει να λειτουργεί - για παράδειγμα, κάντε κλικ σε ένα κουμπί ή εισαγάγετε μια εντολή. Για να το κάνετε αυτό, πρέπει να αποκτήσετε πρόσβαση σε αυτό, κάτι που, όπως αποδεικνύεται, δεν είναι τόσο εύκολο να γίνει.

Για να ξεκινήσετε την υπηρεσία σε διαδραστική λειτουργία, πρέπει να ανοίξετε τις ιδιότητές της στο συμπληρωματικό πρόγραμμα Υπηρεσίες και στην καρτέλα "Είσοδος", επιλέξτε το πλαίσιο ελέγχου "Να επιτρέπεται η αλληλεπίδραση με την επιφάνεια εργασίας".

Και τότε αρχίζουν τα θαύματα 🙂 Μια υπηρεσία που ξεκινά σε διαδραστική λειτουργία ανοίγει σε μια απομονωμένη περίοδο λειτουργίας (συνεδρία 0). Αυτή η συνεδρία είναι προσβάσιμη μόνο από την Υπηρεσία Ανίχνευσης Διαδραστικών Υπηρεσιών (ui0detect), η οποία παρακολουθεί την έναρξη των διαδραστικών υπηρεσιών στον υπολογιστή και εκδίδει μια ειδοποίηση. Στα Windows 7\Server 2008 αυτή η υπηρεσία είναι ενεργοποιημένη από προεπιλογή, αλλά στα Windows 8\Server 2012 είναι απενεργοποιημένη και δεν εμφανίζεται στο γραφικό συμπληρωματικό πρόγραμμα Services (τουλάχιστον δεν τη βρήκα εκεί). Επιπλέον, εάν βρείτε αυτή τη μυστηριώδη υπηρεσία και προσπαθήσετε να την ξεκινήσετε, θα λάβετε ένα μήνυμα σφάλματος.

Αλλά το γεγονός είναι ότι για να το εκτελέσετε, πρέπει να επιτρέψετε την εκκίνηση διαδραστικών υπηρεσιών στον υπολογιστή. Επομένως, ανοίγουμε τον επεξεργαστή μητρώου, βρίσκουμε στην ενότητα HKLM\System\CurrentControlSet\Control\Windows μια παράμετρο DWORD με το όνομα Χωρίς διαδραστικές υπηρεσίεςκαι ορίστε την τιμή του σε 0 .

Στη συνέχεια ανοίγουμε την κονσόλα PowerShell και ξεκινάμε την υπηρεσία εντοπισμού με την εντολή:

Start-Service -Όνομα ui0detect

Αφού βεβαιωθούμε ότι εκτελείται η υπηρεσία εντοπισμού, επανεκκινούμε την υπηρεσία σημειωματάριου και λαμβάνουμε αυτό το παράθυρο. Επιλέξτε "Προβολή μηνύματος"

και μπείτε στη μηδενική συνεδρία στην οποία εκτελείται η εφαρμογή μας. Στη συνέχεια κάνουμε τις απαραίτητες ενέργειες με αυτό και επιστρέφουμε πίσω.

Μια τόσο ενδιαφέρουσα λύση για την εκτέλεση εφαρμογών όπως οι υπηρεσίες των Windows. Όχι το πιο όμορφο, αλλά απόλυτα πιστό στο όνομά του 🙂

Τελευταία ενημέρωση: 31.10.2015

Οι υπηρεσίες είναι ένα από τα πιο σημαντικά στοιχεία του λειτουργικού συστήματος Windows. Στην πραγματικότητα, πρόκειται για ξεχωριστές εφαρμογές που δεν διαθέτουν γραφική διεπαφή και οι οποίες εκτελούν διάφορες εργασίες στο παρασκήνιο. Οι υπηρεσίες μπορούν να ξεκινήσουν κατά την έναρξη του λειτουργικού συστήματος ή οποιαδήποτε άλλη στιγμή κατά τη διάρκεια της εργασίας του χρήστη. Ένα συνηθισμένο παράδειγμα υπηρεσιών είναι διάφοροι διακομιστές ιστού που ακούν στο παρασκήνιο σε μια συγκεκριμένη θύρα για συνδέσεις και εάν υπάρχουν συνδέσεις, αλληλεπιδρούν μαζί τους. Μπορεί επίσης να είναι διάφορες βοηθητικές υπηρεσίες ενημέρωσης για άλλες εγκατεστημένα προγράμματαπου επικοινωνούν με τον διακομιστή για να δουν αν υπάρχει μια νέα έκδοσηεφαρμογές. Γενικά, μπορούμε να ανοίξουμε τον πίνακα υπηρεσιών και να δούμε μόνοι μας όλες τις εγκατεστημένες και εκτελούμενες υπηρεσίες:

Ας δούμε πώς να δημιουργήσετε τις δικές σας υπηρεσίες σε C#. Ως εργασία προς υλοποίηση, θα επιλέξουμε να παρακολουθούμε τις αλλαγές σε έναν συγκεκριμένο φάκελο στο σύστημα αρχείων. Τώρα ας δημιουργήσουμε μια υπηρεσία για να το τρέξουμε.

Αρχικά, ας δημιουργήσουμε ένα νέο έργο, το οποίο θα είναι τύπου Windows Service . Ας ονομάσουμε το έργο FileWatcherService:

Μετά από αυτό, το Visual Studio δημιουργεί ένα έργο που έχει όλα όσα χρειάζεστε. Αν και καταρχήν δεν χρειάζεται να επιλέξουμε αυτόν τον συγκεκριμένο τύπο έργου, θα μπορούσαμε να δημιουργήσουμε ένα έργο βιβλιοθήκης κλάσεων και στη συνέχεια να ορίσουμε όλες τις απαιτούμενες κλάσεις σε αυτό.

Το νέο έργο λοιπόν μοιάζει με αυτό:

Υπάρχει επίσης ένα αρχείο Program.cs και υπάρχει ο ίδιος ο κόμβος υπηρεσίας Service1.cs.

Η υπηρεσία αντιπροσωπεύει μια κανονική εφαρμογή, αλλά δεν ξεκινά από μόνη της. Όλες οι κλήσεις και η πρόσβαση σε αυτό πραγματοποιούνται μέσω του Service Control Manager (SCM). Όταν η υπηρεσία ξεκινά αυτόματα κατά την εκκίνηση του συστήματος ή χειροκίνητα, το SCM καλεί τη μέθοδο Main στην κλάση Program:

Πρόγραμμα στατικής κλάσης ( static void Main() ( ServiceBase ServicesToRun; ServicesToRun = new ServiceBase ( new Service1()); ServiceBase.Run(ServicesToRun); ))

Η μέθοδος Main ορίζεται από προεπιλογή για την εκτέλεση πολλαπλών υπηρεσιών ταυτόχρονα, οι οποίες ορίζονται στον πίνακα ServicesToRun. Ωστόσο, από προεπιλογή, το έργο περιέχει μόνο μία υπηρεσία, την Υπηρεσία1. Η ίδια η εκκίνηση εκτελείται χρησιμοποιώντας τη μέθοδο Run: ServiceBase.Run(ServicesToRun) .

Η ίδια η υπηρεσία που πρόκειται να ξεκινήσει αντιπροσωπεύεται από τον κόμβο Service1.cs. Ωστόσο, αυτό δεν είναι πραγματικά ένα απλό αρχείο κώδικα. Εάν ανοίξουμε αυτόν τον κόμβο, θα δούμε το αρχείο σχεδιαστή υπηρεσίας Service1.Designer.cs και την κλάση Service1 σε αυτό.

Η κλάση Service1 αντιπροσωπεύει στην πραγματικότητα την υπηρεσία. Από προεπιλογή έχει τον ακόλουθο κώδικα:

Χρήση του συστήματος. χρησιμοποιώντας System.Collections.Generic; χρησιμοποιώντας System.ComponentModel; χρησιμοποιώντας System.Data; χρησιμοποιώντας System.Diagnostics; χρησιμοποιώντας System.Linq; χρησιμοποιώντας System.ServiceProcess. χρησιμοποιώντας System.Text; χρησιμοποιώντας System.Threading.Tasks; namespace FileWatcherService ( δημόσια μερική κλάση Service1: ServiceBase ( public Service1() ( InitializeComponent(); ) προστατευμένη παράκαμψη void OnStart(args συμβολοσειράς) ( ) προστατευμένη παράκαμψη void OnStop() ( ) )

Η κλάση υπηρεσίας πρέπει να κληρονομήσει από τη βασική κλάση ServiceBase. Αυτή η κλάση ορίζει έναν αριθμό μεθόδων, οι πιο σημαντικές από τις οποίες είναι η μέθοδος OnStart(), η οποία ξεκινά τις ενέργειες που εκτελούνται από την υπηρεσία και η μέθοδος OnStop(), η οποία σταματά την υπηρεσία.

Αφού το SCM καλέσει τη μέθοδο Main και καταχωρήσει την υπηρεσία, καλείται απευθείας εκτελώντας τη μέθοδο OnStart.

Όταν βρίσκεστε στην κονσόλα υπηρεσιών ή μέσω γραμμή εντολώνστέλνουμε μια εντολή διακοπής της υπηρεσίας και, στη συνέχεια, το SCM καλεί τη μέθοδο OnStop για να τη διακόψει.

Εκτός από αυτές τις δύο μεθόδους στην κλάση υπηρεσιών, μπορείτε να παρακάμψετε πολλές ακόμη μεθόδους της βασικής κλάσης ServiceBase:

    OnPause: καλείται όταν η υπηρεσία είναι σε παύση

    OnContinue : Καλείται όταν η υπηρεσία συνεχίζεται μετά την αναστολή της

    OnShutdown : Καλείται όταν κλείνουν τα Windows

    OnPowerEvent: καλείται όταν αλλάζει η λειτουργία τροφοδοσίας

    OnCustomCommand : Καλείται όταν η υπηρεσία λαμβάνει μια προσαρμοσμένη εντολή από το Service Control Manager (SCM)

Ο κατασκευαστής κλάσης Service1 καλεί τη μέθοδο InitializeComponent(), η οποία ορίζεται στο αρχείο σχεδιαστή Service1.Designer.cs:

Namespace FileWatcherService ( μερική κλάση Service1 ( private System.ComponentModel.ICComponents = null; προστατευμένη παράκαμψη void Dispose(bool disposing) ( if (disposing && (components != null)) ( components.Dispose(); ) base.Dispose(disposing ); ) ιδιωτικό void InitializeComponent() ( components = new System.ComponentModel.Container(); this.ServiceName = "Service1"; ) ) )

Το μόνο πράγμα που πρέπει να σημειωθεί σε αυτό είναι να ορίσετε το όνομα της υπηρεσίας (ιδιότητα Όνομα υπηρεσίας):

This.ServiceName = "Υπηρεσία1";

Αυτό είναι το όνομα που θα εμφανίζεται στην κονσόλα υπηρεσιών μετά την εγκατάσταση της υπηρεσίας. Μπορούμε να το αλλάξουμε, ή μπορούμε να το αφήσουμε ως έχει.

Τώρα ας αλλάξουμε τον κωδικό υπηρεσίας ως εξής:

Χρήση του συστήματος. χρησιμοποιώντας System.ServiceProcess. χρησιμοποιώντας System.IO; χρησιμοποιώντας System.Threading; Χώρος ονομάτων FileWatcherService ( δημόσια μερική κλάση Service1: ServiceBase ( Logger Logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) προστατευμένη παράκαμψη κενό OnStart (args συμβολοσειράς) logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); ) προστατευμένη παράκαμψη void OnStop() (logger.Stop(); Thread.Sleep(1000); ) ) class Logger ( FileSystemWatcher watcher; object obj = new object(); bool enabled = true; public Logger() ( watcher = new FileSystemWatcher("D:\\Temp"); watcher.Deleted += Watcher_Deleted; watcher.Created + = Watcher_Created; watcher.Changed += Watcher_Changed; watcher.Renamed += Watcher_Renamed; ) public void Start() ( watcher.EnableRaisingEvents = true; while(enabled) ( Thread.Sleep(1000); ) ) public void Stop() watcher.EnableRaisingEvents = false; enabled = false; ) // μετονομασία ιδιωτικών αρχείων e void Watcher_Renamed(Αποστολέας αντικειμένου, RenamedEventArgs e) ( string fileEvent = "μετονομάστηκε σε " + e.FullPath; string filePath = e.OldFullPath; RecordEntry(fileEvent, filePath); ) // αλλαγή αρχείων private void Watcher_Changed(object sender, FileSystemEventArgs e) ( string fileEvent = "changed"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // δημιουργία αρχείων ιδιωτικού κενού Watcher_Created(objecty senderEvente e) ( string fileEvent = "δημιουργήθηκε"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // διαγραφή αρχείων private void Watcher_Deleted(object sender, FileSystemEventArgs e) (string fileEvent = "deleted"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) private void RecordEntry(string fileEvent, string filePath) ( κλείδωμα (obj) ( χρησιμοποιώντας (StreamWriter writer = new StreamWriter("D:\\templog.txt", true)) ( writer.WriteLine(String.Format("(0) file(1) was(2)", DateTime.Now.ToString("ηη/ΜΜ/εεεε ωω:μμ:δδ"), filePath, fileEvent)); writer. Ξεπλύνετε(); ) ) ) ) )

Η κλάση κλειδιού που ενσωματώνει όλες τις λειτουργίες είναι η κλάση Logger. Χρησιμοποιώντας το αντικείμενο FileSystemWatcher, θα παρακολουθεί τις αλλαγές στο φάκελο D://Θερμ. Η μέθοδος Start() καθορίζει ότι θα παρακολουθούμε για αλλαγές μέσω του αντικειμένου FileSystemWatcher. Και όλη η εργασία θα πάει όσο η ενεργοποιημένη μεταβλητή boolean είναι αληθής. Και η μέθοδος Stop() θα σας επιτρέψει να τερματίσετε την κλάση.

Τα συμβάντα FileSystemWatcher σάς επιτρέπουν να παρακολουθείτε όλες τις αλλαγές στον φάκελο παρακολούθησης. Αυτό θα καταγράψει τις αλλαγές στο αρχείο templog.txt. Για να αποφευχθεί ένας αγώνας πόρων για το αρχείο templog.txt στο οποίο εγγράφονται οι αλλαγές, η διαδικασία εγγραφής αποκλείεται από το στέλεχος lock(obj).

Ως αποτέλεσμα, μετά τη δημιουργία, την τροποποίηση, τη μετονομασία και τη διαγραφή του αρχείου καταγραφής θα περιέχει κάτι σαν:

Στις 30/07/2015 12:15:40 μ.μ. το αρχείο D:\Temp\New Text Document.txt δημιουργήθηκε στις 30/07/2015 12:15:46 μ.μ. το αρχείο D:\Temp\New Text Document.txt μετονομάστηκε σε D:\Temp\hello. txt 30/07/2015 12:15:55 μ.μ. αρχείο D:\Temp\hello.txt τροποποιήθηκε 30/07/2015 12:15:55 μ.μ. αρχείο D:\Temp\ Το hello.txt τροποποιήθηκε 30/07/2015 12:16:01 μ.μ. αρχείο D: \Temp\hello.txt έχει αφαιρεθεί

Στην ίδια την κλάση υπηρεσιών Service1, ορίζεται ένας αριθμός επιλογών στον κατασκευαστή:

This.CanStop = true; // η υπηρεσία μπορεί να διακοπεί αυτό.CanPauseAndContinue = true; // η υπηρεσία μπορεί να τεθεί σε παύση και στη συνέχεια να συνεχιστεί αυτό.AutoLog = true; Η υπηρεσία // μπορεί να γράψει στο αρχείο καταγραφής

Στη μέθοδο OnStart(), καλείται ένα νέο νήμα για να ξεκινήσει το αντικείμενο Logger:

Προστατευμένη παράκαμψη κενό OnStart(args συμβολοσειράς) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start();

Το νέο νήμα είναι απαραίτητο επειδή το τρέχον νήμα επεξεργάζεται μόνο εντολές SCM και πρέπει να επιστρέψει από τη μέθοδο OnStart το συντομότερο δυνατό.

Όταν λαμβάνεται μια εντολή από το SCM για διακοπή της υπηρεσίας, ενεργοποιείται η μέθοδος OnStop, η οποία καλεί τη μέθοδο logger.Stop(). Η επιπλέον καθυστέρηση θα επιτρέψει στο νήμα του καταγραφικού να σταματήσει:

Προστατευμένη παράκαμψη void OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Ωστόσο, η ίδια η κατηγορία υπηρεσιών δεν είναι αρκετή. Πρέπει επίσης να δημιουργήσουμε ένα πρόγραμμα εγκατάστασης υπηρεσιών.

Ή την επιφάνεια εργασίας των χρηστών (τόσο τοπικό όσο και απομακρυσμένο), ωστόσο, για ορισμένες υπηρεσίες, είναι δυνατή μια εξαίρεση - αλληλεπίδραση με την κονσόλα (αριθμός συνεδρίας 0, στην οποία ο χρήστης είναι συνδεδεμένος τοπικά ή όταν ξεκινά η υπηρεσία mstscμε το κλειδί /console).

Υπάρχουν διάφοροι τρόποι για τις υπηρεσίες:

  • Απαγορεύεται η εκτόξευση·
  • χειροκίνητη εκκίνηση (κατόπιν αιτήματος).
  • αυτόματη εκκίνηση κατά την εκκίνηση του υπολογιστή.
  • αυτόματη (καθυστερημένη) εκκίνηση (παρουσιάστηκε στα Windows Vista και στον Windows Server 2008).
  • απαιτούμενη υπηρεσία/πρόγραμμα οδήγησης (αυτόματη εκκίνηση και αδυναμία (για τον χρήστη) διακοπής της υπηρεσίας).

Λειτουργία φόντου

Έναρξη, διακοπή και αλλαγή υπηρεσιών Windows

Οι υπηρεσίες και τα χαρακτηριστικά τους μπορούν να αλλάξουν στο MMC:

Διαφορετικές εκδόσεις λειτουργικών συστημάτων μπορεί να έχουν ορισμένες υπηρεσίες και όχι άλλες. Ορισμένες εφαρμογές και προγράμματα που εγκαθίστανται χωριστά μπορούν επίσης να δημιουργήσουν τις δικές τους υπηρεσίες.

Λίστα υπηρεσιών λειτουργικού συστήματος Microsoft Windows

Εμφανιζόμενο όνομα Ονομα Υπηρεσίας Λειτουργίες Περιγραφή
πελάτης DHCP dhcp Καταχωρεί και ενημερώνει διευθύνσεις IP και εγγραφές DNS για αυτόν τον υπολογιστή. Εάν διακοπεί αυτή η υπηρεσία, αυτός ο υπολογιστής δεν θα μπορεί να αποκτήσει δυναμικές διευθύνσεις IP και να εκτελεί ενημερώσεις DNS.
πελάτης DNS dnscache Η υπηρεσία DNS Client (dnscache) αποθηκεύει προσωρινά τα ονόματα συστήματος ονομάτων τομέα (DNS) και καταχωρεί το πλήρως αναγνωρισμένο όνομα αυτού του υπολογιστή. Εάν η υπηρεσία διακοπεί, η ανάλυση ονόματος DNS θα συνεχιστεί. Ωστόσο, τα αποτελέσματα των ουρών ονομάτων DNS δεν θα αποθηκευτούν προσωρινά και το όνομα του υπολογιστή δεν θα καταχωρηθεί.
KtmRm για συντονιστή κατανεμημένων συναλλαγών KtmRm Συντονίζει τις συναλλαγές μεταξύ του MSDTC και του Kernel Transaction Manager (KTM).
ReadyBoost EMDMgmt ReadyBoost Υποστήριξη για τη βελτίωση της απόδοσης του συστήματος με την τεχνολογία ReadyBoost.
Superfetch SysMain Superfetch Διατηρεί και βελτιώνει την απόδοση του συστήματος.
Windows Audio Audiosrv Διαχείριση εργαλείων ήχου για προγράμματα Windows. Εάν διακοπεί αυτή η υπηρεσία, οι συσκευές ήχου και τα εφέ δεν θα λειτουργούν σωστά.
Χώρος καρτών Windows IDSVC Παρέχει έναν ασφαλή τρόπο δημιουργίας, διαχείρισης και έκθεσης ψηφιακών ταυτοτήτων.
Αυτόματη ενημέρωση WUAUSERV Περιλαμβάνει λήψη και εγκατάσταση ενημερώσεων των Windows. Εάν η υπηρεσία είναι απενεργοποιημένη, αυτός ο υπολογιστής δεν θα μπορεί να χρησιμοποιήσει αυτόματες ενημερώσεις ή την τοποθεσία του Windows Update στο Web.
Κλήση απομακρυσμένης διαδικασίας (RPC) RpcSs Παρέχει χαρτογράφηση μεταξύ τελικών σημείων και άλλων υπηρεσιών RPC.

Λίστα υπηρεσιών που δημιουργούνται από εφαρμογές και προγράμματα της Microsoft

Παραδείγματα Υπηρεσιών που δημιουργήθηκαν από Εφαρμογές και Προγράμματα Τρίτων

Εμφανιζόμενο όνομα Ονομα Υπηρεσίας Λειτουργίες Περιγραφή
Διακομιστής ESET HTTP EhttpSrv προστασία από ιούς Στοιχείο διακομιστή ESET HTTP