Service Control Manager (مدیر کنترل سرویس های ویندوزی) یا SCM یک پراسس سیستم خاص است که از زمان ویندوز NT نیز وجود داشته است.SCM در تعامل با آغاز و یا متوقف کردن سرویس ها است.محل قرارگیری SCM در سیستم عامل ویندوز در مسیر SystemRoot%\System32\services.exe% میباشد.سرویس های ویندوز از طریق API ها با SCM ارتباط برقرار میکنند و همان API بطور داخلی با کنسول مدیریتی MMC snap-in در تعامل است.
در زمان استارت آپ سیستم عامل ویندوز برنامه services.exe توسط پراسسی به نام wininit اجرا میشود.تابع اصلی این فرآیند ()SvcCtrlMain است که تمام سرویس هایی که برای استارت شدن در زمان بوت سیستم عامل ویندوز پیکربندی شده اند را به حالت اجرایی در می آورد.اولین دیتابیس داخلی از سرویس های نصب شده توسط دو کلید رجیستری مهم زیر آغاز سازی میشود :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List
این کلید رجیستری شامل نام ها و ترتیب service groups یا گروه های سرویس میباشد.هر کلید رجیستری شامل یک Group Value اختیاری است که ترتیب آغاز سازی کار سرویس مورد نظر و یا درایور سخت افزارها را با توجه به service group های دیگر کنترل میکند.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
که شامل دیتابیس واقعی از سرویس ها و درایور های سخت افزار ها است که در دیتابیس داخلی SCM خوانده میشود.SCM هر Group Value ی سرویس ها را میخواند و همچنین وابستگی های هر سرویس را با توجه به کلید های رجیستری DependOnGroup و DependOnService بارگذاری میکند.
در گام بعد تابع اصلی SCM یا همان ()SvcCtrlMain تابع ()ScGetBootAndSystemDriverState فراخوانی میکند تا زمانیکه در حین بوت شدن سیستم عامل درایور های سخت افزاری به درستی باگذاری شوند را چک کند.طبیعی است که درایور هایی که به درستی بارکذاری نشده اند در لیستی به نام ScFailedDrivers قرار میگیرند.سپس رابط \Pipe\Ntsvc\ به عنوان رابط سرویس Remote Procedure Call یا RPC که با سرویس های خاصی در ویندوز در تعامل است ایجاد میشود.
بعد از آن تابع ()ScAutoStartServices را فراخوانی میکند.زمانیکه این تابع فراخوانی میشود تمام سرویس هایی که در زمان بوت شدن سیستم عامل ویندوز برای بارگذاری شدن به طور خودکار علامت گذاری شده اند با توجه بر load-order dependencies بارگذاری میشوند.به بیان واضح تر اگر یک وابستگی حلقوی در این شرایط به وجود بیاید خطایی رخ میدهد و سرویس وابسته به یک سرویس دیگر که در یک گروه Load order هستند نادیده گرفته میشوند.برای سرویس های در وضعیت delayed auto-start گروه بندی سرویس ها تحت تاثیر قرار نمیگیرند و آنها در یک مرحله بعد از یک startup دیگر بارگذاری میشوند.
برای هر سرویسی که میخواهد اجرا شود ، SCM تابع ()ScStartService را فراخوانی میکند که این تابع نام فایلی که Service Process در آن است را چک میکند آن هم با اطمینان حاصل کردن از اینکه اکانت اختصاص یافته به آن سرویس همان اکانتی است که در Service Process در حال اجراست.هر سرویسی که با یک اکانت(Service Account) به فعالیت نمیپردازد توسط تابع LSASS که مخفف کلمه های Local Security Authority Subsystem Service لاگین شده به فعالیت میپردازد.برای هر کدام از پراسس های LSASS که شبیه به پسورد های خالی هستند بوسیله SCP و توسط API ای به نام ()LsaStorePrivateData در مسیر \HKLM\SECURITY\Policy\Secrets ذخیره میشوند،البته زمانیکه سرویسی به درستی پیکربندی شده باشد.
سپس تابع ()ScLogonAndStartImage هر سرویسی که یک service process است و در حال اجرا نیست را فراخوانی میکند.service process ها بوسیله API ای به نام ()CreateProcessAsUser در وضعیت Suspended ایجاد میشوند.قبل از اینکه فراِیند اجرایی service process ادامه یابد کانال ارتباطی به نام Pipe\Net\NtControlPipeX\ (که در اینجا X عددی است که با تکرار هر سرویس یکی به مقدارش افزوده میشود است) بین SCM و service process ایجاد میشود.service process با فراخوانی تابع ()StartServiceCtrlDispatcher به کانال ارتباطی(Pipe) متصل میشود که بعد از آن SCM دستور "start" را به سرویس ارسال میکند.
سرویس های Delayed auto-start از زمان ویندوز ویستا اضافه شدند.هدف از ارئه این قابلیت حل مشکل طولانی بودن زمان startup ویندوز بود که در این حین سرویس های حیاتی ویندوز که نمیتوانستند با تاخیر(delay) اجرا شوند سرعت اجرایشان افزایش یافت.در اصل ، متد auto-start برای آغاز کار سرویس ها برای سرویس های حساس و حیاتی ویندوز طراحی شده است که آن هم بر اساس سایر اپلیکشین ها و سرویس های وابسته عمل میکند.
SCM سرویس های Delayed را با فراخوانی تابع ()ScInitDelayStart اجرایی میکند که آن هم بعد از زمانی است که تمام سرویس های auto-start را هندل کرد.تابع مذکور با تاخیری حدود 120 ثانیه(به طور پیشفرض) متناظر با worker-thread ها کار میکند.این به این خاطر است که دگیر بیش از آن که تابع بعد از مدت زمان تاخیر معینی شروع به کار کند تفاوتی بین سرویس های non-delayed و delayed پیدا نمیشود.
نویسنده : امیرحسین کریم پور
منبع : ITPRO
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی میباشد
مدیر ارشد توسینسو و متخصص سرویس های مایکروسافت
امیرحسین کریم پور ، مدیر ارشد توسینسو ، متخصص در حوزه سیستم عامل های کلاینت و سرور مایکروسافت و سرویس های مربوطه ، سیستم عامل لینوکس ، مجازی سازی و ... سابقه کار با سازمان ها و شرکت های مختلف در زمینه سرویس های مایکروسافت در قالب پروژه ، مشاوره و آموزش. علاقه مند به حوزه امنیت اطلاعات و تست نفوذ سنجی
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود