Windows PowerShell - servicii Windows scris în PowerShell

Produse și tehnologii:

Serviciile Windows, Windows PowerShell, C #

Acest articol discută despre:

  • arhitectura pentru Windows-service;
  • gestionarea serviciilor pentru Windows;
  • utilizați fragmente de cod în C # în script-urile Windows PowerShell;
  • Scrierea unui serviciu autonom în Windows PowerShell.

Windows serviciu (Windows Services) - aceasta este, de obicei, programul compilat pe C, C ++, C # sau alte limbi bazate pe Microsoft .NET Framework, și depanare a unor astfel de servicii este foarte dificil. Acum câteva luni, inspirat de faptul că alte sisteme de operare permit servicii de scris, ca un script de shell simplu, am început să mă întreb dacă există în Windows mod mai ușor de a le crea.

Acest articol prezintă rezultatul final al acestor eforturi: un mod nou și ușor de a crea pentru Windows servicii. Ele pot fi scrise în limbajul de scripting în Windows PowerShell. Nu mai compila un cicluri mai rapide „edit-test“, care pot fi efectuate în orice sistem, și nu numai pe computerul dezvoltatorului.

Ce este un Windows-Service?

Windows Service - un program care rulează în fundal, fără intervenția utilizatorului. De exemplu, un server de web, care este „silențios“ răspunde la HTTP-solicitări de pagini web de pe web, acesta este un serviciu, precum și o aplicație de monitorizare, indicatori de performanță pur și simplu de înregistrare sau de fixare evenimente hardware de la senzori.

Serviciile pot fi rulate automat la pornirea sistemului. Sau rulat la cerere atunci când acestea sunt solicitate de aplicații care se bazează pe ele. Serviciul rulează în propria sesiune Windows, care este diferit de UI-sesiune. Ei lucrează într-o serie de procese de sistem cu regula atent selectate pentru a limita riscurile legate de securitate.

Servicii Windows Manager Control

Serviciile sunt gestionate pentru Windows Control Service Manager de (SCM). CSM este responsabil pentru configurarea serviciilor și pornirea și oprirea lor, și așa mai departe. D.

Panoul de control al CSM disponibile prin panoul de control | Sistem și securitate | Instrumente de administrare | Servicii. Așa cum se arată în Fig. 1. Se afișează o listă a tuturor serviciilor configurate cu numele, descrierea, starea, tipul lor de pornire și numele contului.

Windows PowerShell - servicii Windows scris în PowerShell

Fig. 1. Windows Serviciul de control GUI manager în Windows 10

Pentru CSM are, de asemenea, o linie de comandă interfețe.

  • net.exe de utilitate vechi, cu comenzi bine cunoscute net start și net stop, lăsând rădăcinile deja în MS-DOS! În ciuda numelui său, acesta poate fi folosit pentru a porni și opri orice serviciu, nu doar servicii de rețea. Introduceți net de ajutor, pentru a obține o descriere detaliată.
  • utilitate mai puternic, Sc.exe, introdus în Windows NT, oferă un control granular asupra tuturor aspectelor legate de managementul serviciului. Enter sc /. pentru o descriere detaliată.

Aceste utilitati linie de comandă, dacă acestea sunt prezente în Windows 10 sunt acum considerate depășite, și se recomandă să utilizați Windows PowerShell funcții de management de serviciu, după cum va fi descris mai jos.

Cum de a prinde net.exe, și de a folosi numele Sc.exe „scurt“, într-un serviciu de cuvânt, care, din păcate, nu coincide cu un nume mai descriptiv, afișat în panoul de control al CSM. Pentru a obține corespondența dintre cele două nume, utilizați comanda get-serviciu din Windows PowerShell.

starea de serviciu

Serviciul poate fi în diferite state. Sunt necesare unele condiții, altele sunt opționale. Două condiții de bază care trebuie să fie susținute de toate serviciile: oprirea (oprit) și să fie difuzate (pornit). Aceste stări, respectiv, prezentate ca celulă goală sau Running (Running) Coloana Stare din Fig. 1.

În al treilea rând, nu este o condiție obligatorie - Întreruptă (întreruptă). Și încă o stare implicită menținută de către fiecare serviciu, chiar dacă nu este menționat nicăieri, - Dezinstalată (Șters).

Oră poate tranziția între aceste stări așa cum se arată în Fig. 2.


Fig. 2. Statutul serviciului

În cele din urmă, există mai multe stări de tranziție, care serviciu poate sprijini (opțional): StartPending, StopPending, PausePending, ContinuePending. Ele sunt utile numai în cazul în care tranzițiile de stat să ia o lungă perioadă de timp.

Servicii de management funcționalitate în Windows PowerShell

  • numele de funcții consistente;
  • complet orientat pe obiect;
  • gestionare ușoară a oricărei NET-obiect.

Windows PowerShell oferă multe funcții de management de servicii, cunoscut sub numele de cmdleturile (cmdleturi). Câteva exemple sunt prezentate în tabelul. 1.

Tabel. 1. funcții de management de serviciu în Windows PowerShell

Înregistrează fișierul executabil de serviciu în CSM


Prin implementarea acestor metode, serviciul va fi gestionat de către CSM și poate fi rulat automat la pornire sau la cerere; În plus, un astfel de serviciu poate fi pornit sau oprit manual prin intermediul CSM panoul de control, net.exe echipa vechi / Sc.exe sau noi funcții pentru Windows PowerShell pentru a gestiona servicii.

Toate serviciile trebuie să creeze .NET-un obiect derivat din clasa ServiceBase.

Crearea unui fișier executabil de la codul sursă în C #, built-in script-ul Windows PowerShell

PowerShell simplifică utilizarea NET-obiecte în script-uri. Implicit de suport încorporat pentru multe tipuri de NET-obiecte, este suficient pentru majoritatea sarcinilor. Chiar mai bine este că este extensibil și vă permite să încorporați fragmente scurte de C # -Code în script Windows PowerShell pentru a adăuga suport pentru orice alte NET-funcționalitate. Această capacitate este asigurată de comandă Add-Type, care, în ciuda numelui său, se poate face mult mai mult decât pur și simplu adăugarea de suport pentru noi tipuri de NET obiecte din Windows PowerShell. Este chiar și vă permite să compilați și link-ul o aplicație completă C # pe bază în noul fișier executabil. De exemplu, următorul script Windows PowerShell, hello.ps1:

Comasarea

Oportunități PSService.ps1 Bazat pe tot ce am discutat în acest moment, pot crea serviciul Windows PowerShell, pe care am visat - scenariul PSService.ps1, care:

  • poate să se instaleze și să eliminați (utilizând funcțiile Windows PowerShell pentru gestionarea serviciului);
  • se poate porni și opri-te (folosind același set de funcții);
  • Acesta include un fragment scurt C # -Code generând PSService.exe pentru SCM (prin comenzi Add-Type);
  • face un apel invers de la PSService.exe conectați script PSService.ps1 pentru a face funcționarea efectivă de serviciu (ca răspuns la evenimente OnStart, OnStop și colab.);
  • CSM este controlat de panou si orice utilitati linie de comandă (ștecher datorită PSService.exe);
  • este vina tolerant și să gestioneze cu succes orice comandă în timp ce, în orice stare. De exemplu, se poate opri automat serviciul înainte de a scoate-l, sau nu fac nimic, dacă el se va solicita să înceapă deja servicii de funcționare;
  • Aceasta susține Windows 7 și toate versiunile ulterioare de Windows (utilizând funcționalitatea numai pentru Windows PowerShell v2).

Rețineți că, în acest articol am atins pe o parte critică a proiectării și implementării PSService.ps1. Script exemplu include, de asemenea, codul de depanare într-un fel susține funcționalitatea opțională a serviciilor, dar descrierea acesteia ar complica inutil explicația.

Arhitectura script PSService.ps1 este organizat într-o serie de secțiuni:

variabilele globale

Chiar în spatele unității de script-ul Param PSService.ps1 conține variabile globale care definesc setările globale care pot fi modificate, dacă este necesar. Valorile implicite sunt prezentate în tabelul. 3.

Tabel. 3. Valorile implicite pentru variabile globale

valoarea prestabilită

Numele de un cuvânt comenzi utilizate net start, și alte

Numele de bază a scenariului

Serviciu nume mai descriptiv

Serviciul PowerShell Exemplu

serviciu în cazul în care sunt instalate fișierele

numele fișierului, care sunt înregistrate serviciul de mesaje

Jurnal evenimente Numele evenimentelor de serviciu înregistrate

argumente în linia de comandă

Pentru a simplifica utilizarea, script-ul acceptă comanda argumente de linie care corespund tranzițiilor în toate statele, așa cum se arată în tabel. 4.

Tabel. 4. Argumentele din linia de comandă pentru tranziția de stat

Pentru managementul service este responsabil CSM. Fiecare operațiune de pornire trebuie să treacă prin CSM, astfel încât să poată monitoriza starea de sanatate a serviciilor. Prin urmare, chiar dacă utilizatorul dorește să inițieze manual lansarea serviciului prin script-ul, de pornire trebuie să fie efectuată ca o cerere de CSM. În acest caz, secvența de operație este listată mai jos.

  1. Utilizatorul (administrator) declanșează prima instanță: PSService.ps1 -Start.
  2. Această primă instanță raportează CSM începe serviciul: Start-Service $ SERVICENAME.
  3. CSM efectuează PSService.exe. Procedura său principal creează un obiect de serviciu și apoi apelează metoda Run sale.
  4. CSM solicită metoda OnStart a obiectului de serviciu.
  5. C # -Metoda OnStart lanseaza a doua copie a scenariului: PSService.ps1 -Start.
  6. Această a doua instanță este acum rulează în fundal ca un utilizator de sistem se execută de-al treilea exemplar, care va fi amintit ca un serviciu real: PSService.ps1 -Serviciul. Această instanță și rulează ca un serviciu.

Ca rezultat, se va efectua două sarcini: PSService.exe și PowerShell.exe exemplu, care efectuează PSService.ps1 -Serviciul.

Pentru managementul service este responsabil CSM.

Toate acestea se face în trei părți ale codului în script.

  • definiție cheie -Start în blocul Param la începutul script-ul:
  • În procedura principală, la sfârșitul script-ul în cazul în care blocul mânere -Start cheie:
  • Un fragment din codul sursă pentru C #, procedura principală, iar conductorul OnStart, care execută comanda PSService.ps1 -Start, așa cum se arată în Fig. 4.

Fig. 4. Procesor de cod de pornire

Obținerea statutului de serviciu

-Status handler pur si simplu cere statutul CSM serviciului și transmite-l la transportorul de ieșire:

Dar, în etapa de depanare, puteți întâlni un script defect, de exemplu, din cauza unor erori de sintaxă în script-ul, și așa mai departe. N. În astfel de cazuri, statul CSM poate fi viciate în cele din urmă. Am ajuns în această situație de câteva ori la pregătirea acestui articol. Pentru a ajuta la diagnosticarea unor astfel de probleme, este recomandabil să verificați totul și pentru a căuta instanțe -Serviciul:

Oprirea și îndepărtarea

Oprire și eliminare operațiuni, în esență, a anula ceea ce a fost făcut Start și configurare operațiuni, respectiv:

  • -stop (atunci când un utilizator începe) raportează CSM pentru a opri serviciul;
  • La pornirea sistemului PSService.ps1 -Serviciul copie a unei distruse;
  • -Stergem oprește serviciul, anulați înregistrarea acesteia folosind Sc.exe șterge $ NumeServiciu, și apoi ștergeți fișierele din directorul de instalare.

În plus, punerea în aplicare a acestora este foarte asemănătoare cu cea pentru Setup și Start.

  1. Definirea fiecare cheie în blocul Param la începutul script-ul.
  2. în cazul în care procesele unitare cheie în procedura principală la sfârșitul script-ul.
  3. Pentru funcționare Stop C # fragmente are procesor pentru OnStop, care declanseaza PSService.ps1 Stop. Opriți funcționarea funcționează diferit în funcție de tipul de utilizator - real sau sistem.

Înregistrarea evenimentelor într-un jurnal

Serviciul rulează în fundal, fără UI. Acest lucru face dificilă pentru a le depana: modul de a diagnostica că eșuează atunci când nu reflectă în natura sa? Metoda obișnuită - pentru a înregistra toate mesajele de eroare cu marcaje de timp și de a înregistra evenimente importante care au trecut cu succes, cum ar fi tranzițiile de stare.

Serviciul rulează în fundal, fără UI. Acest lucru face dificilă pentru a le depana: modul de a diagnostica că eșuează atunci când nu reflectă în natura sa?

Script Exemplu PSService.ps1 implementează două metode diferite de logare și le utilizează în ambele locații strategice (inclusiv fragmentele de cod afișate anterior, în care aceste metode au fost îndepărtate pentru a clarifica funcționarea de bază).

  • O metodă de înregistrare în caz de aplicare obiecte log din numele serviciului ca numele sursei, așa cum se arată în Fig. 5. Acestea sunt evenimentele observate în Event Viewer, și poate filtra și de căutare prin utilizarea tuturor mijloacelor de acest utilitar. Puteți obține, de asemenea, aceste înregistrări prin utilizarea Get-EVENTLOG:

adaptarea serviciului

Pentru a crea propriul serviciu, pur și simplu urmați pașii de mai jos.

  • Serviciu de copiere, un exemplu al unui fișier nou cu un nou nume de bază, de exemplu, C: \ Temp \ MyService.ps1.
  • Schimbarea lungimea numelui de serviciu în secțiunea variabile globale.
  • Înlocuiți pentru a face în handler -Serviciul la sfârșitul script-ul. În acest moment, în timp ce blocul ($ true) pur și simplu conține un cod de dezvoltare care se trezește la fiecare 10 secunde și înregistrate într-un raport de fișier jurnal:

Pentru mai multe informații, consultați. Bara laterală „link-uri.“

Evident, un astfel de scenariu de serviciu, cum ar fi aceasta, nu poate egala performanța unui program compilat. Script de serviciu scris în Windows PowerShell, foarte convenabil pentru a testa conceptul și pentru probleme cu low-cost în termeni de performanță, cum ar fi monitorizarea sistemului, serviciile clustering, și așa mai departe. D. Dar, pentru orice high-sarcini pentru a rescrie serviciul în C ++ sau C #.

În plus, amprenta de memorie este mai mare decât cea a programului compilat, deoarece necesită un full-featured descărcare Windows PowerShell interpret în sesiune de sistem. Dar, în calculatoare moderne, cu mai multe gigabytes de memorie nu contează cu adevărat.

Acest scenariu nu are absolut nici o legătură cu PS-service.exe Mark Russinovich (Mark Russinovich). Am ales numele PSService.ps1 înainte de a aflat de coincidență de nume. În cele din urmă am salvat numele de script-exemplu în acest sens, deoarece clarifică scopul scenariului. Desigur, dacă doriți să experimentați cu serviciul dvs. pe baza de Windows PowerShell, trebuie să-l redenumiți pentru a obține un nume de serviciu unic de la un nume de bază unică a script-ul!

Îmi exprim recunoștința pentru articole de revizuire expert JDH IT Solutions Jeffery Hicks (Jeffery Hicks).

Am făcut un serviciu de ferestre în urma acestui articol. Totul funcționează bine și am simtit ca sunt un :) foarte programator. Dar am o problemă - acest serviciu consumă prea multă memorie. De fapt, pentru serviciul de aproximativ 6 ore consumat 3 GB și memorie cred că e nr.

Arată bine, se execută mare, și da, am rula sub un cont de serviciu diferit, fără efecte secundare grave.

Deci, ai scris un serviciu de probă care are o lungime de 1000 de linii. Mulțumesc, dar voi sări peste.

Recent am folosit acest lucru ca bază pentru o nevoie de client, și într-adevăr apreciat acest lucru. Am nevoie pentru a face o ușoară modificare pentru a permite serviciului pentru a rula sub un cont de serviciu, altele decât localsystem, în vederea efectuării unor operațiuni de rețea, som.

Interesant articol. Există vreun articol care arată modul în care Powershell poate fi folosit pentru a apela un serviciu REST pe bază?

Acest articol prezintă un roman și mod ușor de a crea servicii Windows, prin scrierea lor în limbajul de scripting PowerShell, mai degrabă decât C # sau C ++. Nu mai compilare, doar un ciclu de editare / test rapid ce se poate face pe orice sistem. Citiți acest articol în.