يدعم Windows 2000/XP و 2003 شيئًا يسمى "برامج الخدمة".
(1) يمكنك التشغيل دون تسجيل الدخول إلى النظام.
(2) امتيازات النظام.
عندما كنت أقوم بتطوير مشروع مربع لتصويره لشركة في عام 2003 ، كتبت تحميلات الدورات التدريبية وخدمات الوسائط.
Run Delphi7 ، سيتم إنشاء تطبيق Save the Project-> آخر --- الإطار.
(1) DisplayName: اسم عرض الخدمة
(2) الاسم: اسم الخدمة.
هنا نقوم بتغيير قيمة اسم "Delphi Service" و "Delphiservice". تقع. سيتم عرض الخدمة والحالة الحالية. عد إلى Delphi7 IDE.
خطةنا هي إضافة نافذة رئيسية لهذه الخدمة. وظيفة.
في الواقع ، لا تعتقد أن برنامج الخدمة يعمل على سطح المكتب Winlogon. تم توقيعه.
ملف-> جديد-> يضيف نموذج Frmmain إلى الخدمة ، ويحفظ الوحدة كوحدة unit_frmmain ، ويقوم بتعيين هذه النافذة ليتم إنشاؤها يدويًا.
الوحدة unit_main ؛
واجهة
يستخدم
Windows ، الرسائل ، sysutils ، الفئات ، الرسومات ، عناصر التحكم ، SVCMGR ، مربعات الحوار ، unit_frmmain ؛
يكتب
tdelphiservice = فئة (tservice)
الإجراءات serviceContinue (المرسل: tservice ؛ var تابع: منطقية) ؛
الإجراءات ServiceExecute (المرسل: tservice) ؛
Service ServicePause (المرسل: tservice ؛ var مؤقت مؤقت: منطقية) ؛
الإجراءات serviceshutdown (المرسل: tservice) ؛
الإجراءات ServicEstart (المرسل: tservice ؛ var chation: boolean) ؛
الإجراء ServicEstop (المرسل: tservice ؛ var توقف: منطقية) ؛
خاص
{إعلانات خاصة}
عام
وظيفة GetServiceController: TserviceController ؛
{الإعلانات العامة}
نهاية؛
var
Delphiservice: tdelphiservice ؛
frmmain: tfrmmain ؛
تطبيق
{$ r *.dfm}
الإجراء ServiceController (CtrlCode: Dword) ؛
يبدأ
delphiservice.controller (ctrlcode) ؛
نهاية؛
وظيفة tdelphiservice.getServiceController: tserviceController ؛
يبدأ
النتيجة: = ServiceController ؛
نهاية؛
الإجراء tdelphiservice.ServiceContinue (المرسل: tservice ؛
تابع فار: منطقية) ؛
يبدأ
بينما لم ينتهي القيام به
يبدأ
النوم (10) ؛
serviceThread.ProcessRequests (false) ؛
نهاية؛
نهاية؛
الإجراء tdelphiservice.ServiceExecute (المرسل: tservice) ؛
يبدأ
بينما لم ينتهي القيام به
يبدأ
النوم (10) ؛
serviceThread.ProcessRequests (false) ؛
نهاية؛
نهاية؛
الإجراء tdelphiservice.ServicePause (المرسل: tservice ؛
فاري توقف مؤقتًا: منطقية) ؛
يبدأ
توقف مؤقتًا: = صحيح ؛
نهاية؛
الإجراء tdelphiservice.ServiceshutDown (المرسل: tservice) ؛
يبدأ
gbcanclose: = صحيح ؛
frmmain.free ؛
الحالة: = csstopped ؛
ReportStatus () ؛
نهاية؛
الإجراء tdelphiservice.servicestart (المرسل: tservice ؛
بدأ فار: منطقي) ؛
يبدأ
بدأ: = صحيح ؛
svcmgr.application.createform (tfrmmain ، frmmain) ؛
gbcanclose: = خطأ ؛
frmmain.hide ؛
نهاية؛
الإجراء tdelphiservice.servicestop (المرسل: tservice ؛
توقف فار: منطقية) ؛
يبدأ
توقف: = صحيح ؛
gbcanclose: = صحيح ؛
frmmain.free ؛
نهاية؛
نهاية.
وحدة النافذة الرئيسية هي كما يلي:
وحدة unit_frmmain ؛
واجهة
يستخدم
Windows ، الرسائل ، sysutils ، المتغيرات ، الفئات ، Shellapi ، الرسومات ، عناصر التحكم ، النماذج ،
مربعات الحوار ، extctrls ، stdctrls ؛
كونست
wm_trayicon = wm_user + 1234 ؛
يكتب
tfrmmain = فئة (tform)
Timer1: تتيمر ؛
Button1: Tbutton ؛
Formcreate الإجراء (المرسل: TOBJECT) ؛
الإجراء formclosequery (المرسل: tooject ؛ var canclose: boolean) ؛
الإجراء FormDestroy (المرسل: tobject) ؛
الإجراء timer1timer (المرسل: TOBJECT) ؛
الإجراءات button1click (المرسل: tobject) ؛
خاص
{إعلانات خاصة}
Icondata: tnotifyicondata ؛
الإجراء addicontotray ؛
الإجراء DELICONFROMTRAY ؛
الإجراءات trayiconmessage (var msg: tmessage) ؛
الإجراء sysbuttonmsg (var msg: tmessage) ؛
عام
{الإعلانات العامة}
نهاية؛
var
frmmain: tfrmmain ؛
GBCanclose: منطقية ؛
تطبيق
{$ r *.dfm}
الإجراء tfrmmain.formcreate (المرسل: tobject) ؛
يبدأ
Formstyle: = fsstayontop ؛
SetWindowlong (application.handle ، gwl_exstyle ، ws_ex_toolwindow) ؛
gbcanclose: = خطأ ؛
timer1.Interval: = 1000 ؛
timer1.Enabled: = true ؛
نهاية؛
الإجراء tfrmmain.formClosequery (المرسل: tobject ؛ var canclose: boolean) ؛
يبدأ
canclose: = gbcanclose ؛
إذا لم يكن canclose ثم
يبدأ
يخفي؛
نهاية؛
نهاية؛
الإجراء tfrmmain.formdestroy (المرسل: tobject) ؛
يبدأ
Timer1.Enabled: = false ؛
DELICONFROMTRAY ؛
نهاية؛
الإجراء tfrmmain.addicontotray ؛
يبدأ
zeromemory (@icondata ، sizeof (tnotifyicondata)) ؛
icondata.cbsize: = sizeof (tnotifyicondata) ؛
icondata.wnd: = مقبض ؛
icondata.uid: = 1 ؛
icondata.uflags: = nif_message أو nif_icon أو nif_tip ؛
icondata.ucallbackMessage: = wm_trayicon ؛
icondata.hicon: = application.icon.handle ؛
icondata.sztip: = 'Delphi Service Demo Program' ؛
shell_notifyicon (nim_add ، @econdata) ؛
نهاية؛
الإجراء tfrmmain.deliconfromtray ؛
يبدأ
shell_notifyicon (nim_delete ، @icondata) ؛
نهاية؛
الإجراء tfrmmain.sysbuttonmsg (var msg: tmessage) ؛
يبدأ
if (msg.wparam = sc_close) أو
(msg.wparam = sc_minimize) ثم الاختباء
ورثت
نهاية؛
الإجراء tfrmmain.trayiconMessage (var msg: tmessage) ؛
يبدأ
if (msg.lparam = wm_lbuttondblclk) ثم show () ؛
نهاية؛
الإجراء tfrmmain.timer1timer (المرسل: tobject) ؛
يبدأ
addicontotray
نهاية؛
الإجراء sendhokkey ؛ stdcall ؛
var
hdesk_wl: hdesk ؛
يبدأ
hdesk_wl: = opendesktop ('winlogon' ، 0 ، false ، desktop_journalplayback) ؛
if (hdesk_wl <> 0) ثم
if (setThReadDesktop (HDESK_WL) = true) ثم
postMessage (HWND_BROADCAST ، WM_HOTKEY ، 0 ، Makelong (mod_alt أو mod_control ، vk_delete)) ؛
نهاية؛
الإجراء tfrmmain.button1click (المرسل: tobject) ؛
var
dwThreadid: dword ؛
يبدأ
CreateThread (nil ، 0 ، sendhokkey ، nil ، 0 ، dwThreadId) ؛
نهاية؛
نهاية.
التجديد:
(1) لمزيد من برامج عرض برنامج الخدمة ، يرجى زيارة عنوان URL التالي: http://www.torry.net/pages.php؟id=226 ، والذي يحتوي على رموز متعددة توضح كيفية التحكم في خدمات النظام وإدارتها.
(2) يرجى تذكر: يحتوي Windows في الواقع على أجهزة كمبيوتر سطح عمل متعددة. يقع على شاشة Screen Protector.
(3) هناك أيضًا طريقة تبديل ديناميكية للتفاعل بين برنامج الخدمة وسطح المكتب.
وحدة الخدمة.
واجهة
وظيفة initservicedesktop: منطقية ؛
الإجراءات doneservicedesktop ؛
تطبيق
يستخدم النوافذ ، sysutils ؛
كونست
DefaultWindowStation = 'WinSta0' ؛
defaultDeskTop = 'Default' ؛
var
Hwinstasave: Hwinsta ؛
Hdesksave: Hdesk ؛
Hwinstauser: Hwinsta ؛
Hdeskuser: Hdesk ؛
وظيفة initservicedesktop: منطقية ؛
var
dwThreadid: dword ؛
يبدأ
dwThreadId: = getCurrentThreadId ؛
// ضمان اتصال بمحطة نافذة الخدمة وسطح المكتب ، و
// حفظ مقابضهم.
Hwinstasave: = getProcessWindowStation ؛
hdesksave: = getThReadDesktop (dwThreadId) ؛
Hwinstauser: = OpenWindowStation (DefaultWindowStation ، false ، maximum_allowed) ؛
إذا كان Hwinstauser = 0 ثم
يبدأ
outputDeBugString (PCHAR ('OpenWindowStation فشل' + syserrormessage (getLasterror))) ؛
النتيجة: = خطأ ؛
مخرج؛
نهاية؛
إذا لم يكن setProcessWindowStation (Hwinstauser) ثم
يبدأ
outputDebugString ('setProcessWindowStation فشل') ؛
النتيجة: = خطأ ؛
مخرج؛
نهاية؛
hdeskuser: = opendesktop (defaultDesktop ، 0 ، false ، maximum_allowed) ؛
إذا كان hdeskuser = 0 ثم
يبدأ
outputDeBugString ("فشل Opendesktop") ؛
setProcessWindowStation (Hwinstasave) ؛
ClosewindowStation (Hwinstauser) ؛
النتيجة: = خطأ ؛
مخرج؛
نهاية؛
النتيجة: = setThReadDesktop (hdeskuser) ؛
إذا لم يكن نتائج ذلك
outputDeBugString (pchar ('setThReadDesktop' + syserrormessage (getLasterror))) ؛
نهاية؛
الإجراءات doneservicedesktop ؛
يبدأ
// استعادة محطة نافذة وسطح المكتب.
setThReadDesktop (Hdesksave) ؛
setProcessWindowStation (Hwinstasave) ؛
إذا كان Hwinstauser <> 0 ثم
ClosewindowStation (Hwinstauser) ؛
إذا كان hdeskuser <> 0 ثم
learesktop (hdeskuser) ؛
نهاية؛
التهيئة
initservicedesktop.
الانتهاء
doneservicedesktop.
نهاية.
لمزيد من رمز العرض التفصيلي ، يرجى الرجوع إلى: http://www.torry.net/samples/samples/os/isarticle.zip
(4) كيفية إضافة أوصاف الخدمة حول كيفية تثبيت الخدمة. يقعنا الآن في HKEY_LOCAL_MACHINE/CONTROLSET001. يلي:
وحدة winsvcex ؛
واجهة
يستخدم Windows ، WINSVC ؛
كونست
//
// مستويات معلومات تكوين الخدمة
//
service_config_description = 1 ؛
service_config_failure_actions = 2 ؛
//
// اسم DLL للوظائف المستوردة
//
advapidll = 'advapi32.dll' ؛
يكتب
//
// سلسلة وصف الخدمة
//
pservedescriptiona = ^tservedescriptiona ؛
pservedescriptionw = ^tservedescriptionw ؛
pservedescription = pservedescriptiona ؛
{$ externalsym _service_descriptiona}
_service_descriptiona = السجل
LPDescription: Pansichar ؛
نهاية؛
{$ externalsym _service_descriptionw}
_service_descriptionw = السجل
LPDescription: Pwidechar ؛
نهاية؛
{$ externalsym _service_description}
_service_description = _service_descriptiona ؛
{$ externalsym service_descriptiona}
service_descriptiona = _service_descriptiona ؛
{$ externalsym service_descriptionw}
service_descriptionw = _service_descriptionw ؛
{$ externalsym service_description}
service_description = _service_descriptiona ؛
tservedescriptiona = _service_descriptiona ؛
tservedescriptionw = _service_descriptionw ؛
tservicedescription = tservicedescriptiona ؛
//
// الإجراءات اللازمة لاتخاذ فشل الخدمة
//
{$ externalsym _sc_action_type}
_sc_action_type = (sc_action_none ، sc_action_restart ، sc_action_reboot ، sc_action_run_command) ؛
{$ externalsym sc_action_type}
sc_action_type = _sc_action_type ؛
pserviceAction = ^tserviceAction ؛
{$ externalsym _sc_action}
_sc_action = السجل
anype: sc_action_type ؛
التأخير: DWORD ؛
نهاية؛
{$ externalsym sc_action}
sc_action = _sc_action ؛
tserviceAction = _sc_action ؛
pserviceFailUreActionsa = ^tserviceFailUreActionsa ؛
pserviceFailUreActionsw = ^tserviceFailUreActionsw ؛
pserviceFailUreActions = pserviceFailUreActionsa ؛
{$ externalsym _service_failure_actionsa}
_service_failure_actionsa = السجل
dwresetperiod: dword ؛
lprebootmsg: LPSTR ؛
LPCommand: LPSTR ؛
Cactions: Dword ؛
lpsaactions: ^sc_action ؛
نهاية؛
{$ externalsym _service_failure_actionsw}
_service_failure_actionsw = السجل
dwresetperiod: dword ؛
lprebootmsg: lpwstr ؛
LPCommand: LPWSTR ؛
Cactions: Dword ؛
lpsaactions: ^sc_action ؛
نهاية؛
{$ externalsym _service_failure_actions}
_service_failure_actions = _service_failure_actionsa ؛
{$ externalsym service_failure_actionsa}
service_failure_actionsa = _service_failure_actionsa ؛
{$ externalsym service_failure_actionsw}
service_failure_actionsw = _service_failure_actionsw ؛
{$ externalsym service_failure_actions}
service_failure_actions = _service_failure_actionsa ؛
tserviceFailUreActionsa = _service_failure_actionsa ؛
tserviceFailUreActionsw = _service_failure_actionsw ؛
tserviceFailUreActions = tserviceFailUreActionsa ؛
////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////
// نماذج وظيفة API
////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////
tqueryserviceConfig2 = function (hservice: sc_handle ؛ dwinfolevel: dword ؛ lpbuffer: pointer ؛
cbbufsize: dword ؛
tchangeserviceConfig2 = function (hservice: sc_handle ؛ dwinfolevel: dword ؛ lpinfo: pointer): bool ؛
var
HDLL: Thandle ؛
libloaded: منطقية ؛
var
insversionInfo: tosversioninfo ؛
{$ externalsymyym queryserviceConfig2a}
QueryServiceConfig2a: TqueryserviceConfig2 ؛
{$ externalsymymyym queryserviceConfig2w}
QueryServiceConfig2w: TqueryserviceConfig2 ؛
{$ externalsymymyym queryserviceConfig2}
QueryServiceConfig2: TqueryserviceConfig2 ؛
{$ externalsymmyMeyM
changeviceConfig2a: tchangeserviceConfig2 ؛
{$ externalsymmyMeyM
changeviceConfig2w: tchangeserviceConfig2 ؛
{$ externalsymmyMeym
changeviceConfig2: tchangeserviceConfig2 ؛
تطبيق
التهيئة
OsversionInfo.dwosversionInfosize: = sizeof (isversionInfo) ؛
getVersionEx (insversionInfo) ؛
if (osversionInfo.dwplatformid = ver_platform_win32_nt) و (osversioninfo.dwmajorversion> = 5) ثم
يبدأ
إذا كان hdll = 0 ثم
يبدأ
HDLL: = getModuleHandle (Advapidll) ؛
libloaded: = خطأ ؛
إذا كان hdll = 0 ثم
يبدأ
HDLL: = LoadLibrary (Advapidll) ؛
libloaded: = صحيح ؛
نهاية؛
نهاية؛
إذا كان hdll <> 0 ثم
يبدأ
@queryserviceConfig2a: = getProcadDress (hdll ، 'queryserviceConfig2a') ؛
@queryserviceConfig2w: = getProcadDress (hdll ، 'queryserviceConfig2w') ؛
@queryserviceConfig2: = @queryserviceConfig2a ؛
@changeviceConfig2a: = getProcadDress (HDLL ، 'changeviceConfig2a') ؛
@changeviceConfig2w: = getProcadDress (hdll ، 'changeviceConfig2w') ؛
@changeviceConfig2: = @changeviceConfig2a ؛
نهاية؛
نهاية
آخر
يبدأ
@queryserviceConfig2a: = nil ؛
@queryserviceConfig2w: = nil ؛
@queryserviceConfig2: = nil ؛
@changeviceConfig2a: = nil ؛
@changeviceConfig2w: = nil ؛
@changeviceConfig2: = nil ؛
نهاية؛
الانتهاء
إذا (hdll <> 0) و libloaded ثم
Freelibrary (HDLL) ؛
نهاية.
وحدة Winntservice.
واجهة
يستخدم
Windows ، WinSVC ، WinSvCex ؛
دالة تثبيت الخدمة (const strservicename ، strdisplayname ، strdescription ، strfilename: string): boolean ؛
// على سبيل المثال: installservice ("اسم الخدمة" ، "اسم العرض" ، "معلومات الوصف" ، "ملف الخدمة") ؛
الإجراء إلغاء التثبيت (strservicename: سلسلة) ؛
تطبيق
وظيفة strlcopy (dest: pchar ؛ const المصدر: pchar ؛ maxlen: cardinal): pchar ؛
ASM
دفع EDI
دفع ESI
دفع EBX
MOV ESI ، EAX
MOV EDI ، EDX
MOV EBX ، ECX
xor al ، al
اختبار ECX ، ECX
JZ 1
repne scasb
JNE 1
INC ECX
1: Sub EBX ، ECX
MOV EDI ، ESI
Mov ESI ، edx
MOV EDX ، EDI
MOV ECX ، EBX
SHR ECX ، 2
مندوب موفسد
MOV ECX ، EBX
و ECX ، 3
مندوب MOVSB
Stosb
MOV EAX ، EDX
البوب EBX
البوب ESI
البوب edi
نهاية؛
دالة strpchar (dest: pchar ؛ const المصدر: سلسلة): pchar ؛
يبدأ
النتيجة: = strlcopy (dest ، pchar (المصدر) ، الطول (المصدر)) ؛
نهاية؛
دالة تثبيت الخدمة (const strservicename ، strdisplayname ، strdescription ، strfilename: string): boolean ؛
var
// ss: tservicestatus ؛
// PSTEMP: PCHAR ؛
HSCM ، HSCS: Thandle ؛
srvdesc: pservicedescription ؛
DESC: سلسلة.
// srvtype: dword ؛
LpserviceArgvectors: PCHAR ؛
يبدأ
النتيجة: = خطأ ؛
// pstemp: = nil ؛
// srvtype: = service_win32_own_process and service_interactive_process ؛
HSCM: = OpenScManager (NIL ، NIL ، SC_MANAGER_ALL_ACCESS) ؛ // قم بتوصيل قاعدة بيانات الخدمة
إذا كان HSCM = 0 ثم exit ؛ // messagebox (hhandle ، pchar (syserrormessage (getLasterror)) ، "مدير برنامج الخدمة" ، MB_ICONERROR+MB_TOPMIST) ؛
HSCS: = CreateService (// إنشاء وظيفة الخدمة
HSCM ، // مقبض إدارة التحكم في الخدمة
PCHAR (strservicename) ، // اسم الخدمة
PCHAR (StrdisPlayName) ، // معروضة اسم الخدمة
service_all_access ، // حقوق الوصول
service_win32_own_process أو service_interactive_process ، // service type service_win32_share_process
service_auto_start ، // نوع بدء التشغيل
service_error_ignore ، // نوع التحكم في الخطأ
PCHAR (Strfilename) ، // برنامج الخدمة
لا شيء ، // اسم خدمة المجموعة
لا شيء ، // معرف المجموعة
لا شيء ، // الخدمات المعتمدة
لا شيء ، // ابدأ حساب الخدمة
لا شيء) ؛
إذا كان HSCS = 0 ثم exit ؛ // messagebox (hhandle ، pchar (syserrormessage (getLasterror)) ، pchar (application.title) ، mb_iconerror+mb_topmish) ؛
إذا تم تعيينه (changeviceConfig2) ثم
يبدأ
desc: = نسخة (strdescription ، 1،1024) ؛
getMem (srvdesc ، sizeof (tservicedescription)) ؛
getMem (srvdesc^.lpdescription ، الطول (desc) + 1) ؛
يحاول
strpcopy (srvdesc^.lpdescription ، desc) ؛
changeviceConfig2 (HSCs ، service_config_description ، srvdesc) ؛
أخيراً
freemem (srvdesc^.lpdescription) ؛
Freemem (srvdesc) ؛
نهاية؛
نهاية؛
lpserviceargvectors: = nil ؛
إذا لم تكن تبدأ (HSCs ، 0 ، lpserviceargvectors) ثم // ابدأ الخدمة
الخروج ؛
CloseServiceHandle (HSCs) ؛
النتيجة: = صحيح ؛
نهاية؛
الإجراء إلغاء التثبيت (strservicename: سلسلة) ؛
var
Scmanager: sc_handle ؛
الخدمة: sc_handle ؛
الحالة: tservicestatus ؛
يبدأ
Scmanager: = OpenScmanager (nil ، nil ، sc_manager_all_access) ؛
إذا كان Scmanager = 0 ثم الخروج ؛
يحاول
الخدمة: = OpenService (Scmanager ، Pchar (strservicename) ، service_all_access) ؛
ControlService (Service ، service_control_stop ، status) ؛
DELETESERVICE (الخدمة) ؛
CloseServiceHandle (الخدمة) ؛
أخيراً
CloseServiceHandle (Scmanager) ؛
نهاية؛
نهاية؛
نهاية.
(5) كيفية إغلاق برنامج الخدمة بشكل وحشي وإدراك وظيفة "أدوات NT" السابقة؟
يستخدم tlhelp32 ؛
وظيفة killtask (exefilename: سلسلة): عدد صحيح ؛
كونست
process_ertminate = $ 0001 ؛
var
Continueloop: Bool ؛
fsnapshothandle: Thandle ؛
fprocessentry32: tprocessentry32 ؛
يبدأ
النتائج: = 0 ؛
fsnapshothandle: = CreateToolHelp32Snapshot (Th32CS_SnapProcess ، 0) ؛
fprocessentry32.dwsize: = sizeof (fprocessentry32) ؛
ContinueLoop: = Process32First (fsnapshothandle ، fprocessentry32) ؛
بينما يقوم عدد صحيح (ContinueAboop) <> 0
يبدأ
if ((agurcase (extractFilename (fprocessentry32.szexefile)) =
أقصى (exefilename)) أو (أقصى (fprocessentry32.szexefile) =
الكبير (Exefilename)) ثم
النتيجة: = عدد صحيح (TerminateProcess (
OpenProcess (Process_terminate ،
منطقي (0) ،
fprocessentry32.th32processid) ،
0)) ؛
ContinueLoop: = Process32Next (fsnapshothandle ، fprocessentry32) ؛
نهاية؛
CloseHandle (fsnapshothandle) ؛
نهاية؛
ومع ذلك ، بالنسبة لبرنامج الخدمة ، فإنه سيؤدي إلى "الوصول إلى".
وظيفة enabledeBugprivilege: منطقية ؛
تمكين الوظيفة (htoken: cardinal ؛ privname: string ؛ benable: boolean): boolean ؛
var
TP: token_privileges ؛
دمية: الكاردينال.
يبدأ
tp.privileGeCount: = 1 ؛
lookuprivilegevalue (NIL ، PCHAR (privname) ، tp.privileges [0] .luid) ؛
إذا كان قابلا ثم
tp.privileges [0] .attributes: = se_privilege_enabled
else tp.privileges [0] .attributes: = 0 ؛
تعديل ttokenprivileges (htoken ، false ، tp ، sizeof (tp) ، nil ، dummy) ؛
النتيجة: = getLasterror = error_success ؛
نهاية؛
var
Htoken: الكاردينال.
يبدأ
OpenProcessToken (GetCurrentProcess ، token_adjust_privileges ، htoken) ؛
النتيجة: = enableprivilege (htoken ، 'sedebugprivilege' ، true) ؛
CloseHandle (htoken) ؛
نهاية؛
كيفية استخدام:
EnableDeBugprivilege ؛ // رفع الأذونات
KillTask ('xxxx.exe') ؛ // أغلق برنامج الخدمة.
------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------ ----------