בס"ד
כתיבה
והתקנה
של Windows Services
, בויזואל סטודיו 2010
תורגם מ Arcane Code ע"י ברוך רוטקוף
תאריך פירסום:12.5.12
שימוש ב Visual Studio 2010
טוב, זה המדריך הראשון שלי, אז קבלו בהבנה, ואם יש הערות- אני אשמח לקבל!
הערה: די בסוף כתיבת המדריך
שמתי לב שלפרויקט קראתי ThaWindowsServiceProject
(שים לב- a במקום e). מה שיכולתי לשנות, שיניתי.. אתה- תשתמש תמיד בe, גם אם בתמונה או בטקסט כתוב a.
הקדמה:
Windows
Service- שירות של Windows.
שירות זה סוג של תוכנה שפועלת ברקע, בלי תצוגה גרפית כלשהו. אם אתה צריך תוכנה שתפעל כל הזמן על שרת, מסוף, או שתפעל ברקע- תשתמש ב Windows Service. ההתקנה של השירות במערכת ההפעלה, תגרום להפעלתו כל הזמן, ביחד עם המערכת.
לכן, שים לב- לשירות אין ממשק משתמש! בגלל שהשירות פועל ברקע, הודעות (MessageBox) טפסים (Forms) וכד'- אסורים. אם אתה צריך לכתוב הודעות, עליך להשתמש ב Event Logger.
להתחלת השירות יש 3 אפשרויות.
1.
ידני (Manual) ברירת מחדל- במצב הזה המשתמש או תוכנית חייבים להפעיל את השירות
.2
אוטומטי (Automatic)- כאן windows יהיה אחראי על השירות, ויתחיל אותו כש Windows עצמו מתחיל.
3
לאזמין (Disabled)- אף אחד לא יכול להתחיל את השירות, עד שתשנה לאחד מהערכים הקודמים.
אבטחה:
·
LocalService- הכי מוגן. אין אפשרות גישה למשימות מאובטחות כמו גישה לדיסק קשיח. זה טוב כשאתה צריך לעקוב אחרי מה שקורה במחשב ולשמור ביומן האירועים של השירות, בלי הרבה משאבים.
·
NetworkService- מתאים לשרת. מגביל את הגישה למשימות מאובטחות, אבל מאפשר התקשרות עם מחשבים אחרים.
·
LocalSystem- בעל הרשאות בלתי מוגבלות. לא מומלץ לבחור בזה אם השירות מחובר לאינטרנט, כי במקרה של פריצת הקוד, התוצאות יכולות להיות קשות.
·
User (ברירת מחדל)- דורש שם משתמש וסיסמה, ונותן הרשאות של אותו משתמש.
כדאי גם לשים לב, ששירות שונה מתוכנה חלונאית רגילה בדרך הדיבוג, ובדרך ההתקנה, שבה נעסוק בהמשך.
מתחילים!
נפתח את visual studio ונבחר New
Project>Visual C#>Windows>Windows Service וניתן לו את השם "TheWindowsServiceProject". לחץ OK.
נוצרו לנו 2 קבצים- Program.cs, ו Service1.cs.
נפתח את Program.cs,
בו נמצאת פעולת ה Main שפועלת ראשונה בפרויקט. שים לב לקוד. בקוד נוצר מערך מסוג ServiceBase,
ומאותחל עם אובייקט אחד מסוג Service1 (שזה בעצם השירות שלנו!) לאחר מכן ע"י הפעולה הסטטית ServiceBase.Run,
מופעלים כל השירותים. (אתה מבין בעצם שתוכל להוסיף עוד שירות, ולהוסיף אותו במערך..)
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
כעת נשנה את שם השירות, כדי שנזכור את ההתייחסות אליו. לחץ על השירות (Service1.cs) ב"סייר הפתרון" (אל תשאל אותי למה קוראים לזה ככה..) והחלף את שמו ל"TheService". בתיבת הדו שיח שתופיע, ותשאל אם לשנות את כל ההניות לאותו שם, בחר כמובן OK. תוכל לראות שאכן שם השירות השתנה גם בקובץ Program.cs.
חשוב לציין שהפעולה Run מפעילה את השירות בתהליך משלו, ועוברת לשורה הבאה. במקרה שלנו, תוכנת בקרה מפעילה את השירות, ואם תוסיף הרבה קוד לפני פעולת Run התוכנה מוגבלת לזמן כלשהו עד הפעלת השירות, ובמקרה כזה היא תעצור לפני הגעת השירות.
מאפייני השירות:
פתח את TheService.cs,
ויופיע לך חלון אפור. לחץ עליו ותגש לטבלת המאפיינים (Properties).
·
ServiceName- ש ם השירות, נכתוב שם "MyServiceRunning". שים לב! חשוב לשנות את השם בכל יצירת Windows Service, משום שהשארת 2 שירותים עם אותו שם תגרום להם להתנגש.
·
AutoLog- כאשר מוגדר כ True (ברירת מחדל), השירות יטפל בשבילך בהודעות עבור התחלה, הפסקה וכו'. מומלץ להשאיר כך, כדי לא לקבל מידע רב מידי.
·
מאפייני Can- כשתגדיר מאפיין כזה כTrue, תצטרך להוסיף שיטה שתגיף לאירוע שהמאפיין מוגד עבורו.
קוד:
לחץ פעמיים על השטח האפור שבשירות, ותקבל את מחלקת השירות. שים לב ל2 פעולות- OnStart ו OnStop. די מובן שהם פועלות בהתחלה ובעצירה, בהתאמה.. שים לב שהמחלקה יורשת מ ServiceBase,
שמחייבת ליישם את 2 השיטות האלה...
כעת נוסיף קוד. נבצע כתיבה ליומן האירועים כל דקה. מומלץ להסתכל בפרטי המחלקה EventLog לפני ותוך כדי.
1.
ייבא את מרחב השמות System.Timers ע"י הוספת משפט using לאיזור הusingים.
.2
צהר על אובייקט מסוג Timer בשם timer1, ואתחל אותו בפונקצייה הבונה של השירות, תן לו לפעול כל דקה. (6000 אלפית שנייה.
.3
. הוסף לאירוע Elapsed שלו את הפונקצייה timer1_Elapsed
במתודות OnStart ו OnStop הפעל את הפונקציות Start ו Stop של הטיימר.
4.
V.שים את הקוד הזה במתודה timer1_Elapsed-
string message = "My Service: "
+ DateTime.Now.ToShortDateString() + " "
+ DateTime.Now.ToShortTimeString();
this.EventLog.WriteEntry(message,EventLogEntryType.Information);
הקוד שלי נראה כך:
האובייקט EventLog:
האובייקט שייך למחלקה EventLog.
תפקיד המחלקה הוא לרשום הודעות ביומן האירועים.
כתבנו הודעה, ושלחנו אותה. שים לב להדרת סוג ההודעה.
התקנה:
בשונה מיישומים אחרים, ש Visual Studio מתקין אוטומטית, את השירות נצטרך להתקין בעצמנו.
קודם כל, מומלץ ללחוץ על F6 כדי לבדוק אם קיימות שגיאות.
נגיע חזרה לחלון האפור של TheService.cs,
נלחץ לחיצה ימנית ונבחר "Add
Installer". יתווסף לנו קובץ ProjectInstaller.cs ועוד כמה Reference.
כנס לקובץ ProjectInstaller.cs,
ולחץ על ServiceInstaller1. גש לטבלת המאפיינים, ושים לב-
·
המאפיין DisplayName-
המאפיין שיוצג בטבלת השירותים. (אני כתבתי "MyServiceInWindows").
·
המאפיין Description- כתיבת תיאור לשירות, בתור הסבר שיוצג עם השירות ברשימת השירותים של Windows. (אני כתבתי "My
experimental service (description)" ).
·
המאפיין StartType-
תוכל לעיין בהקדמה למעלה כדי להיזכר בערכים שלו.
עכשיו פתח את Visual Studio
Command Prompt (אני הייתי צריך "לפתוח כמנהל", אחרת זה לא עבד..) הקלד שם "installutil -i" ואז את מיקום היישום- קובץ exe שבתיקייה
"bin\Debug".
שים לב ל2 ההודעות בסוף, אלו מאשרות את ההתקנה.
אם סיימת עם זה-
אולי תנסה להפעיל את שורת הפקודה של visual studio כמנהל, או שהשירות מותקן כבר (כך שתנסה להסיר אותו קודם, ראה בהמשך.)
פתח את MMC (פשוט כתוב ב"הפעלה" (באנגלית "Run...")
את הראשי תיבות MMC), קובץ, הוספה של יישום snap-in, והוסף מהרשימה את "שירותים".
פתח את הרשימה ע"י דאבלקליק, וחפש את השירות שלך לפי השם שקראת לו במאפיין DisplayName בהתחלת חלק ההתקנה במדריך.
אם במאפיין StartType
בחרת Manual, לחץ פעמיים על השירות כדי להפעיל אותו. שים לב לתיאור שמופיע.
הוסף snap-in חדש, את "מציג האירועים", וחפש שם את השירות שלנו.
להסרת השירות (בשביל לשנות קוד הנך חייב להסיר את השירות, לשמור את השינויים ולהתקינו מחדש) -
אותה פקודה בדיוק, רק installutil
-u.
בקשה אישית-
אם קראת את המדריך, ספר לי, שאני אדע שלא בזבזתי עליו זמן (לוקח זמן לכתוב מדריך מושקע..), וגם כי סתם אני נהנה להחליף דעות עם אנשים בנושאי תכנות למיניהם....
ברוך רוטקוף baruchiro@gmail.com
***