السلام عليكم ورحمة الله وبركاتة...
بأستخدام (MS-VB 6.0)
ذكرت فى أحد الموضوعات السابقة - كيف اسمح لبرنامجي بالعمل اثناء وجوده على السيرفر وهو في حالة logoff - أن هناك نوع خاص من البرامج يعمل كخدمة (Service) - يمكن تشغيل مدير الخدمات من Run ثم services.msc - ويتم تسجيله كـ Service فى النظام ويتم تحديد إذا ما كان يبدء مع بدء التشغيل (Automatic) أم لاحقاً عند اللزوم (Manual) وهكذا، ولكن أنتبه سيكون للبرنامج جميع صلاحيات الـ SYSTEM وهى صلاحيات تفوق حتى صلاحيات الـ Administrator لذلك معظم برامج (فيروسات) الـ (Trojan) تحاول العمل كخدمة Service.
ومرفق فى هذا الموضوع مثال عملى لكيفية جعل برنامجك يعمل كـ(SYSTEM Service)، وهذه الخدمة لا تعمل مع (Win 95/98/ME)، ولكى تعمل معك بنجاح لابد أن يكون لك الصلاحيات لتسجيل خدمة داخل النظام.
حيث يتم ذلك من خلال برنامج SRVStart.exe (مرفق مع المثال) يعمل كـ (SYSTEM Service) ووظيفتة فقط أنه يقوم بتشغيل برنامج أخر أنت تقوم بتحديدة مسبقاً وسيتم تسجيله فى النظام كـ (SYSTEM Service) يمكنه أن يبدء العمل فى كل مرة تشغيل للويندوز، وقبل دخول أى مستخدم للنظام (User LogOn)، وهذا البرنامج يمكنه تسجيل خدمة أو حذفها أو بدئها، ويتم ذلك من خلال المعاملات كالتالى:
Using SRVStart.exe: /Name:<SRVName> Service name أسم الخدمة /App:<AppFullPathname> Full path for application برنامجك /RegOnly Register application only, Don't start it اختيارى /Remove Remove Service from system (Unregister) فى حالة حذف الخدمة
فلو أفترضنا ان لديك برنامج MyService.exe تريده ان يبدء من خلال خدمات النظام (SYSTEM Services) فيتم تسجيله بالشكل التالى:
حيث MyService الأسم الذى أخترتة لهذه الخدمة، وبالطبع يمكنك إختيار أى أسم اخر، ولكن بشرط الا يتكرر، أى لو تريد بدء أكثر من برنامج، فلكل منهما اسم خدمة مختلف.
C:\MyTestApp\MyService.exe: الأسم كامل للبرنامج الذى تريد بدئه.
ستلاحظ أن تم التسجيل وبدء تشغيل البرنامج، أما فى حالة الرغبة فى التسجيل فقط دون تشغيل البرنامج (أثناء عملية Setup مثلاً) فأستخدم:
ومن خلال خصائص الخدمة - الضغط بالزر الأيمن للفارة واختيار Properties (أو Double Click) - يمكنك التحكم فى الخدمة من حيث البدء الآلى (Automatic) أو اليدوى أو عدم البدء ....... الخ
ولحذف هذه الخدمة نهائياً من الخدمات أستخدم:
كما يمكنك الأستعلام عن اسم المستخدم عند بدء برنامجك (Form_Load)، فإذا كان أسم المستخدم SYSTEM تعلم أن برنامج يعمل من خلال الخدمة (SYSTEM Service) وإلا تسجيله كخدمة ثم إنهائه كى يعمل من جديد من خلال الخدمة، ويمكن أستخدام كود للتأكد من ذلك كالتالى:
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Sub Form_Load()
Dim Buffer As String
Buffer = Space$(32)
If GetUserName(Buffer, 31) > 0 Then
Buffer = Trim(Replace(Buffer, Chr(0), ""))
txtUsername.Text = Buffer
' Try to run application as NT Service
If Buffer <> "SYSTEM" Then
Dim szFilename As String
szFilename = Space$(260)
Call GetModuleFileName(0, szFilename, 260)
szFilename = Trim(Replace(szFilename, Chr(0), ""))
Call Shell("SRVStart.exe /Name:" & App.EXEName & " /App:" & Chr$(34) & szFilename & Chr$(34), vbHide)
Unload Me
End If
End If
End Subوبالطبع لابد من وجود الملف SRVStart.exe أو نسخه فى مجلد النظام بدلاً من نسخه مع كل برنامج تريده يبدء من خلال الخدمة.
شكراً



