PDA

View Full Version : حرفه ای: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی



Mr'Jamshidy
دوشنبه 02 بهمن 1391, 20:51 عصر
سلام

این تاپیک ایجاد شده تا در مورد روش های ساخت سرویس های ویندوز بوسیله ویژوال بیسیک گفتگو و تبادل اطلاعات بشه.


فقط یک چیزی رو همین اول بگم
دوستان تو تاپیک پست الکی ندن لطفا که نظم تاپیک به هم نخوره
پیشاپیش ممنون


ابتدا باید ببینیم که چرا نیاز داریم تا یک سرویس بنویسیم، هدف از نوشتن سرویس چیه؟

یکی از مواردی که ما از سرویس ها استفاده میکنیم دسترسی به سطح سیستم هست
مثلا آنتی ویروس ها در این سطح اجرا میشن و اجازه بستن سرویس رو از شما میگیرن

دقت کن سرویس باز حالا هی بیا سوال کن چطور جلو بسته شدن پروسه رو بگیرم

98813

و البته کلی مزایا دیگه
البته کارایی آنتی ویروس ها ربطی به سرویس بودنشون نداره شما این کار ها رو تو یک پروسه معمولی هم میتونید انجام بدید

البته به غیر از بعضی هاش که باید براش درایور نوشته بشه بگذریم

خوب حالا کار به این حرفا نداریم میریم سر بحث نحوه ساخت

نوشتن سرویس ها در ویژوال بیسیک 6 راه های متعددی داره که من فعلا به 2 راه اشاره میکنم

روش اول (استفاده از کامپوننت مایکروسافت):

فایل مربوطه: NTSVC.zip

خوب همونطور که از اسمش پیداست مشخصه برای این روش نیاز به یک کامپوننت داریم

اسم کامپوننت هست NTSVC و توسط شرکت مایکروسافت ارایه شده (که از قسمت ضمیمه ها قابل دسترس هست)

با استفاده از این کامپوننت شما میتونید سرویس مورد نظر تون رو بنویسید اما چطور؟

1. ویژوال بیسیک رو باز کنید
2. یک پروژه از نوع Standard EXE ایجاد کنید
3. کامپوننت مورد نظر رو به پروژه اضافه کنید (Microsoft NT Service Control)
4. کامپوننت رو روی فرم قرار داده و به صورت زیر تنظیم میکنیم


Name
cNTService
-------
DisplayName
نامی که دوست دارید در پانل کنترل سرویس ها نمایش داده بشه
-------
Interactive
اگر میخواهید تا سرویس توانایی ارتباط با کامپیوتر رو داشته باشه این گزینه رو True کنید
-------
ServiceName
نام سرویس شما (بدون کاراکتر فاصله)
-------
StartMode
این گزینه مشخص میکنه که سرویس شما به چه نحوی میتونه شروع به کار کنه
- svcStartAutomatic: این گزینه مشخص میکنه که سرویس بصورت خودکار اجرا بشه
- svcStartManual: این گزینه مشخص میکنه که سرویس بصورت دستی اجرا بشه
- svcStartDisabled: این یکی هم میگه که اصلا اجرا نشه

5. کد زیر رو به رویداد Form_Load اضافه کنید
Select Case UCase$(Trim$(Command$))
Case "-I", "/I"
If cNTService.Install Then
MsgBox cNTService.DisplayName & " installed successfully."
Else
MsgBox cNTService.DisplayName & " did not install successfully."
End If
Case "-U", "/U"
If cNTService.Uninstall Then
MsgBox cNTService.DisplayName & " uninstalled successfully."
Else
MsgBox cNTService.DisplayName & " did not uninstall successfully."
End If
Case ""
cNTService.StartService
Case Else
MsgBox "The parameter: " & Command & " was not understood. Try -I (install) or -U (uninstall)."
End Select

مدیریت خطاها:

در روال مدیریت خطا ممکنه شما بخواید از اطلاعات خطا خروجی بگیرید یا همون لاگ
در این حالت شما میتونید از App.LogEvent استفاده کنید ولی در NTsvc ما گزینه دیگری نیز داریم
شما میتوانید از گزینه cNTService.LogEvent هم استفاده کنید

NTService.LogEvent svcEventError, svcMessageError, Err.Description
و
NTService.LogEvent svcEventInformation, svcMessageInfo, "Something happened"

رویدادهای سرویس:

شما نیاز دارید در برخی از رویداد های زیر کد بنویسید

رویداد Start:
این رویداد زمانی اجرا میشود که سرویس شما در حال شروع به کار است

در این حالت اگر کد های شما با موفقیت کار خود را انجام داد Flag یا همون پرچم Success رو برابر True قرار دهید

رویداد Stop:
این رویداد زمانی اجرا میشود که سرویس شما درحال پایان یافتن باشد

رویداد Pause:
این رویداد زمانی اجرا میشود که سرویس شما درحال متوقف شدن باشد

رویداد Continue:
این رویداد زمانی اجرا میشود که سرویس شما در حال راه اندازی مجدد باشد

مشکلات بالقوه:
چند مشکل در هنگام اجرا یک سرویس ان.تی در ویژوال بیسیک 6 به صورت بالقوه وجود دارد که به برخی از آنها اشاره میشود

وابستگیها:
اگر سرویس شما به سرویس دیگری وابسته است، شما باید مطمئن شوید این اطلاعات به درستی در رجیستری ثبت شده است

هشدار: تنظیم نادرست وابستگی به یک سرویس در رجیستری میتواند سیستم عامل شما را غیر قابل بوت کند، با توجه به مسایلی مانند وابستگی مدور (سرویس الف نمیتواند قبل از سرویس ب و سرویس ب نمیتواند قبل از سرویس الف شروع به کار کند) در نتیجه هیچ یک از سرویس ها شروع به کار نخواهند کرد.

خیلی مراقب باشید، خطر داره حسن!

خوب دیگه دهنم سرویس شد بسکه نوشتم باقی توضیحات و روش دوم باشه برای بعد
موفق باشید


**ویرایش


روش دوم (استفاده از برنامه واسطه):

فایل مربوطه: Windows Service.zip

این روش خیلی آسون تر هست

در واقع تو این روش شما طبق روال همیشه برنامه تون رو مینویسید و کار خاصی هم انجام نمیدید
اما موقع افزودن برنامه به سرویس ها یک واسطه قرار میدید

خوب فایل مربوطه رو دانلود کنید

داخل فایل فشرده 4 عدد فایل دیگه هست که 3 تا از اونا فایل اجرایی هستن

اگر برای تست هست که زیاد مهم نیست اما در مواقعی که میخواید سرویس رو واقعا رو سیستم کاربر نصب کنید حتما تو پوشه System32 کپی کنید (البته تو یک پوشه جدا کنه)

خوب حالا از برنامه های ارسال شده برنامه SRVINSTW.EXE رو اجرا کنید

این برنامه کار نصب و حذف سرویس رو انجام میده که بعده ها خودتون باید این کار رو دستی انجام بدید، این فقط برای اینه که با روال کار آشنا بشید

در صفحه اول از شما میپرسه چه کاری میخواید انجام بدید (نصب سرویس یا حذف)
گزینه Install Service رو انتخاب کنید و Next رو کلیک کنید (شماره 1)

در صفحه دوم میپرسه که سرویس کجا قرار داره روی همین سیستم یا یک سیستم دیگه در شبکه؟ (شماره 2)

اینجا لازمه که یک نکته رو بگم:
سعی کنید تا جایی که ممکنه سرویس ها رو از روی شبکه نصب نکنید چون این کار ممکنه که به سیستم عامل شما اسیب وارد کنه

خوب با توجه به نکته بالا گزینه Local Machin رو انتخاب کرده و گزینه Next رو کلیک کنید

در این صفحه از شما نام سرویس جدید رو میخواد یک نام انتخابی وارد کنید (شماره 3)

و سپس گزینه Next رو کلیک کنید

حالا اینجا آدرس سرویس رو ازتون میپرسه (شماره 4)

یادتون باشه فایل اجرایی شما در این روش سرویس نیست و قراره با واسطه اجرا بشه

خوب در اینجا آدرس فایل SRVANY.EXE رو وارد کرده و گزینه Next رو کلیک کنید
فایل SRVANY.EXE همراه با ضمیمه ارسال شده

در این صفحه نوع سرویس رو باید انتخاب کنید که ما گزینه (شماره 5)

که ما گزینه Service is its own process رو انتخاب میکنید و گزینه Next رو کلیک میکنید

از اون دو مورد دیگه استفاده نکنید
من خودم هم هنوز نمیدونم به چه دردی میخورن ولی فهمیدم بهتون میگم

حالا در این صفحه شما باید به برنامه بگید که میخواید سرویستون در چه سطح دسترسی قرار داشته باشه (شماره 6)

منظور از سطح دسترسی همون مجوزی هست که به نام کاربری داده میشه یعنی این که شما باید مشخص کنید تحت کدوم نام کاربری میخواید سرویس رو اجرا کنید (فکر کنم اینطوری بهتر بود)

خوب ما 2 تا گزینه داریم System Account و Other Account فکر نمیکنم این دو مورد نیازی به توضیح داشته باشه!

در زیر گزینه System Account ما یک گزینه داریم Allow Service to Interact with Desktop که اگر میخواهید تا سرویس توانایی ارتباط با کامپیوتر رو داشته باشه این گزینه رو تیک بزنید
همچنین در زیر گزینه Other Account ما دو گزینه داریم با نام های Account و Password که زمانی که بخواهیم از نام کاربری غیر از نام کاربری System استفاده کنید باید نام کاربری و کلمه عبورش رو اینجا وارد کنیم

البته برای تنظیم Other Account دقت کنید چون مثلا نام کاربری من الان هست A و کلمه عبورش هم هست B خوب چه تضمینی وجود داره روی همه سیستم ها این نام کاربری یکی باشه برای همین یا از نام کاربری های پیشفرض سیستم استفاده کنید (که این گزینه پیشنهاد نمیشه خون کاربری مثل من همیشه نام های کاربری پیشفرض رو حذف میکنه مثل Administrator) یا مثل برخی سرویس ها خودتون نام کاربری بسازید و از دید کاربران عادی مخفیش کنید مثل عکس (این روش کاملا پیشنهاد میشه) (شماره 7)

خوب اینجا گزینه System Account رو انتخاب کنید و گزینه Allow Service to Interact with Desktop رو علامت دار کنید و Next رو کلیک کنید

در این صفحه به نوع اجرا شدن سرویس اشاره میکنه که شامل 5 قسمت هست (شماره 8)
1. Automatic
2. Manual
3. Disabled
4. Boot
5. System

گزینه 4 و 5 غیر فعال هستن چون برای سرویس ها کار نمیکنن و فقط برای درایور ها کار میکنن همون گزینه های غیر قابل استفاده در شماره 5

و 3 تا گزینه اول هم عبارتند از
1. Automatic به صورت خودکار اجرا میشه
2. Manual به صورت دستی باید اجراش کنید
3. Disabled اجرا نمیشه

خوب گزینه Automatic رو علامت دار کنید و Next رو کلیک کنید

و در آخر گزینه Finish رو کلیک کنید

تبریک میگم سرویس شما هنوز کار داره و اجرا نمیشه :قهقهه:

خوب حالا ما یک سرویس به سیستم عامل معرفی کردیم ولی برنامه خودمون که اجرا نمیشه هنوز

برنامه Registry Editor ویندوز رو اجرا کنید (همه بلدن ها ولی برای کسایی که شاید بلد نباشن مثل من در ران ویندوز بنویسید Regedit و OK کنید)

و به مسیر HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\servic es\YourService بروید
به جای کلمه YourService همون نامی که برای سرویستون انتخاب کرده بودید وارد کنید مثلا من کلمه Sample رو برای سرویسم انتخاب کرده بودم (شماره 9)

خوب حالا یک کلید زیر کلید سرویستون ایجاد کنید و نام اون رو بزارید Parameters

در زیر کلید Parameters یک مقدار جدید از نوع String Value ایجاد کنید و نام اون رو برابر Application قرار بدید و مقدار Application رو برابر آدرس دقیق و کامل فایل اجرایی خودتون که با ویژوال بیسیک نوشتید کنید

تموم شد!

حالا اونایی که ویندوز 7 دارن Task Manager رو اجرا کنن و از تب سرویس دنبال نام سرویس خودشون بگردن (شماره 10)

وقتی پیداش کردید انتخابش کنید و راست کلیک و Start Service رو انتخاب کنید

اگر برنامه تون فرم داشته باشه مثل یکی من ویندوز بهتون میگه که این سرویس میخواد یک پیغام به شما نشون بده که نیاز به تایید شما داره بهش اجازه نمایش پیغام رو میدید (شماره 11)
گزینه View The Message رو کلیک کنید فرم برنامه تون رو میبینید (البته یک جای دیگه)

وقتی خوب فرمتون رو دیدید و کلی عشق کردید بعد گزینه Return Now رو کلیک کنید تا به محیط ویندوزتون برگردید از اینجا نمیشد عکس گرفت

ولی حواستون باشه تو سرویس اصل کاریتون فرم نسازید ها آبروتون میره

اونایی که ویندوز 7 ندارن برن تو ران بنویسن Services.msc و OK کنن
در صفحه باز شده دنبال نام سرویس مورد نظر بگردن
وقتی پیدا شد روش دابل کلیک کنن
و استارت رو بزنن

تموم شد

98867

**ویرایش

سورس Service Manager که توسط دوست خوبمون آقای AbbasVB (http://barnamenevis.org/member.php?205103-AbbasVB) نوشته شده به ضمیمه ها اضافه شد
توضیحات نویسنده سورس

آیا تا حالا می خواستید بدونید چه سرویس های روی ویندوز نصب شده؟
آیا تا حالا خواسته اید بدانید چه سرویس هایی در حال اجرا هستند چه سرویس هایی خاموش هستند می باشند؟
آیا تا حالا خواسته اید یک سرویس نصب کنید؟
آیا تا حالا خواسته اید کاری کنید که یک سرویس دیگر اجرا نشود؟
آیا تا حالا خواسته اید یک سرویس را پاک کنید؟
آیا تا حالا خواسته اید کلا خواسته اید یک سرویس را دست کاری کنید؟
و آیا تا حالا خواسته اید همه این کار ها رو با برنامه ی خودتون انجام بدهید؟

AbbasVB
سه شنبه 03 بهمن 1391, 09:33 صبح
درود
من هم دنبال این بحث رو گرفتم و به نتایج خوبی رسیدم قبلا هم یه پست در این باره دادم ولی کسی توجه نکرد بگذریم
این کد هایی که شما نوشتید یک سرویس رو نصب می کنه که برنامه ای که به سیستم به عنوان سرویس معرفی می شه باید قابلیت اجرا در محیط سرویس رو داشته باشه اگر از برنامه ی معمولی برای این که در محیط سرویس استفاده بشه دوام نمیاره و بسته می شه
در ضمن بگم که در محیط سرویس برنامه قادر به برقرار ارتباط گرافیکی با کاربر نیست و خیلی بتواند یک پیغام نشان بدهد

AbbasVB
سه شنبه 03 بهمن 1391, 10:34 صبح
آیا تا حالا می خواستید بدونید چه سرویس های روی ویندوز نصب شده؟
آیا تا حالا خواسته اید بدانید چه سرویس هایی در حال اجرا هستند چه سرویس هایی خاموش هستند می باشند؟
آیا تا حالا خواسته اید یک سرویس نصب کنید؟
آیا تا حالا خواسته اید کاری کنید که یک سرویس دیگر اجرا نشود؟
آیا تا حالا خواسته اید یک سرویس را پاک کنید؟
آیا تا حالا خواسته اید کلا خواسته اید یک سرویس را دست کاری کنید؟
و آیا تا حالا خواسته اید همه این کار ها رو با برنامه ی خودتون انجام بدهید؟
خوب معلومه که نمی دونستید و نمی تونستید!
خوب این سورس رو که خودم کاملش کردم رو ببینید


دهنم سرویس شدهمین اتفاق برای من افتاد تا این برنامه رو کامل کردم:افسرده:


نمی دونم چرا نمی شه فایل رو روی سرور سایت آپلود کنم کسی می دونه چرا؟
فایل رو این جا آپلود کردم

http://s2.picofile.com/file/7629040107/Service_Manager.rar

Mr'Jamshidy
سه شنبه 03 بهمن 1391, 11:15 صبح
درود
من هم دنبال این بحث رو گرفتم و به نتایج خوبی رسیدم قبلا هم یه پست در این باره دادم ولی کسی توجه نکرد بگذریم
این کد هایی که شما نوشتید یک سرویس رو نصب می کنه که برنامه ای که به سیستم به عنوان سرویس معرفی می شه باید قابلیت اجرا در محیط سرویس رو داشته باشه اگر از برنامه ی معمولی برای این که در محیط سرویس استفاده بشه دوام نمیاره و بسته می شه
در ضمن بگم که در محیط سرویس برنامه قادر به برقرار ارتباط گرافیکی با کاربر نیست و خیلی بتواند یک پیغام نشان بدهد

من خودم از روش دوم که اسنفاده کردم هیچ مشکلی پیش نیومد همون که هنوز نگفتمش ولی میگم به زودی

در واقع سرویس ها همون برنامه های اجرایی معمولی هستن با این تفاوت که سیستم عامل پیغام های کمی متفاوت تر به برنامه ارسال میکنه که ویژوال بیسیک در حالت معمول قادر به پردازش این پیغام ها نیست

این کامپوننتی که من گزاشتم (همون که ماله مایکروسافته) در واقع تنها کاری که میکنه این پیغام ها رو پردازش میکنه وگرنه ثبت سرویس با اضافه کردن چند مورد به رجیستری امکان پذیره


آیا تا حالا می خواستید بدونید چه سرویس های روی ویندوز نصب شده؟
آیا تا حالا خواسته اید بدانید چه سرویس هایی در حال اجرا هستند چه سرویس هایی خاموش هستند می باشند؟
آیا تا حالا خواسته اید یک سرویس نصب کنید؟
آیا تا حالا خواسته اید کاری کنید که یک سرویس دیگر اجرا نشود؟
آیا تا حالا خواسته اید یک سرویس را پاک کنید؟
آیا تا حالا خواسته اید کلا خواسته اید یک سرویس را دست کاری کنید؟
و آیا تا حالا خواسته اید همه این کار ها رو با برنامه ی خودتون انجام بدهید؟
خوب معلومه که نمی دونستید و نمی تونستید!
خوب این سورس رو که خودم کاملش کردم رو ببینید

همین اتفاق برای من افتاد تا این برنامه رو کامل کردم:افسرده:


نمی دونم چرا نمی شه فایل رو روی سرور سایت آپلود کنم کسی می دونه چرا؟
فایل رو این جا آپلود کردم

http://s2.picofile.com/file/7629040107/Service_Manager.rar

جالب بود ممنون
آقا با اجازه شما این سورس رو من به پست اول اضافه کردم

AbbasVB
سه شنبه 03 بهمن 1391, 11:28 صبح
اینم یه سورس که بدون هیچ مشکلی در محیط سرویس اجرا میشه
فقط کافیه با برنامه ای که اولی پست کردم (توی پست 1هستش) اون رو نصب کنید
یه فایل می سازه توی درایو C و توش متن چاپ می کنه

http://s1.picofile.com/file/7629085050/Service.rar.html

meys34
سه شنبه 03 بهمن 1391, 11:43 صبح
اینم یه سورس که بدون هیچ مشکلی در محیط سرویس اجرا میشه
فقط کافیه با برنامه ای که اولی پست کردم (توی پست 1هستش) اون رو نصب کنید
یه فایل می سازه توی درایو C و توش متن چاپ می کنه

http://s1.picofile.com/file/7629085050/Service.rar.html

+ منبع:

NT Service in VB6 Without NTSvc ocx (http://www.freevbcode.com/ShowCode.asp?ID=4317)


+ یه تجربه داشتم گفتم به شما هم بگه:

این سورس آپدیت شده هست... ورژن قبلیش هم کمی تفاوت داشت با این، خیلی cpu رو درگیر میکرد، به همین خاطر بود که به ذهنم رسید به جای حلقه do loop که باعث درگیر شدن زیاد cpu میشه از یه form استفاده کنم... هر چند که نمایش داده نمیشه ولی باعث میشه پروسس پس از اتمام کار SubMain بسته نشه...

خواستم دوباره کد ها رو از نو باز نویسی کنم
ولی به مشکلاتی برخودم که شاید اگر تجربه نکرده باشید بگید این چه چرندیاتیه که دارم میگم...



همونطور که میدونید اصل قضیه اجرا شدن سرویس مربوط به تابع API زیر هست
StartServiceCtrlDispatcher

برای اجرای سرویس، سیستم فایل exe شما رو اجرا میکنه... بعدش چندین ثانیه بهتون مهلت میده تا تابع بالا رو فراخوانی کنید... اگر نکنید پروسه شما رو میبنده...

این همون اتفاقیه که مستر گفتن:


در واقع سرویس ها همون برنامه های اجرایی معمولی هستن با این تفاوت که سیستم عامل پیغام های کمی متفاوت تر به برنامه ارسال میکنه که ویژوال بیسیک در حالت معمول قادر به پردازش این پیغام ها نیست


توی سورس میاد به جای declare کردن معمولی توابع اونا رو توی فایل lib میریزه؛ من با خودم گفتم چه کاریه بیام فایل lib رو حذف کنم خودم دستی توابع استفاده شده رو declare کنم؛ هرچند به نظر میرسید نباید مشکلی برای برنامه پیش بیاد (چون تفاوتی بین declare کردن معمولی و استفاده از lib وجود نداره) ولی دیدم که مشکل دقیقا از همین هست؛
دقیق تر بگم مشکل از ساخت thread جداگانه برای سرویس هست، و thread جدید با declare کردن معمولی مشکل داره؛ خوب گفتم از
CreateThread استفاده نکنم و فقط تابع StartServiceCtrlDispatcher رو مستقیم فراخوانی کنم؛ اما باز هم نشد.
تو سرویس های دیگه هم دیدم که حداقل از 2 thread استفاده میکنن؛ خلاصه که سخت به مشکل بر خوردم...
اگر راه حلی برای این دارید ممنون میشم....

Mr'Jamshidy
سه شنبه 03 بهمن 1391, 13:14 عصر
+ منبع:

NT Service in VB6 Without NTSvc ocx (http://www.freevbcode.com/ShowCode.asp?ID=4317)


+ یه تجربه داشتم گفتم به شما هم بگه:

این سورس آپدیت شده هست... ورژن قبلیش هم کمی تفاوت داشت با این، خیلی cpu رو درگیر میکرد، به همین خاطر بود که به ذهنم رسید به جای حلقه do loop که باعث درگیر شدن زیاد cpu میشه از یه form استفاده کنم... هر چند که نمایش داده نمیشه ولی باعث میشه پروسس پس از اتمام کار SubMain بسته نشه...

خواستم دوباره کد ها رو از نو باز نویسی کنم
ولی به مشکلاتی برخودم که شاید اگر تجربه نکرده باشید بگید این چه چرندیاتیه که دارم میگم...



همونطور که میدونید اصل قضیه اجرا شدن سرویس مربوط به تابع API زیر هست
StartServiceCtrlDispatcher

برای اجرای سرویس، سیستم فایل exe شما رو اجرا میکنه... بعدش چندین ثانیه بهتون مهلت میده تا تابع بالا رو فراخوانی کنید... اگر نکنید پروسه شما رو میبنده...

این همون اتفاقیه که مستر گفتن:




توی سورس میاد به جای declare کردن معمولی توابع اونا رو توی فایل lib میریزه؛ من با خودم گفتم چه کاریه بیام فایل lib رو حذف کنم خودم دستی توابع استفاده شده رو declare کنم؛ هرچند به نظر میرسید نباید مشکلی برای برنامه پیش بیاد (چون تفاوتی بین declare کردن معمولی و استفاده از lib وجود نداره) ولی دیدم که مشکل دقیقا از همین هست؛
دقیق تر بگم مشکل از ساخت thread جداگانه برای سرویس هست، و thread جدید با declare کردن معمولی مشکل داره؛ خوب گفتم از
CreateThread استفاده نکنم و فقط تابع StartServiceCtrlDispatcher رو مستقیم فراخوانی کنم؛ اما باز هم نشد.
تو سرویس های دیگه هم دیدم که حداقل از 2 thread استفاده میکنن؛ خلاصه که سخت به مشکل بر خوردم...
اگر راه حلی برای این دارید ممنون میشم....

همونطور که خودت گفتی دوست عزیز باید از Multi Threading استفاده کنی
ولی خوب همونطور که همه میدونن Multi Threading تو ویژوال بیسیک 6 پشتیبانی نمیشه

حالا من دارم روش کار میکنم تا بدون درد سر از خاصیت Multi Threading در ویژوال بیسیک استفاده کرد

در ضمن خیلی حال کردم
مثل این که داره تاپیک جذاب میشه

meys34
سه شنبه 03 بهمن 1391, 16:20 عصر
همونطور که خودت گفتی دوست عزیز باید از Multi Threading استفاده کنی
ولی خوب همونطور که همه میدونن Multi Threading تو ویژوال بیسیک 6 پشتیبانی نمیشه

حالا من دارم روش کار میکنم تا بدون درد سر از خاصیت Multi Threading در ویژوال بیسیک استفاده کرد

در ضمن خیلی حال کردم
مثل این که داره تاپیک جذاب میشه

پشتیبانی میکنه یا نه مهم نیست... سورسی که AbbasVB گذاشته رو ببینید... به درستی کار میکنه و اتفاقا از هیچ ocx یا برنامه واسطی هم استفاده نکرده ...
فقط و فقط از Multi Threading استفاده کرده و به درستی هم کار میکنه...

من گفتم می خواستم از شر حلقه do loop خلاص شم، دوباره کد ها رو بازنویسی کردم دیدم با اینکه همه کار هارو به درستی انجام میدم ولی مشکل داره و نمیشه...

ولی هنوز وقت نکردم درستو حسابی روش کار کنم ببینم درست میشه یا نه...

AbbasVB
سه شنبه 03 بهمن 1391, 18:10 عصر
سلام

در رابطه با مالتی تردینگ خیلی اطلاعات ندارم خوبه یه خورده هم در این رابطه توضیح بدید

حالا که تاپیک داره داغ می شه چند تا سوال:
اول آیا میشه وقتی سرویس داره خاموش می شه خود سرویس بفهمه و از کاربر اجازه بگیره یا یک برنامه دیگه منتظر باشه هر موقع به سرویس پیغام ارسال شد ابتدا برنامه ای که در حالت عادی هست بفهمه و در صورت تایید کاربر سرویس رو ببنده؟
دوم چه طور بین یک سرویس و برنامه رابطه بر قرار کنیم مثل آنتی ویروس ها یک سرویس و یک رابط گرافیکی؟
سوم چطور یک برنامه رو توسط سرویس در محیط عادی اجرا کنیم؟(چون سرویس هر برنامه ای رو که اجرا می کنه در همون محیط سرویسه اجا می شه و بسته می شه)

دوستان نیستید!

چرا توی بحث شرکت نمی کنید تا استفاده کنیم؟

Mr'Jamshidy
چهارشنبه 04 بهمن 1391, 01:46 صبح
ای بابا ما گفتیم یکی جواب میده حتما

در مورد مالتب تردینگ این کتاب رو دانلود کن کامل بهت یاد میده

در مورد
اول آیا میشه وقتی سرویس داره خاموش می شههنوز چیزی نمیدونم اما بلاخره میفهمم

در مورد
دوم چه طور بین یک سرویس و برنامه رابطه بر قرار کنیم به نظر من از 3 حالت خارج نیست
حالت اول DDE
حالت دوم Send Message
حالت سوم TCP/IP -- UDP

در مورد این احتمالا همین 2 حالت باید باشه

حالت اول: یک تابع مثل ShellExecute باید باشه که میتونی بهش بگی من میخوام تحت این نام کاربری برام برنامه رو اجرا کنی
حالت دوم: با استفاده از رابط این کارو میکنه همون برنامه ای که تو یوزر مورد نظر اجرا هست و با هم ارتباط دارن

حالا بلاخره من اینارو میفهمم عجله نکن قدم به قدم با هم پیش میریم

Hashemvp
چهارشنبه 04 بهمن 1391, 07:29 صبح
Mr'Jamshidy (http://barnamenevis.org/member.php?43330-Mr-Jamshidy) دمت گرم
ممنون از رحمتی ک میشی
فقط کاشکی این عکس ها رو بزرگ تر میگرفتی چشممون در امد:لبخند:



در مورد مالتب تردینگ این کتاب رو دانلود کن کامل بهت یاد میده


کدوم کتاب؟؟؟؟!!!!!!!نه لینکی نه اسمی:لبخند:
ممنون اگه بذاریش عالی میشه
موفق باشید

Mr'Jamshidy
چهارشنبه 04 بهمن 1391, 09:46 صبح
Mr'Jamshidy (http://barnamenevis.org/member.php?43330-Mr-Jamshidy) دمت گرم
ممنون از رحمتی ک میشی
فقط کاشکی این عکس ها رو بزرگ تر میگرفتی چشممون در امد:لبخند:

کدوم کتاب؟؟؟؟!!!!!!!نه لینکی نه اسمی:لبخند:
ممنون اگه بذاریش عالی میشه
موفق باشید

ای بابا شرمنده اصلا حواسم نبود

اون عکس ها رو هم واسه این کوچیک گرفتم چون بتونم راحت تو سایت بزارم
اگر با دیدنش مشکل داری:

اگر مرورگردت فایر فاکسه کنترل رو بگی اسکرول رو بچرخون
اگر اینترنت اکسپلورر هست پایین سمت راست یک جا نوشته 100% زیادش کن

بقیه رو هم نمیدونم

Hashemvp
چهارشنبه 04 بهمن 1391, 09:54 صبح
اگر مرورگردت فایر فاکسه کنترل رو بگی اسکرول رو بچرخون
اگر اینترنت اکسپلورر هست پایین سمت راست یک جا نوشته 100% زیادش کن
بقیه رو هم نمیدونم
:لبخند:
ممنون
مشگل اینکه خیلی تار میشه حالا
حالا این عکس ها زیاد مهم نبود ولی توی عکس های بعدی کیفیتش بالا تر باشه بهتر میشه(ممنونت میشم)

AbbasVB
چهارشنبه 04 بهمن 1391, 10:02 صبح
درود
ممنون آقای جمشیدی


در مورد dde نمی دونم حدث می زنم که مخفف Dynamic Data Exchang باشه دوتا برنامه به یک قسمت از رم دسترسی مشترک دارند و اطلاعات رو تبادل می کنند (آیا درسته؟)

و اما Send Messageدر این باره اطلاعاتی ندارم

TCP/IP -- UDP یه بار امتحان کردم جواب نداد شاید من راه رو اشتباه رفته بودم

در مورد ShellExecute میشه یک مثال بزنید



حالا بلاخره من اینارو میفهمم عجله نکن قدم به قدم با هم پیش میریم شرمنده یه مقدار هیجان زده شدم

Mr'Jamshidy
چهارشنبه 04 بهمن 1391, 15:37 عصر
درود
ممنون آقای جمشیدی


در مورد dde نمی دونم حدث می زنم که مخفف Dynamic Data Exchang باشه دوتا برنامه به یک قسمت از رم دسترسی مشترک دارند و اطلاعات رو تبادل می کنند (آیا درسته؟)

و اما Send Messageدر این باره اطلاعاتی ندارم

TCP/IP -- UDP یه بار امتحان کردم جواب نداد شاید من راه رو اشتباه رفته بودم

در مورد ShellExecute میشه یک مثال بزنید


شرمنده یه مقدار هیجان زده شدم

راستش با هم که ارتباط دارن ولی نمیدونم از فضای مشترک استفاده میکنن یا نه
ناقلا ها چیزی که به آدم نمیگن

قابلیت SendMessage هم به مثال زیر توجه کن

Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim lngReturnValue As Long
If Button = 1 Then
'Release capture
Call ReleaseCapture
'Send a 'left mouse button down on caption'-message to our form
lngReturnValue = SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
End Sub
Private Sub Form_Paint()
Me.Print "Click on the form, hold the mouse button and drag it"
End Sub

این مثال باعث میشه شما هر جای فرم موس رو پایین نگه داری فرم جا به جا بشه حالا چطور؟
اومده با تابه SendMessage به سیستم عامل کلک رشتی زده و بهش پیغام داده که ما نوار عنوان فرم رو گرفتیم
خوب تا این جا که کار SendMessage مشخص شد حالا میایم فرم رو SubClass میکنیم و پیغام های ارسالی رو مورد پردازش قرار میدیم
بعد با تابع SendMessage پیغام خودمون رو به اون هندل ارسال میکنیم
تو پردازش ها هم که اگر به پیغام های مورد نظر رسیدیم که بهشون عکس العمل نشون میدیم

TCP و UDP هم تا جایی که من میدونم باید جواب بده چون شبکه هیچ ربطی به نام کاربری و ... نداره


حالت اول: یک تابع مثل ShellExecute باید باشه که میتونی بهش بگی من میخوام تحت این نام کاربری برام برنامه رو اجرا کنی

ببین دوست من گفتم که باید باشه یعنی هنوز پیگیر این موضوع نشدم
بزار اول موضوع ارتباط رو سرو سامون بدم بعد یکی یکی میریم جلو

سپهر-111
چهارشنبه 04 بهمن 1391, 17:34 عصر
سلام دوستان
سه تا سوال داشتم اگه امکان داره یکم در این باره توضیح بدید !
1-سرویس ویندوز چیست ؟
2-سرویس ویندوز چه کارایی داره ؟
3- به چه درد برنامه نویس میخوره ؟
باتشکر از حسن توجه دوستان گل

AbbasVB
چهارشنبه 04 بهمن 1391, 19:35 عصر
درود
آقای جمشیدی خیلی خوب توضیح دادند
ولی باز می گم


سرویس ویندوز چیست ؟
همان برنامه های معمولی هستند که در یک محیط جدا اجرا می شوند سرویس ها برنامه هایی هستند کاربر نیازی ندارد با آن ها رابطه بر قرار کند می تواند خود کار اجرا شود و کاربر(معمولی) هم نتواند جلوی آن را بگیرد سرویس ها وظایف مهمی بر عهدا دارند مثل مدیریت ارتباطات شبکه و امنیت آن , صدای ویندوز,برخی موارد کار با سخت افزار و ...

-
به چه درد برنامه نویس میخوره ؟
خوب به خیلی از کار ها میاد به عنوان مثال برای همین آنتی ویروس نویسی نوشتن بعضی از برنامه های تحت شبکه , ویروس نویسی و هر برنامه ای که لازم باشه همیشه در حال اجرا باشه
سرویس ها در برخی موارد دارای سطح دسترسی بیشتری نسبت به برنامه های معمولی هستند


هر کجاش اشتباه بود دوستان اصلاح کنند

meys34
جمعه 06 بهمن 1391, 19:36 عصر
سلام

در رابطه با مالتی تردینگ خیلی اطلاعات ندارم خوبه یه خورده هم در این رابطه توضیح بدید

حالا که تاپیک داره داغ می شه چند تا سوال:
اول آیا میشه وقتی سرویس داره خاموش می شه خود سرویس بفهمه و از کاربر اجازه بگیره یا یک برنامه دیگه منتظر باشه هر موقع به سرویس پیغام ارسال شد ابتدا برنامه ای که در حالت عادی هست بفهمه و در صورت تایید کاربر سرویس رو ببنده؟


اول اینکه درمورد مالتی تردینگ همون چیزی که فکر میکردم، درست بود و مشکلش حل شد (منظورم همون TypeLib یا همون فایل lib به جای declare کردن معمولی توابع API) سر فرصت یه تاپیک جدید میزنم و توضیحشو میدم (چونکه روش اتوماتیکی برای این کار نیست و همه چیز باید دستی انجام بشه تا فایل lib رو بسازیم بعدش که دیگه همه چیز به روال معمولی انجام میشه...)

سوال اول:
در روش ntsvc.ocx توسط رویداد زیر

Private Sub NTService1_Stop()

End Sub


و درمورد روش AbbasVB جان توسط رویداد زیر

Private Sub Handler(ByVal fdwControl As Long)
Select Case fdwControl
Case SERVICE_CONTROL_SHUTDOWN, SERVICE_CONTROL_STOP
SetServiceState SERVICE_STOP_PENDING
SetEvent hStopPendingEvent
Case Else
SetServiceState
End Select
End Sub


متوجه میشیم که سرویس حالا به هر دلیلی داره بسته میشه... شات دان شدن یا ارسال دستور stop (شکل زیر)

98993


اما اینکه بخواهیم جلوی بسته شدن سرویس رو بگیریم

در روش ntsvc.ocx یا وجود نداره یا من بلد نیستم...

ولی در روش AbbasVB به راحتی میشه دستور ارسال شده رو نادیده گرفت و برنامه به کار عادی خودش ادامه بده... اینجوری:

Private Sub Handler(ByVal fdwControl As Long)
Select Case fdwControl
Case SERVICE_CONTROL_SHUTDOWN
SetServiceState SERVICE_STOP_PENDING
SetEvent hStopPendingEvent
Case SERVICE_CONTROL_STOP
'Do Nothing... he he he...
Case Else
SetServiceState
End Select
End Sub

در این حالت حتی سیستم هم اونو EndProcess نمیکنه(خیالتون راحت)

اما خوب یه کاربر میتونه اونو خودش دستی EndProcess کنه...:ناراحت::ناراحت::ناراحت ::ناراحت::ناراحت:

نگران نباشید چون یه روش تو آستینم دارم...
با تنظیم خصوصیات زیر، با endProcess شدن، سیستم زحمت میکشه و دوباره سرویس ما رو اجرا میکنه:شیطان::شیطان::شیطان::ش طان::شیطان:

98995

البته ممکنه یه کاربر دیگه بیاد و تنظیمات رو برگردونه...:عصبانی++::عصبانی++ ::عصبانی++:


ولی اینکه گفتید آنتی ویروسا چون سرویس هستند بسته نمیشن رو اصلا قبول ندارم...
اینگونه نرم افزار ها با هوک کردن توابعی که باعث EndProcess شدن میشن، اونو دور میزنن...
که من هم در موردش هیچی نمیدونم...



دوتا سوال دیگه هم پرسیده بودید که جوابشو بلد نبودم... راه حل که داره ولی باید سرچ کنم...قبلن هم دیده بودم که بچه های C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎ این سوالا رو میپرسن...



کلا تاپیک خوبی شده باید یه چند وقتی اون بالا بالا ها بمونه :شیطان::شیطان::شیطان::شیطان:: یطان:

Mr'Jamshidy
شنبه 07 بهمن 1391, 00:34 صبح
اول اینکه درمورد مالتی تردینگ همون چیزی که فکر میکردم، درست بود و مشکلش حل شد (منظورم همون TypeLib یا همون فایل lib به جای declare کردن معمولی توابع API) سر فرصت یه تاپیک جدید میزنم و توضیحشو میدم (چونکه روش اتوماتیکی برای این کار نیست و همه چیز باید دستی انجام بشه تا فایل lib رو بسازیم بعدش که دیگه همه چیز به روال معمولی انجام میشه...)

سوال اول:
در روش ntsvc.ocx توسط رویداد زیر

Private Sub NTService1_Stop()

End Sub


و درمورد روش AbbasVB جان توسط رویداد زیر

Private Sub Handler(ByVal fdwControl As Long)
Select Case fdwControl
Case SERVICE_CONTROL_SHUTDOWN, SERVICE_CONTROL_STOP
SetServiceState SERVICE_STOP_PENDING
SetEvent hStopPendingEvent
Case Else
SetServiceState
End Select
End Sub


متوجه میشیم که سرویس حالا به هر دلیلی داره بسته میشه... شات دان شدن یا ارسال دستور stop (شکل زیر)

98993


اما اینکه بخواهیم جلوی بسته شدن سرویس رو بگیریم

در روش ntsvc.ocx یا وجود نداره یا من بلد نیستم...

ولی در روش AbbasVB به راحتی میشه دستور ارسال شده رو نادیده گرفت و برنامه به کار عادی خودش ادامه بده... اینجوری:

Private Sub Handler(ByVal fdwControl As Long)
Select Case fdwControl
Case SERVICE_CONTROL_SHUTDOWN
SetServiceState SERVICE_STOP_PENDING
SetEvent hStopPendingEvent
Case SERVICE_CONTROL_STOP
'Do Nothing... he he he...
Case Else
SetServiceState
End Select
End Sub

در این حالت حتی سیستم هم اونو EndProcess نمیکنه(خیالتون راحت)

اما خوب یه کاربر میتونه اونو خودش دستی EndProcess کنه...:ناراحت::ناراحت::ناراحت ::ناراحت::ناراحت:

نگران نباشید چون یه روش تو آستینم دارم...
با تنظیم خصوصیات زیر، با endProcess شدن، سیستم زحمت میکشه و دوباره سرویس ما رو اجرا میکنه:شیطان::شیطان::شیطان::ش طان::شیطان:

98995

البته ممکنه یه کاربر دیگه بیاد و تنظیمات رو برگردونه...:عصبانی++::عصبانی++ ::عصبانی++:


ولی اینکه گفتید آنتی ویروسا چون سرویس هستند بسته نمیشن رو اصلا قبول ندارم...
اینگونه نرم افزار ها با هوک کردن توابعی که باعث EndProcess شدن میشن، اونو دور میزنن...
که من هم در موردش هیچی نمیدونم...



دوتا سوال دیگه هم پرسیده بودید که جوابشو بلد نبودم... راه حل که داره ولی باید سرچ کنم...قبلن هم دیده بودم که بچه های C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎ این سوالا رو میپرسن...



کلا تاپیک خوبی شده باید یه چند وقتی اون بالا بالا ها بمونه :شیطان::شیطان::شیطان::شیطان:: یطان:

اول از همه دستت درد نکنه در مورد اطلاعاتی که دادی

2. تاپیک جدید برای چی؟

3. کسی نگفت چون آنتی ها سرویس هستن این کار رو میکنن ولی چون سرویس هستن دستشون برای انجام همچین کارایی باز تره وگرنه ویروس نمیومد 3 سوت آنتی رو ببنده

4. با هوک کردن این کار رو نمیشه انجام هوک تقریبا یک جور زیر نظر گرفتن هست شما باید کد رو به برنامه مورد نظر تزریق کنی تا نتونه کد اصلی EndProcess رو اجرا کنه

که در مورد تزریق هم چیزای زیادی پیدا میشه

Hashemvp
شنبه 07 بهمن 1391, 07:19 صبح
خوب چطور میشه کد ها تزریق کرد؟
و واقعا بشه جلوی بسته شدن برنامه رو از طریق پروسس منیجر های مختلف گرفت؟
آیا کسی هم میدونه ک چطور میشه مثل انتی ویروس کسپراسکای و نمونه های دیگه از پوشه ای ک برنامه داخلش هست محافظت کرد؟(هیچ گونه تغییری صورت نمیگیره و فقط خوده برنامه میتونه تیو اون پوشه تغییرات بده)

ممنون واقعا تاپیک عالی شده
موفق باشید

meys34
یک شنبه 08 بهمن 1391, 00:02 صبح
سلام... دوباره من اومدم... اومدم تا جواب سوال 2 و 3 رو بدم...



دوم چه طور بین یک سرویس و برنامه رابطه بر قرار کنیم مثل آنتی ویروس ها یک سرویس و یک رابط گرافیکی؟
سوم چطور یک برنامه رو توسط سرویس در محیط عادی اجرا کنیم؟(چون سرویس هر برنامه ای رو که اجرا می کنه در همون محیط سرویسه اجا می شه و بسته می شه)

دوستان نیستید!

چرا توی بحث شرکت نمی کنید تا استفاده کنیم؟


من هستم نگران نباش...

سوال سوم:
وقتی سرویس شما اجرا شد توسط کد زیر (اون پایین) میتونید یه نرم افزار رو تو محیط "یوزر (اونی که فعال هست)" اجرا کنید...

سوال دوم:
توی ویندوز 98 این امکان فراهم بود که سرویس، رابط گرافیکی (Interactive) مستقیمی توی صفحه نمایش داشته باشه... مثلا پیغام Msgbox مستقیم تو صفحه نمایش داده بشه... توی وین xp و 7 این حالت تغییر کرد و به طور غیر مستقیم نمایش داده میشه... توضیحش دیگه بماند...
ولی توی وین 8 کلا این امکان حذف شده... به همین خاطر مجبوریم یه رابط کاربری بسازیم و پس از اجرای سرویس اونو اجرا کنیم به روش زیر (یکمی پایینتر)...

توضیحات ارسال پارامتر و ارتباط بین سرویس و رابط کاربری رو هم که مستر جان دادند...




منبع

Execute programs from a LocalSystem service onto the users desktop (http://www.google.com/url?sa=t&rct=j&q=UserProcess.bas+Execute+programs+from+a+LocalSys tem+service+onto+the+users+desktop.&source=web&cd=1&cad=rja&ved=0CC4QFjAA&url=http%3A%2F%2Fwww.experts-exchange.com%2FProgramming%2FLanguages%2FVisual_Ba sic%2FQ_26273307.html&ei=0ygEUYy9EMfp0gGR6YHwAw&usg=AFQjCNHLLUUPojM2hnFHr4dor7BDtwYZ5g&bvm=bv.41524429,d.dmQ)

کد زیر به روش NTSVC.ocx تست شد جواب میده...

کد زیر اصلاح شد... ایراد مربوط به RunAsAdmin بود...


' UserProcess.bas
' Execute programs from a LocalSystem service onto the users desktop.

Option Explicit
' egl1044
Private Const CREATE_UNICODE_ENVIRONMENT As Long = &H400&

' <(Unicode)>
Private Type STARTUPINFO
cb As Long
lpReserved As Long 'wsptr
lpDesktop As Long 'wsptr
lpTitle As Long 'wsptr
dwX As Long
dwY As Long
dwXSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long 'ptr
hStdInput As Long 'ptr
hStdOutput As Long 'ptr
hStdError As Long 'ptr
End Type

Private Type PROCESS_INFORMATION
hProcess As Long 'ptr
hThread As Long 'ptr
dwProcessID As Long
dwThreadID As Long
End Type

Private Type SECURITY_ATTRIBUTES
Length As Long
lpSecurityDescriptor As Long 'ptr
bInheritHandle As Long
End Type

' <(Unicode)>
Private Declare Function CreateProcessAsUserW Lib "Advapi32.dll" (ByVal hToken As Long, ByVal lpApplicationName As Long, ByVal lpCommandLine As Long, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandle As Long, ByVal dwCreationFlags As Long, ByVal lpEnvrionment As Long, ByVal lpCurrentDirectory As Long, ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function CreateEnvironmentBlock Lib "Userenv.dll" (ByRef lpEnvironment As Long, ByVal hToken As Long, ByVal bInherit As Long) As Long

Private Declare Function DestroyEnvironmentBlock Lib "Userenv.dll" (ByVal lpEnvironment As Long) As Long

Private Declare Function WTSQueryUserToken Lib "Wtsapi32.dll" (ByVal sessionId As Long, ByRef phToken As Long) As Long

Private Declare Function WTSGetActiveConsoleSessionId Lib "Kernel32.dll" () As Long

Private Declare Function CloseHandle Lib "Kernel32.dll" (ByVal hObject As Long) As Long

'************************************************* ************************
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Integer, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long


Public Enum RunAs
requireAdministrator
asInvoke
End Enum

Public Sub ServiceShell(ByVal fileName As String, Optional ByVal sessionId As Long = (-1), Optional ByVal RunAsAdmin As RunAs = asInvoke)

Dim hToken As Long
Dim pEnvBlock As Long
Dim dwSessionId As Long
Dim sa As SECURITY_ATTRIBUTES
Dim pi As PROCESS_INFORMATION
Dim si As STARTUPINFO

' If no session Id was specified defaults to using the session Id
' that is currently attached to the physical console.
If sessionId = (-1) Then

dwSessionId = WTSGetActiveConsoleSessionId()

Else

dwSessionId = sessionId

End If


' Obtain the primary access token of the logged-on user specified by the session Id
If WTSQueryUserToken(dwSessionId, hToken) Then

' Get the enviorment block pointer for the user session.
If CreateEnvironmentBlock(pEnvBlock, hToken, 0) Then
' si.cb = Len(si)
' si.wShowWindow = 5 'vbMaximizedFocus
' si.dwFlags = 1 'STARTF_USESHOWWINDOW

If RunAsAdmin = requireAdministrator Then GetAdminToken hToken

If CreateProcessAsUserW(hToken, StrPtr(fileName), 0, sa, sa, 0, _
CREATE_UNICODE_ENVIRONMENT, pEnvBlock, 0, si, pi) Then

' cleanup handle information
CloseHandle pi.hProcess
CloseHandle pi.hThread
'************************************RUN AS ADMIN********************************************
ElseIf Err.LastDllError = 740 Then '740=ERROR_ELEVATION_REQUIRED (The requested operation requires elevation.)

GetAdminToken hToken

If CreateProcessAsUserW(hToken, StrPtr(fileName), 0, sa, sa, 0, _
CREATE_UNICODE_ENVIRONMENT, pEnvBlock, 0, si, pi) Then

' cleanup handle information
CloseHandle pi.hProcess
CloseHandle pi.hThread
Else

SaveSetting "p", "P", "P2", Err.LastDllError
End If

CloseHandle hToken

Else
SaveSetting "p", "P", "P1", Err.LastDllError

End If

' Destroy enviorment block pointer.
DestroyEnvironmentBlock pEnvBlock

End If

' cleanup user session token handle.
CloseHandle hToken

End If
End Sub

Private Sub GetAdminToken(ByRef hToken As Long)
Dim hNewToken As Long
Dim TokenLen As Long

GetTokenInformation hToken, 19, hNewToken, 4, TokenLen '19 = LinkedToken = A Handle To a Users Token With ADMIN Privilege
hToken = hNewToken

End Sub

Hashemvp
پنج شنبه 12 بهمن 1391, 10:16 صبح
دوستان باقی این مسئله رو نمیگن؟
سوال های ما هم جواب بدین بابا:لبخند:
تاپیک خوبیه حیفه

meys34
پنج شنبه 12 بهمن 1391, 12:59 عصر
دوستان باقی این مسئله رو نمیگن؟
سوال های ما هم جواب بدین بابا:لبخند:
تاپیک خوبیه حیفه

سلام من هنوز هستم.... فعلا کد پست قبلیم رو اصلاح کردم تا بعدا ادامه بدم...

Hashemvp
جمعه 13 بهمن 1391, 07:04 صبح
قربانت پس بی زحمت اگه میدونی جواب سوال های قبلی منو بده کسی جواب نداد

خوب چطور میشه کد ها تزریق کرد؟
و واقعا بشه جلوی بسته شدن برنامه رو از طریق پروسس منیجر های مختلف گرفت؟
آیا کسی هم میدونه ک چطور میشه مثل انتی ویروس کسپراسکای و نمونه های دیگه از پوشه ای ک برنامه داخلش هست محافظت کرد؟(هیچ گونه تغییری صورت نمیگیره و فقط خوده برنامه میتونه تیو اون پوشه تغییرات بده)

ممنون واقعا تاپیک عالی شده
موفق باشید

ممنون