PDA

View Full Version : سوال در مورد ساخت Service Application



meysam558
شنبه 28 آذر 1383, 17:03 عصر
من با دلفی یک برنامه سرویسس ServiceApp ساخته ام در این برنامه از تابع GetUserName برای بدست آوردن نام یوزر لوگ این شده استفاده کرده ام.همچنین از توابع Tregistry برای گرفتن اطلاعات از ریجیستری شاخه KEY_USER_CURERNT استفاده کرده ام.
زمانی که این Service را به صورت دستی اجرا میکنم تحت نام یوزر Login شده اجرا میشود برنامه به خوبی کار میکند. ولی زمانی که Service نصب میشود و ویندوز آن را تحت نام System اجرا میکند نام یوزر را )System) برمیگرداند و اطلاعات رجیستری را هم نمیتواند بگیرد.
چگونه میتوان مشکل این Service را حل کرد بدون اینکه نحوه اجرای Service عوض شود(یعنی تحت همان نام System اجرا شود).

مهدی کرامتی
دوشنبه 30 آذر 1383, 07:52 صبح
به کجای رجیستری میخواهید دسترسی پیدا کنید و برای کسب چه اطلاعاتی؟

اگر میخواهید به اطلاعات رجیستری کاربر کنونی دسترسی پیدا کنید که باید بگم آسان نیست، چون Service Application ها قبل از لوگین کردن کاربر اجرا میشوند و بنابراین عجیب نیست که وقتی هنوز هیچ کاربری لوگین نکرده نتوان به اطلاعات او دسترسی پیدا کرد. مفهومه؟

البته اگر بیشتر توضیح بدی شاید به نتیجه برسیم :wise1:

Inprise
سه شنبه 01 دی 1383, 02:22 صبح
<span dir=ltr>just another shit from M$ . Well that API is just working for Current thread and current Session . i didnt find any one-cycle solution anywhere but seems you can Select one active process and look for caller user name . there are APIs for enum processes and Structs for process infoz like image size and PID and owner and so . hope this help you </span>

satshop
سه شنبه 01 دی 1383, 02:27 صبح
(در رابطه با سوال قبلی)
مشکل من در نام یوزری است که برنامه تحت آن اجرا میشود.یعنی همان نامی که در task manager در قسمت Process در جلوی برنامه نمایش داده میشود.
اگر برنامه را خودمان به صورت دستی اجرا کنیم این نام نام یوزر است و این به این معنی است که اجرا کننده این برنامه یوزر Login شده است و در این حالت برنامه به خوبی کار میکند.ولی زمانی که سرویس را توسط سیستم اجرا میکنیم
(در Service Manager در آدرس:
Control Panel => Administrative Tools => Services
نام سرویس را انتخاب و بر روی Start کلیک میکنیم) این نام System است یعنی برنامه تحت این یوزر اجرا شده است.
تا جایی که من خبر دارم برنامه توسط هر یوزری که اجرا شود فقط میتواند از اطلاعات آن یوزر استفاده کند.مثلا در این مورد فقط میتواند از رجیستری مربوط به آن یوزر آستفاده کند. (چون هر یوزر رجیستری مخصوص به خود دارد).
من در این برنامه از تابع GetUserName استفاده کرده ام.وقتی برنامه را به صورت سرویس اجرا شود برنامه نام System را به عنوان نام یوزر برمیگرداند.همینطور اگر توسط هر یوزر دیگری اجرا شود تام آن یوزر را برمیگرداند. من سعی کرم تا از یک برنامه واسطه استفاده کنم یعنی Service آن را اجرا کند و آن برنامه این اطلاعات را برگرداند.
ولی برنامه و اسطه هم چون توسط سرویس اجرا شده نام System به خود میگیرد.
من باید برنامه واسطه را با نام یوزر Login شده اجرا کنم.برای این کار باید از تابع CreateProcessAsUser استفاده کنم ولی این تابع خیلی دردسر داشت و من نتوانستم این کار را انجام دهم.
اگر شما نحوه استفاده از این تابع را میدانید ممنون میشوم اگر آن را در اختیار من بگذارید

satshop
سه شنبه 01 دی 1383, 22:08 عصر
اگه می شه جواب منو زودتر بدین از لطف شما ممنون می شم

با تشکر از زحمات شما دوستان

vcldeveloper
چهارشنبه 02 دی 1383, 01:51 صبح
اگه می شه جواب منو زودتر بدین از لطف شما ممنون می شم

با تشکر از زحمات شما دوستان
به توضیحات آقای Inprise نگاه کن.
ایشون پیشنهاد دادند که شما مشخصات یک process در حال اجرا که توسط کاربر مورد نظرتون اجرا میشه را با استفاده از توابع API بدست بیارید (شامل نام کاربر اجرا کننده process و...).