PDA

View Full Version : مشكل در اجراي برنامه با استفاده از سرويس



Yasersadegh
چهارشنبه 14 مرداد 1388, 15:05 عصر
سلام به همه دوستان و اساتيد
من يه برنامه نوشتم كه تويه اون يه thread دارم كه تا زماني كه برنامه در حال اجرا باشه اين ترد كار ميكنه و يه كارهايي انجام ميده! ضمنا برايه برنامه يك سرويس توسط خود برنامه ايجاد كردم كه هر بار ويندوز بالا اومد سرويس استارت بشه و برنامه اجرا بشه!! و اما مشكل...
زماني كه فايل برنامه رو به صورت معمولي از داخل ويندوز اجرا مي كنم برنامه درست كار مي كنه!! يعني كاري كه بايد انجام بشه، ميشه!!!:لبخند:
حالا زماني كه سرويس مورد نظر رو استارت ميكنم برنامه اجرا ميشه - يعني در ليست پروسس ها برنامه رو ميبينم- ولي كاري كه برايه برنامه تعيين شده انجام نميشه!!!:متعجب:
نمي دونم مشكل چيه!!؟:متفکر: يعني وقتي برنامه از طريق استارت سرويس اجرا ميشه چه اتفاقي ميفته، نمي دونم!!؟:متفکر:
دوستان و اساتيد محترم لطفا بنده رو راهنمايي بفرماييد!!:خجالت:

mehdi.mousavi
چهارشنبه 14 مرداد 1388, 15:16 عصر
سلام به همه دوستان و اساتيد من يه برنامه نوشتم كه تويه اون يه thread دارم كه تا زماني كه برنامه در حال اجرا باشه اين ترد كار ميكنه و يه كارهايي انجام ميده! ضمنا برايه برنامه يك سرويس توسط خود برنامه ايجاد كردم كه هر بار ويندوز بالا اومد سرويس استارت بشه و برنامه اجرا بشه!! و اما مشكل... زماني كه فايل برنامه رو به صورت معمولي از داخل ويندوز اجرا مي كنم برنامه درست كار مي كنه!! يعني كاري كه بايد انجام بشه، ميشه!!!:لبخند: حالا زماني كه سرويس مورد نظر رو استارت ميكنم برنامه اجرا ميشه - يعني در ليست پروسس ها برنامه رو ميبينم- ولي كاري كه برايه برنامه تعيين شده انجام نميشه!!!:متعجب: نمي دونم مشكل چيه!!؟:متفکر: يعني وقتي برنامه از طريق استارت سرويس اجرا ميشه چه اتفاقي ميفته، نمي دونم!!؟:متفکر: دوستان و اساتيد محترم لطفا بنده رو راهنمايي بفرماييد!!:خجالت:

سلام.
منظورتون از عبارت "برايه برنامه يك سرويس توسط خود برنامه ايجاد كردم كه هر بار ويندوز بالا اومد سرويس استارت بشه و برنامه اجرا بشه" چیه؟ یعنی چی توسط خود برنامه یک سرویس ایجاد می کنم؟؟؟ دقیق توضیح بدید.

Yasersadegh
چهارشنبه 14 مرداد 1388, 16:37 عصر
منظورم اينه كه وقتي برنامه اجرا ميشه يه قسمت از كدش بررسي ميكنه ببينه كه سرويس مورد نظر هست يا نه اگر نباشه اين سرويسي كه باعث اجرايه برنامه ميشه رو ايجاد ميكنه!!
يعني دفعه اول كه برنامه به يه طريقي اجرا ميشه بررسي ميكنه اگه سرويس A وجود نداشت اين سرويس رو ايجاد مي كنه و بعد از اين ديگه هر بار كه سرويس A استارت بشه برنامه هم باهاش اجرا ميشه!!!
نمي دونم منظورم رو متوجه شديد!!:لبخند:

tdkhakpur
چهارشنبه 14 مرداد 1388, 23:35 عصر
سلام

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

Yasersadegh
پنج شنبه 15 مرداد 1388, 09:04 صبح
ببينيد دوستان فكر نمي كنم سوالم خيلي مبهم باشه !!
من يه سرويسي ايجاد كردم ( چطوريش مهم نيست و كاري نداريم) به نام X!! اين سرويس X جدا از سرويس هاي پيش فرض ويندوز هست يه سرويس جديده كه خودم درستش كردم!! اين سرويس X به محض استارت شدن ميره يه برنامه تويه مثلا درايو C رو اجرا ميكنه!! تا اينجا مشخصه!!؟
حالا از كجا معلومه كه اين برنامه اجرا شده!!؟ از اونجايي كه در ليست پروسسهاي ويندوز اضافه ميشه!!:لبخند:
خوب حالا كه برنامه اجرا شده بايد يه سري كارهايي رو انجام بده ، مثلا يه فايلي رو يه جايي كپي كنه و ...!! مشكل اينه كه اين كارها رو انجام نميده!!!:گریه:
اما وقتي ميرم تويه درايو C و رويه فايل اجرايي مورد نظر دوبار كليك مي كنم و دستي برنامه رو اجرا مي كنم اون كارها رو انجام ميده!!!:متعجب:
الان نمي دونم چرا با سرويس انجام نمي شه ولي دستي انجام ميشه!!:افسرده:
اميدوارم كه توضيحات كافي باشه!!!
دوستان لطفا كمك كنيد!!!:خجالت:

tdkhakpur
پنج شنبه 15 مرداد 1388, 17:33 عصر
سلام

حالا از كجا معلومه كه اين برنامه اجرا شده!!؟ از اونجايي كه در ليست پروسسهاي ويندوز اضافه ميشه!!:لبخند:

خوب داخل سرویس شما کد مخصوص برای لود کردن برنامه را کجا قرار دادید؟ اصلا سرویس را نصب کردید که استارت بشه؟کد اون قسمت را ارسال کنید.

mehdi.mousavi
پنج شنبه 15 مرداد 1388, 23:00 عصر
سلام.


اين سرويس X به محض استارت شدن ميره يه برنامه تويه مثلا درايو C رو اجرا ميكنه!! خوب، پس برنامه مورد نظر تحت Security Context سرویس اجرا میشه. فکر این مساله رو کرده بودید؟ آیا در این Context برنامه شما می تونه به وظائفش عمل کنه؟


از اونجايي كه در ليست پروسسهاي ويندوز اضافه ميشه!!:لبخند: خوب حالا كه برنامه اجرا شده بايد يه سري كارهايي رو انجام بده ، مثلا يه فايلي رو يه جايي كپي كنه و ...!! مشكل اينه كه اين كارها رو انجام نميده!!!:گریه:
این کارها چی هستن؟ آیا میشه این کارها رو تحت اون Security نامبرده انجام داد؟


اما وقتي ميرم تويه درايو C و رويه فايل اجرايي مورد نظر دوبار كليك مي كنم و دستي برنامه رو اجرا مي كنم اون كارها رو انجام ميده!!!:متعجب:
برای اینکه برنامه داره تحت Security Context کاربری اجرا میشه که به ویندوز Login کرده.

موفق باشید.

Yasersadegh
جمعه 16 مرداد 1388, 10:07 صبح
ممنون از راهنمايي دوستان عزيز
ولي خوب ببينيد من كدي كه برايه ثبت سرويسم نوشتم به صورت زير است!!


bool RegisterService(WCHAR* sPath, WCHAR* sService, bool Start)
{
bool Result;
SC_HANDLE ServiceManager;
SC_HANDLE ServiceHandle;
ServiceManager = NULL;
ServiceHandle = NULL;
Result = false;
ServiceManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if ( ServiceManager )
{
ServiceHandle = CreateService(
ServiceManager, // SCManager database
sService, // name of service
sService, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
sPath,// service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies null
NULL, // LocalSystem account
NULL);// no password
if ( ServiceHandle )
{
Result = true;
if (Start && Result)
Result = StartService(
ServiceHandle, // handle to service
0, // number of arguments
NULL);
if(!Result)
{
printf("\n Error in Register Service (%d)",GetLastError());
//getch();
}
CloseServiceHandle(ServiceHandle);
ServiceHandle = NULL;
}
CloseServiceHandle(ServiceManager);
ServiceManager = NULL;
}

return Result;
}


خوب، پس برنامه مورد نظر تحت Security Context سرویس اجرا میشه. فکر این مساله رو کرده بودید؟ آیا در این Context برنامه شما می تونه به وظائفش عمل کنه؟
خوب حالا تويه كدي كه نوشتم اين security context رو كجا بايد تعيين كنم!!؟:متفکر:
اگه ممكنه برايه اين security Context يه مثال يا يه كد بزاريد!!!:خجالت:
لطفا راهنمايي كنيد!!

mehdi.mousavi
شنبه 17 مرداد 1388, 13:23 عصر
ممنون از راهنمايي دوستان عزيز ولي خوب ببينيد من كدي كه برايه ثبت سرويسم نوشتم به صورت زير است!! خوب حالا تويه كدي كه نوشتم اين security context رو كجا بايد تعيين كنم!!؟:متفکر: اگه ممكنه برايه اين security Context يه مثال يا يه كد بزاريد!!!:خجالت: لطفا راهنمايي كنيد!!

سلام.
از اونجاییکه پارامتر یکی مونده به آخر، یعنی lpServiceStartName رو NULL گذاشتید و Service Type رو SERVICE_WIN32_OWN_PROCESS تعیین کردید، بنابراین CreateService سرویس مورد نظر رو در محدوده دسترسیهای Local System Account ایجاد می کنه. از اونجاییکه LSA خودش SID گروه Administrators و NT AUTHORITY\SYSTEM رو داره، گمان نمی کنم مشکل شما به Permission ها مربوط بشه.

برای اینکه بتونید سریعتر مشکل رو پیدا کنید، کافیه تا سرویس رو Trace کنید و ببینید اجرای اون در کجا با مشکل مواجه میشه. می تونید با قراردادن DebugBreak در کد سرویس، اجرای اونو در محل خاصی متوقف کنید و پس از اون در Visual Studio کد رو Trace کنید.

موفق باشید.

tdkhakpur
شنبه 17 مرداد 1388, 14:05 عصر
سلام
ببینید کلا شما داخل سرویس نمیتوانید با GDI کار کنید برای اجرای فایل میتوانید روش زیر را به کار ببرید.
شما هم میتوانید برنامه خودتان را طراحی کنید بطوری که کد کارهایتان داخلش قرار بگیرد نه خروجی.


spawnl ( P_NOWAIT, "testfile.exe", "testfile.exe", NULL);

این کد را در سرویس خودتان جای بدید کارش ساخت یک فایل به این 2.txt در درایور c میباشد

Yasersadegh
یک شنبه 18 مرداد 1388, 12:47 عصر
دوستان ممنون از راهنماييتون
ولي اجازه بديد من موضوع رو طوره ديگه اي مطرح كنم!!
من يه برنامه نوشتم كه يه كارايي مي كنه!!:لبخند: مي خوام اين برنامه با بالا اومدن ويندوز اجرا بشه!!:لبخندساده: برايه اينكار اول با رجيستري انجام دادم; يعني اومدم آدرس برنامه رو تويه رجيستري ثبت كردم و هر بار كه ويندوز بالا مي اومد برنامه شروع به كار ميكرد!!:لبخند: ولي ديدم كه در اين حالت كاربر به راحتي مي تونه بره اينو از تو رجيستري پاك كنه و ديگه اجرا نشه!!!:افسرده:
پس اومدم كه با سرويس انجام بدم!!:متفکر: يعني يه سرويس ايجاد كردم كه بره برنامه من رو از مسير مورد نظر اجرا كنه در نتيجه هر بار كه ويندوز بالا مياد ميره سرويس رو استارت ميكنه و برنامه من رو اجرا ميكنه!!!:لبخند: اما مشكل اينجاست كه وقتي برنامم اجرا ميشه ديگه اون كارايي كه بايد انجام بده رو انجام نميده!! يعني برنامه اجرا ميشه ولي هيچ كاري نمي كنه!!!:عصبانی++:

الان من مي خوام بدونم كه چرا اين طوريه!؟:متفکر: يعني اصلا هدف سرويس انجام اينچين كارهاست، يا اصلا هدف سرويسها در ويندوز چيز ديگريست!!؟:متفکر: من اگه بخوام برنامم موقع بالا اومدن ويندوز اجرا بشه، غير رجيستري چكار مي تونم بكنم كه كاربر نتونه از بين ببره!!؟:متفکر:

دوستان منتظر راهنمايي هاي خوبتون هستم!!:چشمک:

tdkhakpur
یک شنبه 18 مرداد 1388, 15:39 عصر
در اين حالت كاربر به راحتي مي تونه بره اينو از تو رجيستري پاك كنه و ديگه اجرا نشه!!!:افسرده:
پس اومدم كه با سرويس انجام بدم!!:متفکر:
خوب در این حالت هم میتواند سرویس شما را حذف کند.
از هر تابعی بجز روتینهای کار با صفحه نمایش در برنامه ات استفاده نکننننننننننننننن......

mehdi.mousavi
یک شنبه 18 مرداد 1388, 17:29 عصر
من يه برنامه نوشتم كه يه كارايي مي كنه!!
اما مشكل اينجاست كه وقتي برنامم اجرا ميشه ديگه اون كارايي كه بايد انجام بده رو انجام نميده!!
يعني برنامه اجرا ميشه ولي هيچ كاري نمي كنه!!!



سلام.
ظاهرا پاسخهای فنی راه گشای شما نیست... پس اجازه بدید، به بیان دیگه ای پاسخ بدم: شما باید یه طور دیگه، یه کارایی کنید، که سرویسها تو ویندوز کار کنن. وقتی اون کارای دیگه رو نکنید، خوب طبیعی هستش که سرویس ها هم کارهای خودشون نمی کنن. از طرف دیگه، کاربرها می تونن کارهایی کنن که سرویس ها disable بشن، یا حتی اونا رو حذف کنن. اگر اون کارها رو کردن، باز کارهایی که شما می کنید، کار بحساب نمیاد!

پاورقی: مرد حسابی سرگرمی درست کردی واسه خودت؟ کار میکنم، کار نمیکنه کار کردم کار نمیشه، یعنی چی؟؟؟ شاید بتونید با این کارها جلوی 4 تا Code Junkies رو بگیرید، اما کسی که دو بیت اطلاعات داشته باشه، بلده چطوری دست سرویس شما رو که یه کارایی میکنه، بذاره تو پوست گردو تا نتونه اون کارها رو بکنه!