38

Windows Service

Embed Size (px)

Citation preview

Page 1: Windows Service
Page 2: Windows Service

1390-2011 [Windows services]

ث بم ذسا

Windows services

:مطالة این گفتار

هؼوبضیwindows service

هت ثطبه بیwindows service

وشطل ثطبه بیwindows service

ػیت یبثیwindows service

windows service ثطبه بیی ؿشس و هی ساس زض گبم ضا اساظی ؾیؿشن ثسى یبظ ث ط چیعی زض ،

.ظهبى ضز ث هبقیي ث ض ذزوبض آغبظ قس

ثمی ی فهل ث چگگی ؾبذز، ظبضر، وشطل . ضا اضای هی زسwindows serviceثرف ظیط هؼوبضی اظ

. هی دطزاظزwindows serviceػیت یبثی

windows service؟ چیست

windows service وبضثطزبیی ؿشس و هی ساس ث ض ذزوبض ظهبی و ؾیؿشن ػبهل زض حبل آهسى ثبال

.ؿز اجطا قس

ایي ثطبه بی وبضثطزی هی ساس ثسى زاقشي هحبض ای ثب وبضثطاى اضز قس ث ؾیؿشن، سؼسازی اظ دطزاظـ

.ب ضا زض دؽ ظهی ث اجطا زض آضز

ثسى اضز قسى (client)ث ػاى هظبل، زض یسظ ؾطض، ذسهبر قجى ای ؾیؿشن ثبیس اظ طف هكشطی

ثط ضی ؾیؿشن هكشطی ذسهبر ث قوب اجبظ ثسؾز آضزى ؿر .وبضثطی ث ؾطض لبثل زؾشیبثی ثبقس

.جسیسی طم افعاض اظ طیك ایشطز یب اجبم سؼسازی ػولیبر دبوؿبظی فبیل ثط ضی زیؿه هحلی ضا هی زس

اظ یه حؿبة یػ دیىطثسی قس یب اظ حؿبة windows service قوب هی سایس ثب ایجبز یه دیىطثسی

.وبضثطی ؾیؿشوی آى ضا اجطا ویس حؿبة وبضثطی و زاضای ؾح زؾشطؾی ثبالسط اظ هسیط ؾیؿشن اؾز

. اؾزwindows serviceذالف آى چیعی و شوط قس، ظهبی و هب ث ذسهبر اقبض هیىین هظض وبى

Page 3: Windows Service

1390-2011 [Windows services]

:زض ایجب چس و اظ ذسهبر ضا شوط هی وین

ذسهبرTCP/IP ثطبه ی ذسهبسی ؾبز ای اؾز و هیعثبى ثطذی اظ ؾطض بی وچه TCP/IP

. زیگطecho, daytime,quote: ؿشس

ة جبى گؿشطز و ای اظ ذسهبر ؾطیؽ االػبسی ایشطز(IIS) اؾز.

طجز لبیغ ذسهشی ثطای گعاضـ زی دیبم ب ث ؾیؿشن طجز گعاضـ هی ثبقس.

جؿشجی یسظ ذسهشی اؾز و ثبػض ث جز آهسى قبذم ضی زاز بی زیؿه هیكز.

و زض قىل ظیط وبیف زاز قس اؾز، ثطای زیسى و ی Services administrationقوب هی سایس اظ اثعاض

.ایي ثطبه ضا هی ساى زض اثعاضبی هسیطیشی ؾیؿشن سبى دیسا ویس. ذسهبر ثط ضی ؾیؿشن سبى اؾشفبز ویس

windows serviceمؼماری

: الظم اؾزwindows service ع ثطبه ثطای 3

ثطبه ی ؾطیؽ

ثطبه ی وشطل ؾطیؽ

ثطبه دیىطثسی ؾطیؽ

ثب ثطبه ی وشطل .ػولیبسی و قوب زض ثطبه ؾطیؽ ث زجبل آى ؿشیس ذز ؾطیؽ آب ضا فطان هیىس

ؾطیؽ، لبزض ذایس ثز زضذاؾز بی وشطلی ث ؾطیؽ اظ جول قطع، ذبسو، هىض ازاه ضا

زض ؾیؿشن وذی قز، زض :ثب ثطبه دیىطثسی ؾطیؽ، یه ؾطیؽ هی ساس هت قز.اضؾبل ویس

Page 4: Windows Service

1390-2011 [Windows services]

اگط چ اجعا زار ز ثب یه زؾشض . ث ػاى یه دیىطثسی ؾطیؽ هحؿة قز.ضجیؿشطی قش قز

اهب هت ضا .ظیطا و آب یبظی ث قشي االػبسی زض ضجیؿشطی ساضس. هت هی قسxcopyؾبز

ثطبه ی دیىطثسی ؾطیؽ وچیي هی ساس ثطای .اساظی ؾطیؽ ب یبظ ث دیىطثسی ضجیؿشطی زاضس

.سغییط سظیوبر آى ؾطیؽ زض ثؼس ب اظ وبى م هضز اؾشفبز لطاض گیطز

. زض ثرف بی ظیط هضز ثحض لطاض گطفش اسwindows service هاز سكىیل زس 3ایي

ترنامه خدماتی

لجل اظ ایى ث زجبل دیبز ؾبظی یه ؾطیؽ زض زار ز ثذطزاظین، اجبظ زیس ث ثطضؾی یه م ظط

هؿشمل اظ آچ و هؼوبضی ؾطیؽ زض یسظ ث ظط هی ضؾس آچ و لبثلیز بی زاذلی اظ یه

windows serviceاؾز ثذطزاظین .

:و یبظ ث ؾ ثرف اؾز.ثطبه ؾطیؽ ػولیبر ذسهبسی ضا دیبز ؾبظی هی وس

یه سبثغ انلی

یه سبثغ ذسهبسی انلی

یه ازاض وس

لجل اظ دطزاذشي ث ایي ثرف ب، هب ث هؼطفی ؾطیغ

و یبظ اؾز هی (SCM)وشطل هسیطیز ذسهبر

.دطزاظین

SCM مف هوی ثطای اضؾبل زضذاؾشبی قوب ثطای

.قطع دبیبى ایفب هی وس

مدیریت کنترل خدمات

SCM زض قىل ظیط ثب یه وزاض .ثركی اظ ؾیؿشن ػبهل اؾز و اضسجببر ضا ثب ؾطیؽ ثطلطاض هیىس

.سالی چگگی وبض وطزى ایي اضسجب ضا كبى هی زس

Page 5: Windows Service

1390-2011 [Windows services]

زض ظهبى ثبال آهسى ؾیؿشن ط فطآیس هجوػ ؾطیؽ بی ذزـ ضا ث ض ذزوبض ث اجطا زض هی آضز

ایي ؾطیؽ ػس زاض طجز بم سبثغ انلی ثطای ط یه اظ . ثبثطایي ظیف انلی فطآیس نسا ظزى هی ثبقس

زض ایي سبثغ، مب .آى اؾز (Main function)م ضز ط ثطبه ؾطیؽ سبثغ انلی.ؾطیؽ ب هی ثبقس

. طجز قس ثبقسSCMضز ثطای سبثغ انلی ؾطیؽ ثبیس ثب

تاتغ اصلی، سرویس اصلی و اداره کننده ها

سبثغ انلی ؾطیؽ هوىي اؾز . اؾزMainآى هشس .سبثغ انلی ؾطیؽ م ضز ػبزی ط ؾطیؽ اؾز

ؾطیؽ .سبثغ انلی ؾطیؽ قبهل ػولیبر بی الؼی اظ ذسهبر اؾز.ثیف اظ یه سبثغ انلی ضا طجز وس

ثطبه ذسهبسی هی ساس ثؿیبضی اظ ؾطیؽ .ثبیس یه سبثغ انلی ثطا ی طجز بم ط ؾطیؿف فطان وس

یه ؾطیؽ windows>\system32\services.exe>بی ذز ضا زض یه ثطبه اضائ زس، ثطای هظبل

اظ Alerter, Application Management, Computer Browser, and DHCP Clientاؾز و قبهل

.جول الالم زیگط

SCMیه ظیف هن زض سبثغ انلی . ن اوى سبثغ انلی ط ؾطیؽ ضا و ثبیس قطع قز نسا هی ظس

. اؾزSCMؾطیؽ طجز یه ازاض وس زض

SCMازاض وس ثبیس دبؾد گ ث ضیساز بیی اظ .ػولىطز ازاض وس لؿوز ؾم اظ یه ؾطیؽ اؾز

ؾطیؽ هی ساس هشلف قز، ث حبلز سؼلیك ضز اظ ؾط گطفش قز ازاض وس ثبیس ث ایي لبیغ .ثبقس

.اوف كبى زس

ثطای SCM، ثطبه وشطل ؾطیؽ هی ساس زضذاؾز بیی ضا ث SCMدؽ اظ طجز یه ازاض وس ثب

ذز ؾطیؽ هؿشمل SCM ثطبه بی وشطل ؾطیؽ اظ .سلف، سؼلیك اظ ؾط گطفشي ؾطیؽ ثفطؾشس

وچیي قوب هی .MMCث ػاى هظبل .ؾیؿشن ػبهل قبهل سؼساز ظیبزی ثطبه بی وشطل ؾطیؽ اؾز.اؾز

و زض SQL SERVER هظبل ذثی هسیطیز دیىطثسی .سایس ذز یه ثطبه وشطل ؾطیؽ ثیؿیس

.قىل ظیط كبى زاز قس اؾز هی ثبقس

Page 6: Windows Service

1390-2011 [Windows services]

ترنامه کنترل سرویس

جز .وبض و اظ بم آى دیساؾز، ثب یه ثطبه وشطل ؾطیؽ، قوب هی سایس ؾطیؽ ضا وشطل ویس

ازاض وس ثبیس ث :سلف، سؼلیك اظ ؾطگیطی ؾطیؽ، قوب هی سایس وس بی وشطلی ث ؾطیؽ ثفطؾشیس

وچیي اهىبى دطؾیسى اظ ؾطیؽ زضثبض ی يؼیز الؼی اـ دیبز ؾبظی یه .ایي وسب اوف كبى زس

.ازاض وس ؾفبضقی ثطای دبؾرگیی ث وس بی وشطلی ؾفبضقی جز زاضز

ترنامه پیکرتندی سرویس

ؾطیؽ ب ضا هت xcopyاظ آجب و ؾطیؽ، ثبیس زض ضجیؿشطی دیىطثسی قز، قوب وی سایس ثب اؾشفبز اظ

و هی ساس ث ض ذزوبض، زؾشی، یب غیط فؼبل سؼییي .ضجیؿشطی قبهل ػی اظ ضا اساظ ؾطیؽ ضا اؾز.ویس

ؾطیؽ : ثطای هظبل .قوب وچیي یبظ ث دیىطثسی ثطبه ؾطیؽ وبضثط اثؿشگی بیی ؾطیؽ زاضیس.قز

سوبهی ایي سظیوبر زاذل یه ثطبه .بیی و ثبیس قطع قس ایي یىی هی ساس لجل اظ آب قطع قز

دیىطثسی ؾطیؽ ثطای دیىطثسی ؾطیؽ اؾشفبز هی قز، اهب وچیي ایي ثطبه هی ساس زظ ظهبى بی ثؼس

.ثطای سغییط دبضاهشطبی دیىطثسی ؾطیؽ هضز اؾشفبز لطاض گیطز

windows serviceکالس هایی ترای

و اظ ؾ ثرف System.ServiceProcessزض چبض چة زار ز، قوب هی سایس والؼ بی زض فبی بم

.دیبز ؾبظی قس اس ثیبثیس

ثطای دیبز ؾبظی یه ؾطیؽ قوب ثبیس آى ضا اظ والؼServiceBaseوالؼ . ث اضص ثجطیس

ServiceBaseثطای طجز ؾطیؽ دبؾرگیی ث زضذاؾز بی قطع، دبیبى اؾشفبز هی قز .

Page 7: Windows Service

1390-2011 [Windows services]

والؼServiceController ثطای دیبز ؾبظی یه ثطبه وشطلی ؾطیؽ هضز اؾشفبز لطاض هی

.ثب اؾشفبز اظ ایي والؼ قوب هی سایس زضذاؾز ب ضا ث ؾطیؽ اضؾبل وبییس.گیطز

والؼ بیServiceProcessInstaller ServiceInstaller و اظ بهكبى دیساؾز، ثطای هت

.دیىطثسی ثطبه بی ؾطیؽ هی ثبقس

.حبال قوب ثطای ؾبذز یه ؾطیؽ جسیس آهبز ؿشیس

windows serviceساخت یک ترنامه

ثب ط زضذاؾز ؾبذش قس اظ .ؾطیؽ و قوب زض ایي گفشبض هی ؾبظیس یه ؾطض هیعثبى مل لل هی ثبقس

الیي ثرف ضا حل .طف هكشطی، ؾطض مل لل یه مل لل سهبزفی اظ فبیل مل لل ضا ثبظ هی گطزاس

قىل ظیط یه وبی ولی ثطای ایي ضا حل .اؾشفبز اظ ؾ اؾوجلی اؾز، یىی ثطای هكشطی زهی ثطای ؾطض

ؾطیؽ فبیل مل لل ضا اظ وف . ػولىطز بی الؼی ضا زاضا هی ثبقسQuoteServerاؾوجلی .ضا اضائ هی زس

یه QuoteClient .حبفظ هی ذاس زضذاؾز بی مل لل ضا ث ووه یه ؾوز ؾطض دبؾد هی زس

ؾهیي . هی ؾبظزQuoteServerایي وبضثطز یه ؾوز هكشطی ثطای اضسجب ثب . غی اؾزWPFثطبه وبضثطزی

ایي ؾطیؽ وشطل ؾطض ; قطع هیكز هشلف هیكزQuoteService .اؾوجلی ؾطیؽ انلی اؾز

لجل اظ ایجبز ثرف ؾطیؽ ثطبه سبى، ث ایجبز یه ؾوز ؾطض ؾبز ايبفی زض وشبثرب والؼ ؾی .اؾز

.قبضح و هی ساى آى ضا ثطای دطزاظـ فطآیسب هضز اؾشفبز لطاض زاز هی دطزاظین

Page 8: Windows Service

1390-2011 [Windows services]

ایجاد ػملیات اصلی ترای سرویس

ثؿبظیس، اظ جول اؾىي فبیل ب ثطای اجبم دكشیجبى windows serviceقوب هی سایس، لبثلیز بیی زض یه

ثب ایي حبل، و ی ثطبه بی ؾطیؽ سؼساز قجبز . WCFگیطی یب ثطضؾی یطؼ یب قطع یه ؾطض

زض ایي ثرف و .، سلف سؼلیك ضا زاضا ثبقس( ثبظگكز ث نسا ظس)ثطبه ثبیس لبزض ث قطع.هكشطوی زاضس

.دیبز ؾبظی ثب اؾشفبز اظ یه ؾطض ؾوز اجبم هیكز

ضا هی ساى ث ػاى ثركی اظ اجعا یسظ و هت قس اس TCP/IP، ؾطیؽ بی ؾبز 7ثب اؾشفبز اظ یسظ

. اؾزTCP/IPاؾز، و ؾطض qotd یب ”,TCP/IP “quote of the dayثركی اظ ؾطیؽ بی ؾبز .زاؿز

گـ هی زس ث ط زض ذاؾشی ثب یه دیبم سهبزفی اظ فبیل 17ایي ؾطیؽ ؾبز، ث دضر

<windir>\system32\drivers\etc\quotesثب ایي ؾطیؽ و، یه ؾطض هكبث ؾبذش . جاة هی زس

.ذاس قس

و یه ضقش اؾىی ثط هی good-old qotdثط ذالف ؾطض . ؾطض و یه ضقش ییىس ضا ثبظ هی گطزاس

.گطزاس

هجغ وس ظیط ضا . ثؿبظیس وسی ثطای ؾطض دیبز ؾبظی ویسQuoteServerرؿز، یه وشبثرب والؼ ث بم

. دیبز ؾبظی ویسQuoteServer.cs سبى زض فبیل QuoteServerثطای والؼ

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace Wrox.ProCSharp.WinServices { public class QuoteServer { private TcpListener listener; private int port; private string filename; private List<string> quotes; private Random random; private Thread listenerThread;

code snippet QuoteServer/QuoteServer.cs

گطاجبض قس اؾز ث ضی و یه بم فبیل یه دضر ثطای نسا ظزف زاز هی ()QuoteServerؾبظس

. ثطای ؾطض اؾشفبز هیىس7890ؾبظس ای و فم بم فبیل ضا هی فطؾشس ث ض دیف فطو اظ دضر . قز

Page 9: Windows Service

1390-2011 [Windows services]

. سؼطیف وطز اؾزquotes.txtؾبظس دیف فطو، بم دیف فطيی ضا ثطای مل لل ث ػاى

public QuoteServer() : this ("quotes.txt") { } public QuoteServer(string filename) : this(filename, 7890) { } public QuoteServer(string filename, int port) { this.filename = filename; this.port = port; }

ReadQuotes() یه هشس ووىی اؾز و سوبهی مل لل ب اظ فبیل هكرم قس زض ؾبظس ضا هی

ػال ثط ایي، یه و اظ والؼ . مل لل ب ايبف قس اس<List<stringسوبهی مل لل ب ث .ذاس

Randomثؿبظیس و ثطای زضیبفز مل لل بی سهبزفی ث وبض هی آیس .

protected void ReadQuotes() { quotes = File.ReadAllLines(filename).ToList(); random = new Random(); }

ایي هشس یه مل لل سهبزفی اظ . هی ثبقس()GetRandomQuoteOfTheDayیه زیگط اظ هشس بی ووىی

.هجوع مل لل ب ضا ثبظ هی گطزاس

protected string GetRandomQuoteOfTheDay() { int index = random.Next(0, quotes.Count); return quotes[index]; }

ضا ثب اؾشفبز اظ هشس <List<string، فبیل هطجغ قبهل مل لل بیی اؾز و مل لل بی ()Startزض هشس

هی ()ListenerThreadدؽ اظ ایي، د ثالفبنل قطع ث نسا ظزى هشس . هی ذاس()ReadQuotesووىی

وی ساس هؿسز هشظط یه هكشطی ()Startزض ایجب یه د هضز اؾشفبز لطاض گطفش اؾز چطا و هشس .وس

فطو هی وس و زض آغبظ ثب قىؿز هاج SCM.(SCM) آى ضا ثالفبنل ث نسا ظس ثبظ گطزاسهیجبیؿشی .قز

د . ( طبی30هظال ط )قس اؾز، زض نضسی و هشس وی ساس ث ضقی ثگبم یب ثجب نسا ظس ضا ثطگطزاس

قس ث ػاى د دؽ ظهی ػول هیىس ث ضی و ثطبه وبضثطزی هی ساس ثسى سلف ایي د ذبضع

ذهنیز بم د سظین قس اؾز چطا و ث اقىبل ظزایی ووه هی وس، ث ػاى اؾوی زض اقىبل . قز

.ظزایی اضای هی قز

Page 10: Windows Service

1390-2011 [Windows services]

public void Start() { ReadQuotes(); listenerThread = new Thread(ListenerThread); listenerThread.IsBackground = true; listenerThread.Name = "Listener"; listenerThread.Start(); }

()AcceptSocketهشس . هی ثبقسTcpListener ؾبذز یه و اظ ()ListenerThreadػولىطز یب ظیف د

یه ؾوز ()AcceptSocket ث هحى ایى هكشطی اسهبل ثطلطاض وطز، .هشظط اسهبل یه هكشطی هی هبس

مل لل سهبزفی ضا و ()GetRandomQuoteOfTheDay زض هطحل ثؼس، هشس.اضسجب ثب هكشطی ضا ثط هی گطزاس

.ثطهیگطزاس. ()socket.Sendثطای اضؾبل ث هكشطی اؾز ثب اؾشفبز اظ

protected void ListenerThread() { try { IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); listener = new TcpListener(ipAddress, port); listener.Start(); while (true) { Socket clientSocket = listener.AcceptSocket(); string message = GetRandomQuoteOfTheDay(); UnicodeEncoding encoder = new UnicodeEncoding(); byte[] buffer = encoder.GetBytes(message); clientSocket.Send(buffer, buffer.Length, 0); clientSocket.Close(); } } catch (SocketException ex) { Trace.TraceError(String.Format("QuoteServer {0}", ex.Message)); } }

Stop(),Suspend(), and: ، هشسبی ظیط ثطای وشطل ؾطیؽ یبظ اؾز هبس()Startػال ثط ایي هشس

Resume():

public void Stop() { listener.Stop(); } public void Suspend() { listener.Stop(); } public void Resume() { Start(); }

Page 11: Windows Service

1390-2011 [Windows services]

اگط فبیل حبی مل لل ب سغییط وس، ایي هشس . هی ثبقس()RefreshQuotesزیگط هشس لبثل زؾشطؼ ػوهی

.زثبض فبیل ضا هی ذاس

public void RefreshQuotes() { ReadQuotes(); } } }

لجل اظ ایجبز یه ؾطیؽ دیطاهى ؾطض، هفیس اؾز و یه ثطبه آظهبیكی ثؿبظین و سب یه و اظ

ث ایي سطسیت قوب هی سایس لبثلیز بیی ضا . ضا نسا ثعس()Start ضا ایجبز وس هشس QuoteServerوالؼ

ایي ؾطیؽ آظهبیكی ثبیس ث ض زؾشی آغبظ قس، .ثسى یبظ ث ازاض وس یه ؾطیؽ ذبل آظهبیف ویس

. هی سایس ث آؾبی وس آى ضا ثب یه اقىبل ظزایی دیبز ؾبظی ویس

ث اؾوجلی والؼ (ضفطؽ)قوب ث اضجبػی.TestQuoteServerثطبه آظهبیكی یه وبضثطز وؿل هی ثبقس،

QuoteServerفبیل حبی مل لل ب ضا ثبیس زض هؿیط . یبظ زاضیسc:\ProCSharp\

Servicesدؽ اظ فطاذای ؾبظس، هشس .(یب ثبیس آضگهبى ؾبظس ایي فبیل وذی قس ضا سغییط زیس) وذی ویس

Start() والؼ و ؾبظی قس QuoteServerهشس . نسا ظز هی قزStart() ثالفبنل ثؼس اظ ایجبز یه د

. فكبض زاز قزreturnثبظ هی گطزز، ثبثطایي ثطبه وؿل سب ظهبی اجطا هی هبس سب

static void Main() { var qs = new QuoteServer("quotes.txt", 4567); qs.Start(); Console.WriteLine("Hit return to exit"); Console.ReadLine(); qs.Stop(); }

code snippet TestQuoteServer/Program.cs

ضی هیعثبى هحلی هضز اؾشفبز لطاض 4567 زض ظهبى اجطا اظ دضر QuoteServerسج زاقش ثبقیس و ثطبه

.قوب ثبیس اظ ایي سظیوبر ثطای هكشطی اؾشفبز ویس.هی گیطز

quoteClientمثال

ایي ثطبه . اؾز، و هی ساس مل لل ب ضا اظ ؾطض زضذاؾز وسWPFهكشطی یه ثطبه وبضثطی ؾبز

ثطای اضسجب ثب ؾطض زض حبل اجطا اؾشفبز هی وس، دیبم بی ثبظگكشی ضا TcpClientوبضثطزی اظ والؼ

ضاث وبضثطی سب قبهل یه زوو یه وبزض هشي .زضیبفز وطز زض یه جؼج هشي آى ضا وبیف هی زس

Page 12: Windows Service

1390-2011 [Windows services]

جؼج هشي x:Name ؿجز زاز قس اؾز، ذهنیز بم OnGetQuoteضیساز ولیه زوو ث هشس .هی ثبقس

. سظین قس اؾزtextQuoteثب

قوب هی سایس ثب .ؾطض االػبر هطث ث دضر ثطای اسهبل ث ؾطض، ثب سظیوبر ثطبه دیىطثسی قس اس

زاذل ذهنیبر دطغ Settings (ظثب)ؾط ثطي

زض ایجب، هی سایس بم ؾطض .سظیوبسی ضا ايبف ویس

قوبض دضر ضا سؼطیف ویس، یع سؼسازی همبزیط

اظ ایجب ث ثؼس، ثب سظین زاه وبضثط، سظیوبر ضا ث یه فبیل ذبل وبضثطی .دیف فطو ضا سؼطیف ویس

ایي یػگی سظیوبر زض یػال .، ط وبضثط طم افعاض هی ساس سظیوبر هرشلفی زاقش ثبقس.دیىطثسی ویس

strongly typedاؾشبزی اؾز، وچیي یه والؼ سظیوبر هی ؾبظز ث گ ای و هی ساى ثب یه والؼ

.سظیوبر ضا ذاس یب قز

:قوب یبظ ث افعزى ضوزبی ظیط ث وس سبى زاضیس

using System; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Input;

code snippet QuoteClient/MainWindow.xaml.cs

. فش اؾزGet Quoteػوس ای اظ لبثلیز هكشطی زض ازاض وطزى ضیساز ولیه زوو

protected void OnGetQuote(object sender, RoutedEventArgs e) { const int bufferSize = 1024; Cursor currentCursor = this.Cursor; this.Cursor = Cursors.Wait; string serverName = Properties.Settings.Default.ServerName; int port = Properties.Settings.Default.PortNumber; var client = new TcpClient(); NetworkStream stream = null; try { client.Connect(serverName, port); stream = client.GetStream(); byte[] buffer = new byte[bufferSize]; int received = stream.Read(buffer, 0, bufferSize); if (received <= 0) { return; } textQuote.Text = Encoding.Unicode.GetString(buffer).Trim('\0'); } catch (SocketException ex) { MessageBox.Show(ex.Message, "Error Quote of the day", MessageBoxButton.OK, MessageBoxImage.Error); } finally { if (stream != null) {

Page 13: Windows Service

1390-2011 [Windows services]

stream.Close(); } if (client.Connected) { client.Close(); } } this.Cursor = currentCursor; }

. ثؼس اظ قطع ؾطض آظهبیكی ثطبه وبضثطزی هكشطی، قوب لبزض ث آظهبیف ػولىطز یب لبثلیز ب هی ثبقیس

.قىل ظیط اجطای هفك ایي ثطبه ضا كبى هی زس

ثطبه االى زض .گبم ثؼس، دیبز ؾبظی ػولىطزبی ؾطیؽ زض ؾطض اؾز

حبل اجطاؾز، ثبثطایي ث چ چیعی زیگطی یبظ زاضیس؟ذت، ثطبه ؾطض

ثبیس ث ض ذزوبض زض ظهبى ثر آغبظ قز ثسى ایى وؿی اضز ؾیؿشن

.قوب هی ذایس ثب اؾشفبز اظ ثطبه بی وشطلی ؾطیؽ، ثطبه ضا وشطل وبییس.قز

Windows serviceترنامه

ثطای ؾطیؽ بی (new project template for C# Windows Services)اؾشفبز ویس اظ لبلت دطغ جسیس

ثطای QuoteServiceاظ بم .Windows Serviceؾی قبضح، حبال قوب هی سایس قطع ویس ث ؾبذز ثطبه

.ؾطیؽ اؾشفبز ویس

ثب . ولیه ویس، حبل قوب ؾح طاحی ضا هی ثییسWindows Service ثطای ؾبذز Okدؽ اظ ایي ضی زوو

ضا زضع ویس چطا و ثطبه وبضثطزی ث ض هؿشمین ط چیعی ضا زض نفح، UIایي حبل، قوب وی سایس اجعای

Properties editor)ذهنیبر ؾطیؽ ضا اشربة ویس سب دجط یطایكگط ذهنیز.وبیف وی زس

window) سب ثشایس همبزیط ظیط ضا سظین ویس.ثبظ قز.

AutoLog(طجز لبیغ) ضا و ضیسازبی قطع دبیبى ؾطیؽ ضا ث ض ذزوبض زض گعاضـ لبیغ

.هی یؿس هكرم ویس

زضذاؾز بی هىض، ازاه، قطع، سلف ثؿشي ضا ثطایCanPauseAndContinue,

CanShutdownهكرم ویس .

ServiceNameثطای وشطل ؾطیؽ هضز . بم ؾطیؽ اؾز و زض ضجیؿشطی قش هی قز

.اؾشفبز لطاض هی گیطز

Page 14: Windows Service

1390-2011 [Windows services]

CanHandleSessionChangeEvent هؼیي هی وس و آیب ؾطیؽ هی ساس سغییط ضیساز بی یه

.جلؿ سطهیبل ؾطض ضا ازاض وس

CanHandlePowerEvent گعی ثؿیبض هفیسی ثطای ؾطیؽ زض حبل اجطا ضی لخ سبح یب زؾشگب

(ون قسى ساى)اگط ایي گعی فؼبل ثبقس، ؾطیؽ هی ساس زض ثطاثط حازص ثطق.بی هثبیل اؾز

و بیی اظ حازص ثطق قبهل ون قسى ثبسطی، سغییط .جك سغییط ضفشبض ؾطیؽ اوف كبى زس

.اؾز و ث حبلز سؼلیك سغییط دیسا هی وس ( ACؾییچ وطزى یب ثطق )يؼیز ثطق

ضا زض هشس ServiceBase – derivedسغییط ایي ذهنیبر ثب یطایكگط ذهنیز، همبزیط والؼ

InitalizeComponent()قوب لجال هی زاؿشیس و ایي هشس فطم بی وبضثطزی یسظ. سظین هی وس(Windows

Forms applications) زض ضقی هكبث ثب ؾطیؽ ب هضز اؾشفبز لطاض هی گیطز.هی ثبقس.

لی بم فبیل ضا .وس ضا سلیس هی وس ( ؾاالر ثطای سایز وبضثطاى اظ ثیي هجوػ ای اظفطآیسی)یه یعاضز

بم والؼ ضا ث Wrox.ProCSharp.WinServices، اؾن فبی بم ضا ث QuoteService.csث

QuoteServiceوس ؾطیؽ ث ظزی زض جعییبر هضز ثحض لطاض هی گیطز. سغییط زیس.

serviceBaseکالس

ب اؾز و ثب چبضچة زار ز سؾؼ Windows Services والؼ دبی ثطای سوبهی ServiceBaseوالؼ

هكشك قس اؾز؛ ایي والؼ ثب اؾشفبز اظ والؼ ServiceBase اظ والؼ QuoteServiceوالؼ .زاز قس اس

و سب یه . اضسجب ثطلطاض هی وسSCM ثب System.ServiceProcess.NativeMethodsووىی هؿشس كس

آى یه والؼ زاذلی اؾز، دؽ وی سایس زض . هی ثبقسWin32 APIوالؼ لفب ثؿش ثسی ثطای نسا ظزى

.وسسبى اظ آى اؾشفبز ویس

، والؼ بیی اظ فبی بم QuoteService، والؼ SCMوزاض سالی ظیط اضسجب هیبى

System.ServiceProcessضا كبى هی زس .

شمب می تىاوید .بدون در وظر گرفته آوچ ک پروژي وبمیدي میشىد. می ببشدService1ب طىر پیش فرض وبم سرویس،

فرایىد وصب خطبیی دریبفت کردید، ممکه است ک شمب قبال لاگر در طى. را وصب کىیدService1تىهب یک سرویس،

بىببرایه، مطمئه شىید ک وبم سرویس را از ویرایشگر خصىصیت ب یک . را وصب کردي ببشیدService1سرویس،

.وبم مىبسب در ابتدای تىسع سرویس تغییر دادي ببشید

Page 15: Windows Service

1390-2011 [Windows services]

SCMزض گبم ضا اساظی، هشس . فطآیس قطع یه ؾطیؽ اؾز و ثبیس آغبظ قزMain()نسا ظز هی قز .

هشس ()Run . نسا ظز هی قزServiceBase اظ والؼ دبی ()Run ؾطیؽ و، هشس ()Mainزض هشس

ServiceMainCallback() ضا ثب اؾشفبز اظ NativeMethods.StartServiceCtrlDispatcher() زض SCM طجز هی

.وس یه هسذل زض طجز لبیغ هی یؿس

. ضا زض ثطبه ؾطیؽ نسا هی ظس()ServiceMainCallback هشس طجز قس ی SCMثؼس،

ServiceMainCallback() ثب اؾشفبز اظ NativeMethods.RegisterServiceCtrlHandler[Ex]() ذزـ ضا زض

()OnStartؾذؽ ثب اؾشفبز اظ هشس . ضا زض ؾطیؽ سظین هی وسSCM طجز هی وس يؼیز SCMازاض وس

هفمیز آهیع ثز، ()OnStartاگط .، قوب ث دیبز ؾبظی وس ضا اساظ یبظ زاضیس()OnStartزض .نسا ظز هی قز

. زض طجز لبیغ قش هی قز"Service started successfully "ضقش

ایي هشس ضا ظهبی نسا هی ظس SCM. دیبز ؾبظی هی قز()ServiceCommandCallbackازاض وس زض هشس

زضذاؾز ()ServiceCommandCallbackهشس هؿیط یبثی قس .و سغییطار اظ ؾطیؽ زضذاؾز قس اؾز

سؼمیت هی ()OnPause() ,OnContinue() ,OnStop(), OnCustomCommand(), OnPowerEventبی

.وس

Page 16: Windows Service

1390-2011 [Windows services]

تاتغ اصلی

زض سبثغ انلی، .لبلت سبثغ انلی اظ فطآیس ؾطیؽ ب هی اساظین-زض ایي ثرف گبی ؿجز ث وبضثطز سلیس

یه و اظ والؼ . اػالم قس اؾز,ServiceBase ،ServicesToRunآضای ای اظ والؼ بی

QuoteService ثؿبظیس ث ػاى الیي ػهط آضای ServicesToRunاگط ثبیس ثیف اظ یه . آى ضا اضز ویس

ؾطیؽ، زاذل ایي فطآیس ؾطیؽ اجطا قز، الظم اؾز و و بی ذبل ثیكشطی اظ والؼ بی ؾطیؽ

()Runثب هشس . دبؼ زاز هی قزServiceBase اظ والؼ ()Runایي آضای ث هشس ایؿشبی .ضا ث آضای ايبف ویس

د انلی فطآیس ؾطیؽ ب . ثسیسSCM، قوب اضجبػبسی ث مب ضزی ؾطیؽ ب یشبى ث ServiceBaseاظ

.یشبى هؿسز هی قز هشظط ذبسو زازى ث ؾطیؽ اؾز

:زض ایجب وسب ث ض ذزوبض سلیس قس اس

/// <summary> /// The main entry point for the application. /// </summary> static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new QuoteService() }; ServiceBase.Run(ServicesToRun); }

code snippet QuoteService/Program.cs

یه قی هكشك ()Runاگط سب یه ؾطیؽ هفطز زض فطایس جز زاضز، هی سایس آضای ضا حصف ویس؛ هشس

: هی ساس ث ایي نضر وبف یبثس()Main ضا هی دصیطز، ثبثطایي هشس ServiceBaseقس اظ والؼ

ServiceBase.Run(new QuoteService());

اگط قوب ن یه ؾطیؽ هكبث زاضیس، و زض . قبهل ؾطیؽ بی هشؼسزی اؾزServices.exeثطبه ؾطیؽ

آى ثیكشط اظ یه ؾطیؽ زض یه فطایس زض حبل اجطا اؾز قوب ثبیس زضآى ثطذی اظ حبلز بی هكشطن ضا ثطای

ثب هشس . اجبم زیس()Runهمساض زی اقشطاوی ضا ثبیس لجل اظ هشس .ؾطیؽ بی هشؼسز همساض زی الی ویس

Run()ط زؾشضالؼول بی دیط قوب .، د انلی هؿسز قس اؾز سب ظهبی و فطآیس ؾطیؽ هشلف اؾز

.جبیس لجل اظ ذبسو ؾطیؽ ثطؾس

فطو SCMاگط و همساض زی الی الی سط اظ ایي ثبقس، . طبی ل ثىكس30همساض زی الی جبیس ثیف اظ

قوب ثبیس آؿش سطیي هبقیي ضا ث حؿبة آضیس و زض .هی وس ضا اساظی ؾطیؽ ثب قىؿز هاج قس اؾز

Page 17: Windows Service

1390-2011 [Windows services]

اگط همساض زی الی ل ثىكس، قوب هی سایس همساض زی الی . طبی اجطا قز30آى ؾطیؽ ثبیس زض حسز

اظ ایي دؽ یه قی ضیساز هی . ضا ث هلغ نسا هی ظس()Runضا زض د زیگطی قطع ویس ثبثطایي د انلی،

.ساس ثطای ؾیگبل اسوبم وبض هضز اؾشفبز لطاض گیطز

شروع سرویس

زض ایي هشس، قوب هی سایس ؾوز ؾطضی ضا و لجال . زض قطع ؾطیؽ نسا ظز هی قز()OnStartهشس

QuoteServer ثبیس اضجبػی ث اؾوجلی QuoteServiceقوب ثطای اؾشفبز اظ .ایجبز وطز ایس ضا قطع ویس

وی ساس هؿسز قز؛ ایي هشس ثبیس ث نسا ظس ثبظگطزز، هشس ()OnStartد نسا ظس هشس .زیس

ServiceMainCallback() اظ والؼ ServiceBaseوالؼ . هی ثبقسServiceBase ازاض وس آگبی ثرف ث

SCM ضا طجز هی وس و ؾطیؽ ثب هفمیز ثؼس اظ نسا ظزى OnStart()قطع قس اؾز:

protected override void OnStart(string[] args) { quoteServer = new QuoteServer( Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "quotes.txt"), 5678); quoteServer.Start(); }

code snippet QuoteService/QuoteService.cs

quoteServerهشغیطی اؾز و ث ػاى ػ ذهنی اػالى قس اؾز :

namespace Wrox.ProCSharp.WinServices { public partial class QuoteService: ServiceBase { private QuoteServer quoteServer;

متد های اداره کننده

قوب ثبیس سلف ضا زض ایي هشس ػولیبسی . فطا ذای هی قز()OnStopگبهی و ؾطیؽ هشلف هی قز، هشس

:ویس

protected override void OnStop() { quoteServer.Stop(); }

.، قوب ثبیس ازاض وس بی ظیط ضا ثطای والؼ ؾطیؽ زثبض یؿی ویس()OnStart() and OnStopثؼال ثط

OnPause()ظهبی فطاذای هی قز، و ؾطیؽ ثبیس هىض وطز ثبقس .

Page 18: Windows Service

1390-2011 [Windows services]

OnContinue() ظهبی فطاذای هی قز، و ؾطیؽ ثبیس ث ػولیبر ػبزی ثؼس اظ قطع هىض

، ذهنیز ()OnPause() OnContinueثطای اهىبى فطاذای هشس بی زثبض یؿی قس .ثطگطزز

CanPauseAndContinue ضا ثب trueسظین ویس .

OnShutdown()ث ض هؼول . ظهبی فطاذای هی قز، و یسظ زض حبل ذبهـ وطزى ؾیؿشن اؾز

یبظ زاضیس، قوب هی shutdown ثبقس؛اگط ظهبى ثیكشطی ثطای ()OnStopضفشبض ایي هشس ثبیس قجی ث دیبز ؾبظی

، یه ذهنیز ثطای ایي ,()OnPause() OnContinueویض . سایس زضذاؾز ظهبى ايبفی ویس

. سظین قزtrue ثبیس ثب CanShutdown :ضفشبض ثبیس فؼبل قز

OnPowerEvent()االػبر هطث ث سغییط . ظهبی فطاذای هی قز، و يؼیز ساى ؾیؿشن سغییط وس

یه ع PowerBroadcastStatus . هی ثبقسPowerBroadcastStatusيؼیز ساى زض آضگهبى اظ ع

زض ایجب، قوب االػبسی . اؾزPowerStatusChangeقوبضقی ثب همبزیطی ظیط يؼیف ثزى ثبسطی

زض ایجب هی سایس (QuerySuspend) ذایس گطفز زض نضسی و ؾیؿشن ثراس ث حبلز سؼلیك ضز

.قوب هی سایس االػبر ثیكشطی اظ ضیساز بی ساى زض ایي گفشبض ثرایس.سؼلیك ضا سبییس یب ضز ویس

OnCustomCommand() یه ازاض وس اؾز و هی ساس فطهبى بی ؾفبضقی و ث یه ثطبه وشطلی

int یه آضگهبى اظ ع ()OnCustomCommandاهبی هشس .ؾطیؽ اضؾبل هی ویس ضا ؾطیؽ زس

همبزیط ووشط اظ . ثبقس256 سب 128همساض هی ساس زض هحسز .اؾز و قوبض فطهبى ؾفبضقی ضا هی گیطز

: فبیل مل لل ضا زثبض ثرایس128زض ؾطیؽ سبى، ثب فطهبى ؾفبضقی . همبزیط ضظضی ؾیؿشن ؿشس128

protected override void OnPause() { quoteServer.Suspend(); } protected override void OnContinue() { quoteServer.Resume(); } public const int commandRefresh = 128; protected override void OnCustomCommand(int command) { switch (command) { case commandRefresh: quoteServer.RefreshQuotes(); break; default: break; } }

Page 19: Windows Service

1390-2011 [Windows services]

:نخ و سرویس ها

فطو هی وس و ؾطیؽ ثب قىؿز هاج قس اؾز اگط و SCMوبض و زض اایل گفشبض گفش قس،

.ثطای ثطذضز ثب ایي، قوب یبظ ث ؾبذز یه د زاضیس.همساض زی الی ثیف اظ حس الی قز

اگط قوب یه هشس هؿسز قس ظیط . زض والؼ ؾطیؽ سبى ثبیس زض هسر ظهبی ثبظگطزز()OnStartهشس

AcceptSocket() اظ والؼ TcpListenerثب . ضا فطاذای ویس، یبظ ث قطع یه د ثطای اجبم ایي وبض زاضیس

ثبیس ()AcceptSocket .یه ؾطض قجى و ثب هكشطیبى هشؼسزی ؾط وبض زاضز، یه هرعى د ثؿیبض هفیس اؾز

ث ایي سطسیت، یچىؽ هشظط اجطای وس .فطاذاى زؾش ای اظ دطزاظـ زیگط د بی هرعى ضا زضیبفز وس

.یؿز ث ظط هی ضؾس ؾیؿشن دبؾرگ ؾز

نصة سرویس

سوبهی ؾطیؽ ب ضا هی سایس زض ایجب .یه ؾطیؽ ثبیس زض ضجیؿشطی دیىطثسی قز

HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Services

ع ؾطیؽ، وبیف بم، هؿیط اجطا، دیىطثسی . اضز ضجیؿشطی قیسregeditقوب هی سایس ثب اؾشفبز اظ .ثیبثیس

. ضا كبى هی زسW3SVCقىل ظیط سظیوبر دیىطثسی ؾطیؽ .ضا اساظ غیط ضا زض ایجب دیسا ویس

اجبم زاز، زض System.ServiceProcessایي دیىطثسی ضا هی ساى ثب اؾشفبز اظ والؼ هبة اظ فبی بم

.ثرف ظیط هضز ثحض لطاض هی گیطز

(نصة کننده)ترنامه نصاب

.قوب هی سایس ثطبه هت ضا ثب اؾشفبز اظ سؼیى ث زیس طاحی زض یػال اؾشبزی ث ؾطیؽ ايبف ویس

ثب اؾشفبز اظ ایي گعی، یه والؼ جسیس . اظ ه ثبظ قس ضا اشربة ویسAdd Installerؾذؽ گعی

Page 20: Windows Service

1390-2011 [Windows services]

ProjectInstaller ایجبز وطز ایس، یه و ServiceInstaller ServiceProcessInstaller ایجبز قس

.اؾز

قىل ظیط وزاض والؼ، والؼ هبة ثطای

.ؾطیؽ ضا كبى هی زس

ثب اؾشفبز اظ ایي وزاض، اجبظ زیس اظ طیك وس

Add و ثب گعی ProjectInstaller.csهجغ زض فبیل

Installerؾبذش ثزیس، آى ضا ث ذبط آضیس .

Installerکالس

اظ والؼ ProjectInstallerوالؼ

System.Configuration.Install.Installer هكشك

ایي والؼ دبی ثطای سوبهی هت وس .قس اؾز

ثب اؾشفبز اظ ایي والؼ، ایي اهىبى جز زاضز و هت وس بی هجشی ثط .بی ؾفبضقی اؾز

ثب یه هبة هجشی ثط سطاوف، ایي اهىبى جز زاضز ث يؼیز لجلی .ثؿبظیس(transaction-based)سطاوف

ط گ سغییطاسی و ایي هبة زض م ای ث جز .اگط هت ثب قىؿز هاج قز (Rollback)ػمت ضیس

هشسبی Installerوبض و هی سایس زض قىل ثبال ثجییس، والؼ .آضز اؾز اهىبى لغ ضا ذاس زاقز

Install(), Uninstall(), Commit(), and Rollback()آب زض ثطبه هت نسا ظز هی قس. ضا زاضز .

ثبیس احبض قز ظهبی و یه ProjectInstaller ثساى هؼبؾز و والؼ [RunInstaller(true)]نفز

و ثؼسا زض ایي گفشبض ثحض ) installutil.exeهت ػول ؾفبضقی، وچیي ث ػاى .اؾوجلی زض حبل هت اؾز

ProjectInstaller زاذل ؾبظس والؼ ()InitializeComponent .ثطای ایي نفز ثطضؾی هی قز (هی قز

.نسا ظز هی قز

using System.ComponentModel; using System.Configuration.Install; namespace Wrox.ProCSharp.WinServices { [RunInstaller(true)] public partial class ProjectInstaller : Installer { public ProjectInstaller() { InitializeComponent(); }

Page 21: Windows Service

1390-2011 [Windows services]

} }

code snippet QuoteService/ ProjectInstaller.cs

فرآیند نصة و نصاب سرویس

ServiceProcessInstaller، و بیی اظ والؼ ()InitializeComponentزض زاذل دیبز ؾبظی

ServiceInstallerط ز ایي والؼ ب اظ . ؾبذش قس اؾزComponentInstaller هكشك قس اس، و ذزـ

. هكشك قس اؾزInstallerاظ

ث یبز زاقش . ضا هی ساى زض فطآیس هت هضز اؾشفبز لطاض زازComponentInstallerوالؼ بی هكشك قس اظ

ثطای ServiceProcessInstallerوالؼ .ثبقیس و فطآیس ؾطیؽ هی ساس قبهل ثیف اظ یه ؾطیؽ ثبقس

دیىطثسی فطآیسی و همبزیط و ی ؾطیؽ ب ضا زض ایي فطآیس سؼطیف هی وس، هضز اؾشفبز لطاض هی گیطز،

ثطای ط ServiceInstaller ثبثطایي یه و . ثطای دیىطثسی ؾطیؽ اؾزServiceInstaller والؼ

ServiceInstallerاگط ؾ ؾطیؽ زاذل فطآیس ؿشس؛ قوب یبظ ث ايبف وطزى اقیب .ؾطیؽ هضز یبظ اؾز

: هضز یبظ اؾزServiceInstallerو زض آى نضر ؾ و - زاضیس

partial class ProjectInstaller { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Required method for Designer supportdo not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); // // serviceProcessInstaller1 // this.serviceProcessInstaller1.Password = null; this.serviceProcessInstaller1.Username = null; // // serviceInstaller1 // this.serviceInstaller1.ServiceName = "QuoteService"; // // ProjectInstaller // this.Installers.AddRange( new System.Configuration.Install.Installer[] {this.serviceProcessInstaller1, this.serviceInstaller1}); } private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1; private System.ServiceProcess.ServiceInstaller serviceInstaller1; }

code snippet QuoteService/ProjectInstaller.Designer.cs

Page 22: Windows Service

1390-2011 [Windows services]

ServiceProcessInstaller یه هت وس اجطایی اؾز و زض والؼ

ServiceBase.ServiceProcessInstaller دیبز ؾبظی قس اؾز ذهنیبسی ثطای وبهل قسى فطآیس

.جسل ظیط ذهنیبر هكشطن ثیي و ی ؾطیؽ ب ضا زاذل فطآیس سيیح هی زس.زاضز

توضیح خصوصیتUsername, Password زض نضسی و .حؿبة وبضثطی ضا كبى هی زس و ؾطیؽ سحز آى اجطا هی قز

. سظین قس ثبقسServiceAccount.Userذهنیز حؿبة ثطای

Account ثب اؾشفبز اظ ایي ذهنیز، قوب هی سایس ع حؿبة ؾطیؽ سبى ضا هكرم ویس. HelpText

HelpText یه ذهنیز فم ذاسی اؾز و هشي ووىی ثطای سظین حؿبة

.ضا ثط هی گطزاس (password) گصض اغ (username)وبضثطی

Accountفطآیسی و ثطای اجطای ؾطیؽ هضز اؾشفبز لطاض گطفش اؾز هی ساى ثب هؼیي وطزى ذهنیز

جسل ظیط همبزیط هرشلف . اؾشفبز وبیسServiceAccount اظ ع قوبضقی ServiceProcessInstallerوالؼ

. ضا قطح هی زسAccountذهنیز

مؼنا مقدارLocalSystem سظین ایي همساض هكرم هی وس و ؾطیؽ اظ حؿبة وبضثطی ثؿیبض هوشبظی ضی

. ث ػاى وبهذیسط ضی قجى ػول هی وس.ؾیؿشن هحلی اؾشفبز هی وسNetworkService قجی ث LocalSystem اؾز، ایي همساض هكرم هی وس و اػشجبض به وبهذیسط ث ؾطض

، چیي ؾطیؿی ث ػاى وبضثط غیط LocalSystemاهب ثطػىؽ .ضا زض زاز قس اؾز

وبض و اظ بهف دیساؾز، ایي حؿبة فم .هوشبظ ضی قجى هحلی ػول هی وس

.ثبیس ثطای ؾطیؽ بیی و هبثغ ای اظ قجى یبظ زاضس اؾشفبز قزLocalService ایي ع حؿبة اػشجبض به بی بقبؾی ث ط ؾطض ضا زض اضای هی زس وبى

. زاضزNetworkServiceاهشیبظار هحلی ضا ث ػاى User سظین ذهنیزAccount ثطای ServiceAccount.User ثساى هؼی اؾز و قوب هی

.سایس حؿبثی ضا و ثبیس اظ ؾطیؽ اؾشفبز وس سؼطیف ویس

Page 23: Windows Service

1390-2011 [Windows services]

ServiceInstaller والؼ هضز یبظ ثطای ط ؾطیؽ اؾز؛ زاضای ذهنیبسی ظیط ثطای ط ؾطیؽ زاذل

زض . StartType , DisplayName , ServiceName , and ServicesDependentOn :یه فطآیس هی ثبقس

. جسل ظیط قطح زاز قس اؾز

توضیح خصوصیت

StartType ذهنیزStartType كبى زس ایي اؾز و آیب ؾطیؽ ث ض زؾشی یب ذزوبض

,ServiceStartMode.Automaticهمبزیط هوىي .قطع قس اؾز

ServiceStartMode.Manual,ثب اؾشفبز اظ . ؿشسServiceStartMode.Disabled ،

ایي گعی ثؿیبض هفیس، ثطای ؾطیؽ بیی اؾز و جبیس .ؾطیؽ وی ساس قطع قز

ضا سظین ویس، ثطای هظبل Disabledهوىي اؾز ثرایس گعی .ضی ؾیؿشن قطع قس

.یه یبظ وشطلط ؾرز افعاض زض زؾشطؼ یؿزDelayedAutoStart ایي ذهنیز بزیس گطفش هی قز اگط وStartType ثب Automatic سظین كس

زض ایجب قوب هی سایس هكرم ویس و ؾطیؽ جبیس ثالفبنل ثؼس اظ ثر ؾیؿشن .ثبقس

اؾز ثؼس اظ 4 بی جسیس زض زار ز Windows Servicesایي یػگی ثطای .آغبظ قز

.ؾیؿشن ػبهل یسظ یؿشب دكشیجبی هی قزDisplayName DisplayNameایي . بم زؾشب ای ثطای ؾطیؽ اؾز و ث وبضثط وبیف زاز هی قز

بم وچیي زض اثعاض هسیطیشی و وشطل بظط ؾطیؽ ؿشس هضز اؾشفبز لطاض هی

.گیطزServiceName ServiceNameایي همساض ثبیس زض ذهنیز . بهی ثطای ؾطیؽ اؾزServiceName

ServiceInstallerایي بم زؾشیبض . زض ثطبه ؾطیؽ ثطاثط ثبقسServiceBaseاظ والؼ

.ضا و هضز یبظ ثطبه ؾطیؽ اؾز دیىطثسی هی وسServicesDependentOn هجوع ای اظ ؾطیؽ بیی ضا ثبیس لجل اظ ایى ؾطیؽ ثشاس قطع قز هكرم هی

ظهبی و ؾطیؽ قطع هی قز، و ی ایي ؾطیؽ ب ث ض ذزوبض قطع، .وس

. دؽ اظ آى ؾطیؽ قوب یع آغبظ ذاس قس

زض قی ServiceName سغییط زیس، هوئي ثبقیس و ذهنیز ServiceBase-derivedاگط بم ؾطیؽ ضا زض والؼ

ServiceInstallerسغییط وس .

ث ایي سطسیت، اگط قوب شایس ؾطیؽ ضا هشلف .سظین ویس (زؾشی)Manual ضا ث StartTypeزض هطاحل آظهبیف،

ضا ثب StartTypeاهب اگط قوب .قوب ظ اهىبى ضا اساظی هجسز ؾیؿشن ضا زاضیس(ثطای هظبل، ظهبی و ذطاثی ضخ زاز اؾز)وبییس

Automatic(ث ض ذزوبض)قوب هی .سظین وطز ثبقیس، ؾطیؽ زض گبم ضا اساظی هجسز ث ض ذزوبض قطع هی قز

.سایس ایي دیىطثسی ضا ثؼسا سغییط زیس ظهبی و ث ایي وبض هوئي ؿشیس

Page 24: Windows Service

1390-2011 [Windows services]

serviceinstallerDialogکالس

ایي . اؾزSystem.ServiceProcess.Design ،ServiceInstallerDialogزیگط والؼ هبة زض فبی بم

والؼ هی ساس هضز اؾشفبز لطاض گیطز اگط قوب هی ذایس و هسیط ؾیؿشن اضز حؿبة وبضثطی اـ قس ثبیس

.ثطای اؾشفبز اظ ایي ؾطیؽ بم وبضثطی ضهع ػجضی زض گبم هت اذشهبل زس

ServiceAccount.User ثطای ServiceProcessInstaller اظ والؼ Accountاگط قوب ذهنیز

Service سظین وطز ثبقیس، زض قىل ظیط وبزض هحبض ای null ضا ث Username Passwordذهنیبر

Login dialog boxزض ظهبى هت ضا هی ثییس .

.قوب وچیي هی سایس هت ضا زض یه م لغ ویس

Installutil

ثطای installutil.exeث دطغ، قوب هی سایس اظ ثطبه ووىی (installer)دؽ اظ ايبف وطزى والؼ بی هبة

Installerایي ثطبه ؾزهس هی ساس ثطای ط اؾوجلی و یه والؼ .هت حصف ؾطیؽ اؾشفبز وبییس

Installer اظ والؾی و اظ والؼ ()Install هشس installutil.exeثطبه ؾزهس .زاضز هضز اؾشفبز لطاض گیطز

. ضا ثطای حصف فطاذای هی وس()Uninstallهكشك قس اؾز ثطای هت

:ثطای هت حصف ؾطیؽ هبى زض ظیط اؾز (command - line)ضزی ذ فطهبى

installutil quoteservice.exe

installutil /u quoteservice.exe

InstallUtil.InstallLog .اگط هت ثب قىؿز هاج قس، اظ ثطضؾی فبیل گعاضـ هت هوئي قیس اظ

<servicename>.InstallLogاظ لجیل. اغلت هی سایس االػبسی ثؿیبض هفیسی دیسا ویس:

“The specified service already exists.”

سج زاقش ثبقیس و اظ ؿر زار ز و یسظ . زض هؿیط چبضچة زار ز یبفز هی قزinstallutil.exeثطبه ؾزهس

:ؾطیؽ ضا ایجبز وطز ایس اؾشفبز وبییس

C:\Windows\Microsoft.NET\Framework\v4.0.30319\ installutil.exe

Page 25: Windows Service

1390-2011 [Windows services]

(Client)مشتری

ثطای )MMCثؼس اظ ایى ؾطیؽ ثب هفمیز هت قس، قوب هی سایس ؾطیؽ ضا ث ض زؾشی اظ ؾطیؽ بی

.آغبظ ؾذؽ هی سایس ثطبه وبضثطزی هكشطی ضا قطع ویس (االع ثیكشط ث لؿوز ثؼسی گب ثیساظیس

Windows servicesنظارت و کنترل

Services ، قوب هی سایس اظ وؿل هسیطیشی ؾطیؽ هبیىطؾبفزWindows Servicesثطای ظبضر وشطل

Microsoft Management Console(MMC) snap - in اؾشفبز وبییس و ثركی اظ اثعاض هسیطیشی هسیط

، ث قوب اجبظ وشطل ؾطیؽ ب net.exe ط ؾیؿشن یسظ زاضای یه ذ فطهبى هی ثبقس، و.وبهذیسط اؾز

ایي ثطبه ووىی زاضای لبثلیز بی ثیكشط ؿجز ث . اؾزsc.exeزیگط ثطبه ووىی ذ فطهبى .ضا هی زس

net.exeقوب وچیي هی سایس ث ض هؿشمین اظ . هی ثبقسVisual Studio Server Explorer ؾطیؽ ب ضا

وچه و ثطای اؾشفبز اظ والؼ Windows applicationزض ایي ثرف، قوب وچیي یه ثطبه .وشطل ویس

System.ServiceProcess.ServiceControllerثطای ظبضر وشطل ؾطیؽ ب اؾز ایجبز هی ویس .

MMC snap – in

قىل ظیط ضا ).، قوب هی سایس يؼیز و ی ؾطیؽ ب ضا ثجییسMMCثب اؾشفبز اظ ؾطیؽ بی

وچیي ایي اهىبى جز زاضز و زضذاؾز بی وشطلی ثطای سلف، فؼبل وطزى، یب غیط فؼبل وطزى (.ثجییس

یه ثطبه وشطلی ؾطیؽ اؾز و ث Services snap – in .آب ضا ثفطؾشیس یع دیىطثسی آب ضا سغییط زیس

.ػاى ثطبه دیىطثسی ؾطیؽ یع هحؿة هی قز

Page 26: Windows Service

1390-2011 [Windows services]

، وبزض QuoteServiceظهبی و قوب زثبض ولیه هی ویس

ایي .هحبض ای ذهنیز ضا زض قىل ضثط كبى هی زس

وبزض هحبض ای ث قوب اهىبى زیسى بم ؾطیؽ، قطح، هؿیط

ایي ؾطیؽ زض .اجطایی، ع ضا اساظ يؼیز ضا هی زس

حؿبة فطآیس ؾطیؽ ضا هی .حبل حبيط آغبظ قس اؾز

. ایي وبزض هحبض ای سغییط زازLog Onساى زض ؾطثطي

net.exeترنامه کمکی

اهب هسیط . ثطای اؾشفبز آؾبى هی ثبقس snap-inؾطیؽ بی

ؾیؿشن ضا وی ساى ث ض ذزوبض وطز ث ذبط ایى لبثل

ؾطیؽ ب وشطلی ضا هی ساى ثب یه اثعاض ث ثؾیل اؾىطیذز .اؾشفبز ثب یه اؾىطیذز هسیطیشی وی ثبقس

سوبهی net startزؾشض . اؾشفبز وبییسnet.exeذزوبض وطز، قوب هی سایس اظ ذ فطهبى ثطبه ووىی

یه ؾطیؽ ضا آغبظ هی وس، <net start <servicenameؾطیؽ بی زض حبل اجطا ضا وبیف هی زس،

net stop <servicename>وچیي اهىبى ث هىض . یه زضذاؾز سلف ثطای ؾطیؽ اضؾبل هی وس

سب زض نضسی و ؾطیؽ اجبظ ). جز زاضزnet pause net continueوطزى ازاه یه ؾطیؽ ثب

(زس، الجش

sc.exeترنامه کمکی

هی sc.exeیىی زیگط اظ ثطبه ؾزهس ووشط قبذش قس و ث ػاى ثركی اظ ؾیؿشن ػبهل اضای قس اؾز

ؿجز ث sc.exeسغییطار ثؿیبض ظیبزی ضا هی ساى ثب .ایي یه اثعاض ػبلی ثطای ثبظی ثب ؾطیؽ اؾز.ثبقس

net.exeثب . اجبم زازsc.exe قوب هی سایس يؼیز الؼی ؾطیؽ، یب دیىط ثسی، حصف، ايبف وطزى ،

ایي اثعاض وچیي زثبض هت وطزى ؾطیؽ ضا سؿیل هی وبیس، اگط ثب قىؿز ثطای .ؾطیؽ ضا اجبم زیس

.زؾشطؾی ػولىطز هاج قز

Visual studio server explorer

Page 27: Windows Service

1390-2011 [Windows services]

زاذل یػال اؾشبزی ثؾیل ی اشربة Server Explorerوچیي قوب هی سایس ؾطیؽ ب ضا ثب اؾشفبز اظ

لیؿز Serversثب الیي ػهط (وبی زضذشی)tree view زض یه Servicesػهط . وشطل ویسServicesوطزى

ثب . جز زاضزServicesقس اؾز؛ قوب هی سایس ظیط آى بم وبهذیسط ذزسبى ضا دیسا ویس، ظیط آى ػهط

ایي ه یع هی ساس . اشربة یه ؾطیؽ ثبظ وطزى ه، قوب هی سایس ؾطیؽ ضا قطع یب هشلف ویس

. ث دطغ اؾشفبز قزServiceControllerثطای ايبف وطزى والؼ

ثىكیس زض Server Explorerثطای وشطل یه ؾطیؽ ذبل زض ثطبه وبضثطزی ذزسبى، یه ؾطیؽ ضا اظ

Designer(هحی طاحی) یه و اظ .ضب ویسServiceController ث ثطبه وبضثطزی ايبف قس

اؾوجلی .ذهنیبر ایي قی ث ض ذزوبض ثطای زؾشیبثی ث ؾطیؽ اشربة قس سظین هی قز.اؾز

System.ServiceProcessقوب هی سایس اظ ایي و ثطای وشطل یه ؾطیؽ زض طیمی . اضجبع قس اؾز

.هكبث و قوب هی سایس ثب ثطبه وبضثطزی و زض لؿوز ثؼسی سؾؼ هی زیس اؾشفبز وبییس

نوشتن کنترل کننده سفارشی سرویس

وچه و اظ والؼ Windows applicationزض ایي ثرف، قوب یه

ServiceController اؾشفبز هی وس ثطای ظبضر وشطل Windows

Servicesب هی ؾبظیس .

ثب یه ضاث وبضثطی و زض قىل كبى زاز WPFیه ثطبه وبضثطزی

list)زض دجط انلی ایي ثطبه، یه لیؿز جؼج .قس اؾز ثؿبظیس

box) ثطای وبیف سوبهی ؾطیؽ ب، چبض جؼج هشي(text boxes) ثطای وبیفdisplay name(بم وبیكی) ،

چبض زوو هضز اؾشفبز ثطای اضؾبل ضیساز .زاضا هی ثبقس (button)يؼیز، ع، بم ؾطیؽ، قف زوو

.بی وشطلی، یىی ثطای سبظ وطزى لیؿز، یه زوو ثطای ذطع اظ ثطبه لطاض گطفش اس

نظارت سرویس

جسل ظیط .، قوب هی سایس االػبر هطث ث ط ؾطیؽ ضا زضیبفز ویسServiceControllerثب والؼ

. ضا كبى هی زسServiceControllerذهنیبر والؼ

Page 28: Windows Service

1390-2011 [Windows services]

شرح خصوصیتCanPauseAndContinue trueضا ثط هی گطزاس اگط زض ذاؾز بی سلف ازاه ثشاس ث ؾطیؽ اضؾبل قز .

CanShutdown true ضا ثط هی گطزاس اگط ؾطیؽ یه ازاض وس ثطای shutdown ؾیؿشن زاقش

.ثبقسCanStop true ضا ثط هی گطزاس اگط ؾطیؽ stoppableثبقس .

DependentServices اگط ؾطیؽ هشلف قز، سوبهی .یه هجوػ اظ ؾطیؽ بی اثؿش ضا ثط هی گطزاس

.ؾطیؽ بی اثؿش لجال هشلف قس اسServicesDependentOn یه هجوػ اظ ؾطیؽ بیی ضا و ث ایي ؾطیؽ ثؿشگی زاضس ثط هی گطزاس.

DisplayName بهی ضا و ثطای ؾطیؽ ثبیس كبى زاز قز هكرم هی وس. MachineName بهی ضا ثطای هبقیی و ؾطیؽ ضی آى زض حبل اجطاؾز هكرم هی وس. ServiceName بم ؾطیؽ ضا هكرم هی وس. ServiceType ایي ؾطیؽ هی ساس زض زاذل یه فطآیس اقشطاوی .ع ؾطیؽ ضا هكرم هی وس

و زض آى ثیف اظ یه ؾطیؽ هضز اؾشفبز وبى فطآیس اؾز اجطا

یب هبس ضقی زیگط و سب یه ؾطیؽ زض یه فطآیس (Win32ShareProcess)قز

زض (desktop)اگط ایي ؾطیؽ ثشاس ثب هیع وبض.(Win32OwnProcess)اجطا هی قز

. اؾزInteractiveProcessسؼبهل ثبقس، ػف Status يؼیز ب هی ساس زض حبل اجطا.يؼیز ؾطیؽ ضا هكرم هی وس(running) ،

یب زض ثطذی اظ حبالر هیبی هبس زض اشظبض (paused)، هىض(stopped)هشلف

همبزیط . ث ویي سطسیت(stop pending)، زض اشظبض سلف(start pending)قطع

. سؼطیف قس اسServiceControllerStatusيؼیز زض ع قوبضقی

ثطای وبیف االػبر DisplayName ،ServiceName ،ServiceType ،Statusزض ثطبه و، ذهنیبسی

ثطای فؼبل یب غیط فؼبل CanPauseAndContinue CanStopوچیي، .ؾطیؽ هضز اؾشفبز لطاض گطفش اس

. هضز اؾشفبز لطاض گطفش اسPause, Continue, and Stopوطزى زوو بی

ؾبذش قس ServiceControllerInfoثطای زضیبفز سوبهی االػبر هضز یبظ ثطای ضاث وبضثطی، والؼ

ایي والؼ هی ساس ثطای اسهبل زاز اضای االػبر يؼیز، بم ؾطیؽ، ع ؾطیؽ، االػبسی زض .اؾز

.هضز زوو ب وشطل ؾطیؽ و ثبیس فؼبل یب غیط فؼبل قس هضز اؾشفبز لطاض هی گیطز

Page 29: Windows Service

1390-2011 [Windows services]

ServiceControllerInfo حبی یه ServiceController س وبض اؾز و ثب ؾبظس والؼ

ServiceControllerInfoذهنیز فم ذاسی . سظین قس اؾزController ثطای زؾشیبثی ث

ServiceControllerس وبض یع جز زاضز :

public class ServiceControllerInfo { private readonly ServiceController controller; public ServiceControllerInfo(ServiceController controller) { this.controller = controller; } public ServiceController Controller { get { return controller; } }

code snippet ServiceControl/ServiceControllerInfo.cs

ذهنیبر فم ذاسی ServiceControllerInfoثطای وبیف االػبر جبضی زض هضز ؾطیؽ، والؼ

DisplayName, ServiceName, ServiceTypeName, ServiceStatusNameدیبز ؾبظی . ضا زاضا هی ثبقس

DisplayName فم زض زؾشطؼ ذهنیبر اؾبؾی DisplayName ServiceNameذهنیبر

ServiceName اظ والؼ ServiceControllerثب دیبز ؾبظی ذهنیبر . اؾزServiceTypeName

ServiceStatusName يؼیز ع ؾطیؽ ضا وی ساى ث آؾبی ثطگطزاس _ ثیكشط وبض اجبم قس اؾز

ثط هی ServiceControllerظیطا یه ضقش ثبیس ثجبی یه ػسز وبیف زاز قز، یؼی چیعی و والؼ

. یه ضقش و كبى زس ع ؾطیؽ اؾز ضا ثط هی گطزاسServiceTypeNameذهنیز .گطزاس

ServiceType ث قوب ذهنیشی اظ ServiceController و كبى زس یه هجوػ اظ دطچن ب اؾز هی

هی ساس وطا ثب InteractiveProcessثیز .ثیشی سطویت قز (یب) ORزس و هی ساس ثب اؾشفبز اظ ػولگط

Win32OwnProcess Win32ShareProcessثبثطایي، الیي ثبض ثطضؾی هی قز اگط ثیز . سظین قز

InteractiveProcessثب اؾشفبز اظ ؾطیؽ، ضقش ای ثب . لجل اظ ازاه ث ثطضؾی همبزیط زیگط سظین قس ثبقس

“Win32 Service Process” یب“Win32 Shared Process”ثطگطزاس هی قز:

public string ServiceTypeName { get { ServiceType type = controller.ServiceType; string serviceTypeName = ""; if ((type & ServiceType.InteractiveProcess) != 0) { serviceTypeName = "Interactive ";

هضز اؾشفبز لطاض هی گیطز، قوب ثبیس اؾوجلی System.ServiceProcess.ServiceControllerاظ آجبیی و والؼ

System.ServiceProcessضا اضجبع زیس .

Page 30: Windows Service

1390-2011 [Windows services]

type -= ServiceType.InteractiveProcess; } switch (type) { case ServiceType.Adapter: serviceTypeName += "Adapter"; break; case ServiceType.FileSystemDriver: case ServiceType.KernelDriver: case ServiceType.RecognizerDriver: serviceTypeName += "Driver"; break; case ServiceType.Win32OwnProcess: serviceTypeName += "Win32 Service Process"; break; case ServiceType.Win32ShareProcess: serviceTypeName += "Win32 Shared Process"; break; default: serviceTypeName += "unknown type " + type.ToString(); break; } return serviceTypeName; } } public string ServiceStatusName { get { switch (controller.Status) { case ServiceControllerStatus.ContinuePending: return "Continue Pending"; case ServiceControllerStatus.Paused: return "Paused"; case ServiceControllerStatus.PausePending: return "Pause Pending"; case ServiceControllerStatus.StartPending: return "Start Pending"; case ServiceControllerStatus.Running: return "Running"; case ServiceControllerStatus.Stopped: return "Stopped"; case ServiceControllerStatus.StopPending: return "Stop Pending"; default: return "Unknown status"; } } } public string DisplayName { get { return controller.DisplayName; } } public string ServiceName { get { return controller.ServiceName; } }

سؼساز ثیكشطی ذهنیبر فؼبل ثطای زوو بی قطع، سلف، هىض، ازاه ServiceControllerInfoوالؼ

ایي ذهنیبر یه همساض ثلی ثط .EnableStart, EnableStop, EnablePause, EnableContinue :زاضز

.اؾبؼ يؼیز فؼلی ؾطیؽ ثبظ هی گطزاس

public bool EnableStart { get { return controller.Status == ServiceControllerStatus.Stopped; }

Page 31: Windows Service

1390-2011 [Windows services]

} public bool EnableStop { get { return controller.Status == ServiceControllerStatus.Running; } } public bool EnablePause { get { return controller.Status == ServiceControllerStatus.Running && controller.CanPauseAndContinue; } } public bool EnableContinue { get { return controller.Status == ServiceControllerStatus.Paused; } } }

سوبهی ؾطیؽ ب ضا ثب اؾشفبز اظ ()RefreshServiceList، هشس ServiceControlWindowزض والؼ

ServiceController.GetServices() ثطای وبیف زض list boxهشس . هی زسGetServices() یه آضای اظ و

ب و ثط ضی ؾیؿشن ػبهل هت قس اس Windows Services ث وبیسگی اظ سوبهی ServiceControllerبی

اؾز و آضای ی ()GetDevices وچیي زاضای هشس ایؿشبی ServiceControllerوالؼ .ثط هی گطزاس

ServiceControllerآضای ی ثبظگكشی ث ووه هشس . ث وبیسگی اظ سوبم ضا اساظ بی زؾشگب ضا ثط هی گطزاس

ثب سؼطیف یه ػجبضر DisplayNameهطست وطزى ثط اؾبؼ . هطست قس اؾز ()Array.Sort(generic)ووىی

Lambda اجبم گطفش اؾز و ث هشس Sort()ثب اؾشفبز اظ . هشمل قس اؾزArray.ConvertAll() و بی ،

ServiceController ث ع ServiceControllerInfoزض ایجب، یه ػجبضر . سجسیل هی قسLambda هشمل

زض آذط، . فطا هی ذاسServiceController ضا ثطای ط قی ServiceControllerInfoقس اؾز و ؾبظس

: سرهیم زاز قس اؾزDataContext ثطای اسهبل زاز اظ دجط ذهنیز ServiceControllerInfoآضای

protected void RefreshServiceList() { ServiceController[] services = ServiceController.GetServices(); Array.Sort(services, (s1, s2) => s1.DisplayName.CompareTo(s2.DisplayName)); this.DataContext = Array.ConvertAll(services, controller => new ServicesControllerInfo(controller)); }

code snippet ServiceControl/ServiceControlWindow.xaml.cs

Page 32: Windows Service

1390-2011 [Windows services]

ثطای ثسؾز آضزى سوبهی ؾطیؽ ب زضى ؾبظس والؼ ()RefreshServiceListهشس

ServiceControlWindowؾبظس وچیي ازاض وس ضیسازی ضا ثطای ضیساز. نسا ظز هی قز Click زوو

.ب ضا سؼطیف هی وس

public ServiceControlWindow() { InitializeComponent(); RefreshServiceList(); }

. ضا ثطای اسهبل االػبر ثطای وشطل ب سؼطیف ویسXAMLحبال، قوب هی سایس و

. كبى زاز قس سؼطیف قس اؾزListBox ثطای االػبسی و زض زاذل DataTemplateرؿز، یه

ListBox قبهل یه Label اؾز و Content آى ث ذهنیز DisplayName اظ هجغ زاز هشهل

، ضا همیس وطز ایس، ذهنیز ServiceControllerInfoوبض و قوب یه آضای اظ اقیب .اؾز

DisplayName ثب والؼ ServiceControllerInfoسؼطیف قس اؾز :

<Window.Resources> <DataTemplate x:Key="listTemplate"> <Label Content="{Binding Path=DisplayName}"/> </DataTemplate> </Window.Resources>

code snippet ServiceControl/ServiceControlWindow.xaml

ListBox و زض ؾوز چخ دجط لطاض گطفش اؾز ذهنیز ItemsSource ضا ثطای {Binding} سظین هی

ی و زض هشس DataContext كبى زاز قس اس اظ ذهنیز ListBoxث ایي سطسیت، زاز بیی و زض .وس

RefreshServiceList()اضجبػبر ذهنیز . سظین قس اؾز زضیبفز هی وسItemTemplate هبثغ

listTemplate و ثب DataTemplateذهنیز . و لجال كبى زاز قس اؾز، سؼطیف هی قز

IsSynchronizedWithCurrentItem ثب True سظین قس اؾز ث ضیى وشطل بی TextBox Button زض

. اشربة قس اؾز همیس قس اسListBoxزاذل وبى دجط ث ػهط جبضی و ثب

<ListBox Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" Name="listBoxServices" VerticalAlignment="Top" ItemsSource="{Binding}" ItemTemplate="{StaticResource listTemplate}" IsSynchronizedWithCurrentItem="True"> </ListBox>

Page 33: Windows Service

1390-2011 [Windows services]

امیبز زاز ServiceControllerInfo ث ذهنیز هشبظط و Text ، ذهنیز TextBlockثب وشطل بی

فؼبل یب غیط فؼبل ؿشس وچیي اظ امیبز زاز ب ثؾیل ی امیبز Buttonایي و آیب وشطل بی .قس اؾز

سؼطیف قس اؾز و یه ServiceControllerInfo ث ذهنیز هطث ث و IsEnabledذهنیز

.همساض ثلی ضا ثط هی گطزاس

<TextBlock Grid.Row="0" Grid.ColumnSpan="2" Name="textDisplayName" Text="{Binding Path=DisplayName, Mode=OneTime}" /> <TextBlock Grid.Row="1" Grid.ColumnSpan="2" Name="textStatus" Text="{Binding Path=ServiceStatusName, Mode=OneTime}" /> <TextBlock Grid.Row="2" Grid.ColumnSpan="2" Name="textType" Text="{Binding Path=ServiceTypeName, Mode=OneTime}" /> <TextBlock Grid.Row="3" Grid.ColumnSpan="2" Name="textName" Text="{Binding Path=ServiceName, Mode=OneTime}" /> <Button Grid.Row="4" Grid.Column="0" Name="buttonStart" Content="Start" IsEnabled="{Binding Path=EnableStart, Mode=OneTime}" Click="OnServiceCommand" /> <Button Grid.Row="4" Grid.Column="1" Name="buttonStop" Content="Stop" IsEnabled="{Binding Path=EnableStop, Mode=OneTime}" Click="OnServiceCommand" /> <Button Grid.Row="5" Grid.Column="0" Name="buttonPause" Content="Pause" ="{Binding Path=EnablePause, Mode=OneTime}" Click="OnServiceCommand" /> <Button Grid.Row="5" Grid.Column="1" Name="buttonContinue" Content="Continue" IsEnabled="{Binding Path=EnableContinue, Mode=OneTime}" Click="OnServiceCommand" /> <Button Grid.Row="6" Grid.Column="0" Name="buttonRefresh" Content="Refresh" Click="OnRefresh" /> <Button Grid.Row="6" Grid.Column="1" Name="buttonExit" Content="Exit" Click="OnExit" />

:کنترل سرویس

، قوب وچیي هی سایس زضذاؾز بی وشطلی ضا ث ؾطیؽ اضؾبل ServiceControllerثب والؼ

.جسل ظیط هشس بیی ضا و هی ساى ث وبض گطفز قطح هی زس.وبییس

تشریح متدStart() Start() ث SCMزض ثطبه ؾطیؽ و، . هی گیس و ؾطیؽ ثبیس قطع قس ثبقس

OnStart()نسا ظز هی قز . Stop() Stop() زض ثطبه ؾطیؽ و ثب ووه SCM هشس OnStop() ضا فطا ذای هی وس

. ثبقسtrue ثطاثط service زض والؼ CanStopاگط ذهنیز Pause() Pause() هشس OnPause() ضا نسا هی ظس اگط ذهنیز CanPauseAndContinue

. ثبقسtrueثطاثط Continue() Continue() هشس OnContinue() ضا نسا هی ظس اگط ذهنیز

CanPauseAndContinue ثطاثط trueثبقس . ExecuteCommand() ثبExecuteCommand() ایي اهىبى ثطای اضؾبل فطهبى ؾفبضقی ث ؾطیؽ جز ،

.زاضز

Page 34: Windows Service

1390-2011 [Windows services]

اظ آجب و ایي وس ثطای قطع، سلف، سؼلیك، هىض هكبث اؾز، سب یه . وس ظیط ؾطیؽ ضا وشطل هی وس

:ازاض وس ثطای چبض زوو هضز اؾشفبز لطاض هی گیطز

protected void OnServiceCommand(object sender, RoutedEventArgs e) { Cursor oldCursor = this.Cursor; try { this.Cursor = Cursors.Wait; ServiceControllerInfo si = (ServiceControllerInfo)listBoxServices.SelectedItem; if (sender == this.buttonStart) { si.Controller.Start(); si.Controller.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)); } else if (sender == this.buttonStop) { si.Controller.Stop(); si.Controller.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10)); } else if (sender == this.buttonPause) { si.Controller.Pause(); si.Controller.WaitForStatus(ServiceControllerStatus.Paused, TimeSpan.FromSeconds(10)); } else if (sender == this.buttonContinue) { si.Controller.Continue(); si.Controller.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)); } int index = listBoxServices.SelectedIndex; RefreshServiceList(); listBoxServices.SelectedIndex = index; } catch (System.ServiceProcess.TimeoutException ex) { MessageBox.Show(ex.Message, "Timout Service Controller", MessageBoxButton.OK, MessageBoxImage.Error); } catch (InvalidOperationException ex) { MessageBox.Show(String.Format("{0} {1}", ex.Message, ex.InnerException != null ? ex.InnerException.Message : String.Empty), MessageBoxButton.OK, MessageBoxImage.Error); } finally { this.Cursor = oldCursor; } } protected void OnExit(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } protected void OnRefresh_Click(object sender, RoutedEventArgs e) { RefreshServiceList(); }

code snippet ServiceControl/ServiceControlWindow.xaml.cs اظ آجب و ػول وشطل ذسهبر هی ساى لز گیط ثبقس، هىبى وب ث هىبى وبی اشظبض ثطای الیي زؾشض سغییط

ثب هشس . ثؿش ث زوو ای و فكطز قس اؾز فطاذای هی قزServiceControllerؾذؽ یه هشس .دیسا هی وس

WaitForStatus() قوب هشظط قیس جز ثطضؾی ایي و ؾطیؽ ث همساض زضذاؾز قس سغییط يؼیز ،

Page 35: Windows Service

1390-2011 [Windows services]

سجسیس قس اس، ایي ListBoxدؽ اظ ؾذطی قسى ایي ظهبى، االػبر زض . طبی نجط ویس10زس، اهب حساوظط

.ؾذؽ يؼیز جسیسی اظ ایي ؾطیؽ وبیف زاز هی قز. ؾطیؽ هكبث ن هبس لجل اشربة قس اؾز

اظ آجب و ثطبه ث اهشیبظار هسیطیشی یبظهس اؾز، ثیكشط ؾطیؽ ب ث قطع سلف یبظ زاضس، یه ثطبه

و ث دطغ ايبف قس اؾز requireAdministrator ثطای requestedExecutionLevelاظبض به ای ث

.سظین هی وس

<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </asmv1:assembly>

code snippet ServiceControl/app.manifest

.قىل وبهل ظیط یه ثطبه زض حبل اجطا ضا كبى هی زس

ػیة یاتی و واقغ نگاری رویداد

زض ایي ثرف ثطذی اظ هؿبئل هطث ث .ػیت یبثی ؾطیؽ ب اظ ػیت یبثی ثطبه بی هؼولی هشفبر اؾز

.هكىالر ذبل ؾطیؽ بی سؼبهلی، الغ گبضی ضیساز.ؾطیؽ ضا لوؽ هی ویس

Page 36: Windows Service

1390-2011 [Windows services]

ثشطیي ضا قطع، ؾبذز یه ؾطیؽ ایجبز یه اؾوجلی ثب لبثلیشی و قوب هی ذایس ثطای آظهبیف هكشطی

ویي و ثطبه وبضثطزی زض حبل اجطا اؾز، قوب هی .اؾز، و زض حمیمز لجال ایي ؾطیؽ ایجبز قس اؾز

الجش، ظ ن هوىي اؾز هكىالسی ثب ؾطیؽ جز .سایس یه ؾطیؽ ضا ثب اؾشفبز اظ ایي اؾوجلی ثؿبظیس

.زاقش ثبقس

ذب ب زض یه جؼج دیبم(message box) ثجع ثطای ؾطیؽ بی )اظ ؾطیؽ وبیف زاز وی قز

زض ػو ؾطیؽ اظ الغ گبض ضیساز ثطای قشي .(.سؼبهلی و ثط ضی ؾیؿشن هكشطی زض حبل اجطا ؿشس

الجش، زض ثطبه هكشطی و اظ ایي ؾطیؽ اؾشفبز .اؾشفبز هی وس (طجز ضیساز)ذب ب زض گعاضـ ضیساز

.هی وس، قوب هی سایس اظ یه جؼج دیبم ثطای االع ضؾبی ث وبضثط زض هضز ذبب كبى زیس

ایي ؾطیؽ وی ساس اظ زاذل یه اثعاض اقىبل ظزایی قطع قز، اهب یه اقىبل ظزایی ضا هی ساى ث

ضا ثب هجغ وس ثبظ ویس مب Solution .وطز (يویو)فطآیس ؾطیؽ زض حبل اجطا هشهل

اشربة ویس فطآیس زض Processes یػال اؾشبزی، Debugاظ هی .ضا سؼییي ویس (قىؿشی)افهبلی

.(هشهل ویس).حبل اجطا ؾطیؽ ضا يویو ویس

قوب هی سایس اقیبی . ظبضر ثط ػولىطز ضا هی ساى ثب ظبضر ثط فؼبلیز ؾطیؽ ب هضز اؾشفبز لطاض زاز

ایي اهط هی ساس ثطذی اظ االػبر هفیس ثطای اقىبل .ذز ضا ث ؾطیؽ ايبف ویس (ثب وبضایی)ػولىطزی

، قوب هی سایس یه قی ثطای زضیبفز (مل لل)Quoteث ػاى هظبل، ثب ؾطیؽ .ظزایی ضا ايبف وس

... . ظهبى ثطای همساض زی الی ل هی وكس.سؼساز ول مل لل ب ثبظگكشی سظین ویس

ث گعاضـ (لبیغ)ؾطیؽ ب هی ساس ذبب االػبر زیگطی ضا ث ؾیل ايبف وطزى ضیساز ب

ث ض ذزوبض ServiceBase هكشك قس اظ والؼ service یه والؼ .گعاضـ زس (طجز لبیغ)لبیغ

ایي ServiceBaseوالؼ . سظین قس ثبقسtrue ثب AutoLogضیساز ب ضا طجز هی وس ظهبی و ذهنیز

ذهنیز ضا ثطضؾی هی وس یه هسذل گعاضـ ثطای زضذاؾز بی قطع، سلف، هىض، ازاه هی

.یؿس

.قىل ظیط ثطای هظبل، یه هسذل گعاضـ ؾطیؽ ضا كبى هی زس

Page 37: Windows Service

1390-2011 [Windows services]

خالصه

NET.) ب چگگی ؾبذز آب ثب چبضچة زار زWindows Servicesزض ایي گفشبض، قوب هؼوبضی

Framework) ثطبه بی وبضثطزی هی ساس زض ظهبى ثر ث ض ذزوبض ثب .ضا زیسیسWindows Services

. قوب هی سایس اظ حؿبة ؾیؿشوی هوشبظ ث ػاى وبضثط اظ ایي ؾطیؽ اؾشفبز وبییس.ب قطع قس

Windows Services ب اظ یه سبثغ انلی ، سبثغ انلی ؾطیؽ، یه ازاض وس ؾبذش قس اس، قوب ثطبه

اظ لجیل ثطبه بی وشطل ؾطیؽ ثطبه هت . ب ضا زیسیسWindows Servicesبی اثؿش ثب سج ث

.ؾطیؽ

و ی وس بی لل وكی و الظم اؾز . ب زاضزWindows Servicesچبضچة زار ز دكشیجبی ػبلی اظ

ثطای ؾبذشي، وشطل، هت ؾطیؽ ب زض زاذل والؼ بی چبض چة زار ز زض فبی بم

System.ServiceProcess ثؾیل ی اؾششبع اظ والؼ . سؼجی قس اؾزServiceBase قوب هی سایس هشس ب ضا ،

ثطای فطاذای ظهبی و ؾطیؽ هىض، ازاه، یب هشلف قس اؾز ثطای هت ؾطیؽ ب زثبض یؿی ویس

ثب سوبهی دیىطثسی بی ضجیؿشطی و هضز یبظ ServiceProcessInstaller ServiceInstaller، والؼ بی

قوب وچیي هی سایس وشطل ظبضر ؾطیؽ ب ضا ثب اؾشفبز اظ .ؾطیؽ اؾز ضؾیسگی هی وس

ServiceControllerزاقش ثبقیس .

.زض دكز نح، ثؿیبضی اظ والؼ بی زار ز ثب اؾشفبز اظ وس هحلی ؾبذش قس اس