سئوالات مربوط به Windows Api

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
من که کار Setup Installer رو نمی تونم تحلیل کنم، اما ظاهر قضیه اینه که با دسترسی ادمین اجراش نمی کنه، برای دلیلش هم فقط میتونم حدس بزنم، فرضا حدس بزنم که شما یک فایل اجرایی در Setup دارید که بصورت مجزا از اون manifest اش داره اجرا میشه، فرضا در یک مسیر موقتی Temp یا هر مسیر دیگه ای بدون اینکه اون فایل manifest کنارش باشه اجرا میشه.


باید لینک و دسترسی ها رو بررسی اش کنید، چیزی نیست که من از راه دور بخوام نظر بدم. محض امتحان بجای برنامه خودتون برای یه فایل اجرایی عادی ویندوز مثل notepad.exe با کد نویسی shortcut سازی کنید.

تست کردم ، شورتکات نرم افزارهای دیگه در این پوشه جواب میده و موقع بالا اومدن ویندوز ، اتوماتیک اجرا میشه
الان به نظرتون برای administrator بودن این پروژه هست که موقع استارت آپ بالا نمیاد؟
اگه از طریق رجیستری ثبت کنم که موقع بالا اومدن ویندوز ، اجرا بشه ، به نظرتون این پروژه که administrator هست ، مشکلی پیش نمیاد و اجرا میشه؟
 

the_king

مدیرکل انجمن
تست کردم ، شورتکات نرم افزارهای دیگه در این پوشه جواب میده و موقع بالا اومدن ویندوز ، اتوماتیک اجرا میشه
الان به نظرتون برای administrator بودن این پروژه هست که موقع استارت آپ بالا نمیاد؟

بدون اطلاعات کافی نمیشه نظر داد ولی احتمالا به عدم دسترسی مناسب برمیگرده.
اگه از طریق رجیستری ثبت کنم که موقع بالا اومدن ویندوز ، اجرا بشه ، به نظرتون این پروژه که administrator هست ، مشکلی پیش نمیاد و اجرا میشه؟
فرقی نمی کنه، شما در SOFTWARE\Microsoft\Windows\CurrentVersion\Run صرفا مسیر رو مشخص می کنید، هیچ ربطی به سطح دسترسی فایل در هنگام اجرا نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بدون اطلاعات کافی نمیشه نظر داد ولی احتمالا به عدم دسترسی مناسب برمیگرده.

فرقی نمی کنه، شما در SOFTWARE\Microsoft\Windows\CurrentVersion\Run صرفا مسیر رو مشخص می کنید، هیچ ربطی به سطح دسترسی فایل در هنگام اجرا نداره.

ممنون
استاد علی ، تاپیک "سئوال درباره ی آپدیت ویندوز" رو جواب میدین؟
من یه سئوال دارم ، نصفش به اون تاپیک مربوط میشه و نصفش اینجا . نمیدونم کجا بپرسم
اینکه من اولین بار در Task Scheduler ویندوز یه task ساختم (بصورت دستی . نه بصورت برنامه نویسی) که trriger اش At Log On بود و فایل اجرایی مو دادم ، موقع بالا اومدن ویندوز ، بالا اومد ولی بعد که پاک کردم و دوباره یکی شبیه همین task ساختم با همون تنظیمات (البته بعد از اینکه با wrapper پایینی کار کردم ، دفعات بعد ساختم) ، دیگه بالا نیومد موقع بالا اومدن ویندوز
چون از لینک زیر :
Downloading Microsoft.Win32.TaskScheduler.dll, please wait...
dll ای گرفتم که با wrapper ای هه که با Task Scheduler ویندوز کار میکنه . کلاس microsoft.win32.taskscheduler.taskservice
الان میدونین مشکل از کجاست که دفعه ی اول که ساختم ، کار کرد ولی دفعات بعدی که میسازم کار نمیکنه؟! جای تعجب داره برام!

-----------------------------------

بجز این ، کلا یه راهکاری میگین برای شروع این برنامه ی administrator در موقع ورود به ویندوز؟
من روش ایجاد میانبر در پوشه ی استارت آپ رو تست کردم جواب نداد . الان قضیه ی Task Scheduler رو نمیدونم چرا یه بار جواب داد و دفعات بعد جواب نداد دیگه (بالای 10 تنظیم مختلف رو تست کردم)
الان گفتین در رجیستری هم اگه ثبت کنم ، جواب نمیده؟

------------------------------------

متوجه شدم . اولین بار تیک گزینه ی run with hightest privilage را زده بودم که الان درست شد
ممنون
 
آخرین ویرایش:

the_king

مدیرکل انجمن
بجز این ، کلا یه راهکاری میگین برای شروع این برنامه ی administrator در موقع ورود به ویندوز؟
من روش ایجاد میانبر در پوشه ی استارت آپ رو تست کردم جواب نداد . الان قضیه ی Task Scheduler رو نمیدونم چرا یه بار جواب داد و دفعات بعد جواب نداد دیگه (بالای 10 تنظیم مختلف رو تست کردم)
الان گفتین در رجیستری هم اگه ثبت کنم ، جواب نمیده؟

فلسفه دسترسی ادمین همینه که نظارتی روش باشه. اگه قرار باشه هر کدی هر زمانی اراده کرد برای دسترسی ادمین تصمیم بگیره که دیگه امنیتی در کار نیست. در مورد runas.exe و دستور runas و ویرایش باینری فایل های lnk برای تیک زدن فلگ هایی مثل Run as administrator تحقیق کنید. اصولا اینجور موارد رو توسط یک Setup انجام میدن که میتونه با مجوز دیجیتالی تایید بشه که اصلا نیازی به این هشدار ها نباشه. بی دلیل نیست که در توضیح اغلب کرک ها موقع اجرا run as administrator رو دستی از کاربر میخوان، وگرنه خودشون که نمیان خودشون رو بعدا با این دسترسی اجرا کنند. هر نسخه جدیدتر از ویندوز هم این دسترسی ها رو محدودتر کرده. روی یک فرمت کلی و با انواع تنظیمات دسترسی ها باید فکر کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، با اون wrapper ای که در پست بالا گفتم برای Task Scheduler گرفتم ، چجوری میشه گزینه ی Run With Highest Privilege را فعال کرد؟
من کد زیر رو نوشتم :


کد:
            string appFilePath = Application.ExecutablePath;

            LogonTrigger winUpDisLogOnTrigger = new LogonTrigger();
            winUpDisLogOnTrigger.Enabled = true;
            ExecAction winUpDisAction = new ExecAction(appFilePath);
           
            TaskService taskScheduler = new TaskService();
            Task winUpDisTask = taskScheduler.AddTask("Windows Update Diabler", winUpDisLogOnTrigger, winUpDisAction);

بعد هم توی اعضای winUpDisTask.Definition و winUpDisTask.Definition.Principal و winUpDisTask.Definition.Settings و جاهای دیگه گشتم ، چیزی در مورد این گزینه پیدا نکردم
 

the_king

مدیرکل انجمن
سلام
استاد علی ، با اون wrapper ای که در پست بالا گفتم برای Task Scheduler گرفتم ، چجوری میشه گزینه ی Run With Highest Privilege را فعال کرد؟
من کد زیر رو نوشتم :


کد:
            string appFilePath = Application.ExecutablePath;

            LogonTrigger winUpDisLogOnTrigger = new LogonTrigger();
            winUpDisLogOnTrigger.Enabled = true;
            ExecAction winUpDisAction = new ExecAction(appFilePath);
          
            TaskService taskScheduler = new TaskService();
            Task winUpDisTask = taskScheduler.AddTask("Windows Update Diabler", winUpDisLogOnTrigger, winUpDisAction);

بعد هم توی اعضای winUpDisTask.Definition و winUpDisTask.Definition.Principal و winUpDisTask.Definition.Settings و جاهای دیگه گشتم ، چیزی در مورد این گزینه پیدا نکردم
طبعا با دانلود کردن یک کتابخونه که مستنداتی نداره نمیتونید بجایی برسید.
احتمالا winUpDisTask.Definition.Principal.RunLevel = TaskRunLevel.Highest کفایت کنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
طبعا با دانلود کردن یک کتابخونه که مستنداتی نداره نمیتونید بجایی برسید.
احتمالا winUpDisTask.Definition.Principal.RunLevel = TaskRunLevel.Highest کفایت کنه.

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

TaskService Class

ولی چیز خاصی در این باره پیدا نکردم
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
استاد علی سلامی مجدد
کدش اینه :


کد:
            using (TaskService ts = new TaskService())
            {
                TaskDefinition td = ts.NewTask();
                td.Principal.RunLevel = TaskRunLevel.Highest;
                LogonTrigger trigger = new LogonTrigger();
                td.Triggers.Add(trigger);
                td.Actions.Add(new ExecAction(appFilePath, null, null));
                ts.RootFolder.RegisterTaskDefinition("Windows Update Diabler", td);
            }

ولی من کد زیر را مینوشتم :

کد:
            using (TaskService taskScheduler = new TaskService())
            {
                LogonTrigger winUpDisLogOnTrigger = new LogonTrigger();
                winUpDisLogOnTrigger.Enabled = true;
                ExecAction winUpDisAction = new ExecAction(appFilePath);

                Task winUpDisTask = taskScheduler.AddTask("Windows Update Diabler", winUpDisLogOnTrigger, winUpDisAction);
                winUpDisTask.Definition.Principal.RunLevel = TaskRunLevel.Highest;
            }

تفاوت اش این بود که در کد من (دومی) ، اول با متد AddTask ، به task scheduler اضافه میکرد و بعد از اضافه کردن ، حالا در خط بعد اون privilage را براش ست میکرد . حواسم نبود که متد AddTask اول میاد ثبت و اضافه میکنه و بعدش از این خط که ثبت کرد ، خط های بعدش میشن نوشدارو و سهراب :green:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی

و یه سئوال دیگه اینکه وقتی این پروژه فعاله ، خوب وقتی سرویس آپدیت ویندوز start بشه یا start type اش تغییر کنه ، برنامه هم stop میده سرویس را و هم disable اش میکنه (چون disable میکنه ، اصلا اجازه ی start شدن دیگه نداره و زمان start شدن هم هشدار میده) . اما یک بار که داشتم تست میکردم ، دیدم که start شد (که طبق روال نباید میشد) . نمیدونم شاید بخاطر اون قضیه ی ارور در پست 13 باشه یا نه؟ اما دفعات دیگه که تست کردم ، درست کار کرد
ممنون

ممنون استاد علی
درباره ی مشکل این قضیه تازه متوجه شدم
وقتی پروژه ام را از توی ویژال استودیو اجرا میکنم ، وقتی سرویس آپدیت یا سرویس bits را start میکنم ، هشدار میده که نمیتونی start کنی و نرم افزاره درست کار میکنه (همینطور نمیذاره فعال کنیم)
اما وقتی با Advanced Installer ستاپ میسازم و بعد نصب میکنم و بعد هم برنامه را اجرا میکنم (حتی بصورت دستی run as admin اجرا میکنم) ، ظاهرا خوب اجرا میشه و اروری نمیده اما زمانی که سرویس را start میکنم ، start میشه بدون هشدار و بدون جلوگیری از start شدن سرویس (برخلاف زمانی که از ویژال استودیو اجرا میکردم) .
این یعنی قسمت ستاپ سازیِ کار مشکل داره؟
کلا با چه برنامه ای ستاپ بسازم؟
پروژه ام را بدم ، زحمت ساخت ستاپ اش را میکشید؟ یا راهنمایی کامل میکنید که چجوری ستاپ بدون هیچ نقصی بسازم؟
شرمنده این قدر سئوال پرسیدم . ممنون
:rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نه انگار مشکل ستاپ نداره . توی خود ویژال استودیو هم یکی درمیون این مشکل هست
استاد علی ، یه رویدادی نیست که وقتی سرویسی start یا stop میشه ، اطلاع بده؟
باید از timer استفاده کرد فقط؟ و هر چند لحظه درمیون چک کرد که آیا اون سرویس start شد یا نه؟ اگه رویدادی میبود ، خیلی بهتر میشد
 

the_king

مدیرکل انجمن
نه انگار مشکل ستاپ نداره . توی خود ویژال استودیو هم یکی درمیون این مشکل هست
استاد علی ، یه رویدادی نیست که وقتی سرویسی start یا stop میشه ، اطلاع بده؟
باید از timer استفاده کرد فقط؟ و هر چند لحظه درمیون چک کرد که آیا اون سرویس start شد یا نه؟ اگه رویدادی میبود ، خیلی بهتر میشد
سرویس ها به برنامه شما کاری ندارند که بهش اطلاع بدن، باید رخداد های گروه System رو چک کنید. توی ویندوز تون اون گروه مملو از رخداد های Information ای که میگه فلان سرویس راه افتاد یا متوقف شد.
نرم افزار های Setup ساز ربطی به مباحث این تاپیک نداره، چرا همه مباحث رو قاطی می کنین. InstallShield و Advanced Installer و Setup Factory سه تا مورد معروف و متعارف ئه که برای کار های عادی و سریع Setup Factory و برای نرم افزار هایی که نصب شون دردسر زیاد داره Advanced Installer بهتر جواب میده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سرویس ها به برنامه شما کاری ندارند که بهش اطلاع بدن، باید رخداد های گروه System رو چک کنید. توی ویندوز تون اون گروه مملو از رخداد های Information ای که میگه فلان سرویس راه افتاد یا متوقف شد.
نرم افزار های Setup ساز ربطی به مباحث این تاپیک نداره، چرا همه مباحث رو قاطی می کنین. InstallShield و Advanced Installer و Setup Factory سه تا مورد معروف و متعارف ئه که برای کار های عادی و سریع Setup Factory و برای نرم افزار هایی که نصب شون دردسر زیاد داره Advanced Installer بهتر جواب میده.

ممنون استاد علی
منظورتون از رخدادهای گروه System ، همین شی ای بود که داده بودین؟ :


کد:
EventLog WinUpdateEventLog = new EventLog("System");

اگه آره ، این شی ، سرویسی که start یا stop میشه رو پیام نمیده . فقط تغییرات startup type رو پیام میده
 

the_king

مدیرکل انجمن
ممنون استاد علی
منظورتون از رخدادهای گروه System ، همین شی ای بود که داده بودین؟ :


کد:
EventLog WinUpdateEventLog = new EventLog("System");

اگه آره ، این شی ، سرویسی که start یا stop میشه رو پیام نمیده . فقط تغییرات startup type رو پیام میده
ویندوز شما مخصوصه ئه لابد.
services.png
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ویندوز شما مخصوصه ئه لابد.
services.png

!
عجیبه
همون کد :


کد:
            EventLog WinUpdateEventLog = new EventLog("System");
            WinUpdateEventLog.EnableRaisingEvents = true;
            WinUpdateEventLog.EntryWritten += new EntryWrittenEventHandler(this.WinUpdateEventLog_EntryWritten);

و

کد:
        private void WinUpdateEventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
        {

                this.Invoke(new ParameterizedThreadStart(this.WinUpdateEventLog_MainThread), e.Entry);

        }
هه دیگه؟
من توی این کد :

کد:
        private void WinUpdateEventLog_MainThread(object e)
        {
            EventLogEntry eventVar = e as EventLogEntry;
            if (eventVar == null)
                return;
            MessageBox.Show(eventVar.Message);

        }

وقتی start و stop میکنم سرویسی را پیام نمیده . فقط start type شو تغییر میدم پیام میده
 

the_king

مدیرکل انجمن
!
عجیبه
همون کد :


کد:
            EventLog WinUpdateEventLog = new EventLog("System");
            WinUpdateEventLog.EnableRaisingEvents = true;
            WinUpdateEventLog.EntryWritten += new EntryWrittenEventHandler(this.WinUpdateEventLog_EntryWritten);

و

کد:
        private void WinUpdateEventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
        {

                this.Invoke(new ParameterizedThreadStart(this.WinUpdateEventLog_MainThread), e.Entry);

        }
هه دیگه؟
من توی این کد :

کد:
        private void WinUpdateEventLog_MainThread(object e)
        {
            EventLogEntry eventVar = e as EventLogEntry;
            if (eventVar == null)
                return;
            MessageBox.Show(eventVar.Message);

        }

وقتی start و stop میکنم سرویسی را پیام نمیده . فقط start type شو تغییر میدم پیام میده
این کد از اساس ایراد داره، MessageBox چیه اون وسط، اصلا مناسب همچین رخداد هایی نیست که منبع مستقل دارن، EnableRaisingEvents چرا قبل از تخصیص متد به EntryWritten ئه؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
این کد از اساس ایراد داره، MessageBox چیه اون وسط، اصلا مناسب همچین رخداد هایی نیست که منبع مستقل دارن، EnableRaisingEvents چرا قبل از تخصیص متد به EntryWritten ئه؟

وسط نیست . آخر شه :green:
MessageBox رو فقط برای تست اینکه رویداد اجرا میشه یا نه گذاشتم . کد اصلی نیست. برای تغییر start type ، کد اجرا میشه ولی برای start و stop نه (با کدی هم که در پست دوم دادین تست کردم ، زمان start و stop اغلب پیامی نمیده یا گاها هم که میده ، یه متن بی ربط انگار میده . پیام running و stop نمیده)
EnableRaisingEvents اول باشه یا آخر فرق داره؟ معمولا پروپرتی ها را اول مقداردهی میکنن و بعد متدها و رویدادها را مقداردهی میکنن . با این حال جاش رو هم عوض کردم ولی فرقی نکرد
ویندوز 10 نسخه ی 64 بیت انترپرایز دارم
 
آخرین ویرایش:

the_king

مدیرکل انجمن
وسط نیست . آخر شه :green:
MessageBox رو فقط برای تست اینکه رویداد اجرا میشه یا نه گذاشتم . کد اصلی نیست. برای تغییر start type ، کد اجرا میشه ولی برای start و stop نه (با کدی هم که در پست دوم دادین تست کردم ، زمان start و stop اغلب پیامی نمیده یا گاها هم که میده ، یه متن بی ربط انگار میده . پیام running و stop نمیده)

یا یکجای کد نویسی تون ایراد داره و یا ویندوز تون Policy Settings متفاوتی داره که بعیده اصلا عملی باشه. بهتره Event Viewer ویندوزتون رو چک کنید که معلوم بشه ایراد از کدتون هست یا اونجا هم موردی ثبت نمیشه.
EnableRaisingEvents اول باشه یا آخر فرق داره؟
لطفا توضیحاتی که قبلا دادم مطالعه کنید، فرقی نمی کنه اول آب رو جاری کنیم و زیر فشار جریان آب شیر فلکه رو وصل کنیم یا اول شیر فلکه رو وصل کنیم و بعد آب رو باز کنیم؟ برنامه ممکنه کرش کنه، اینکه احتمال کرش داشته باشه مهم نیست؟
معمولا پروپرتی ها را اول مقداردهی میکنن و بعد متدها و رویدادها را مقداردهی میکنن.
لطفا منبعی که ازش این روال، قاعده یا اصل، یا هر چی که اسمشو بذارین رو یادگرفتید معرفی کنید.
با این حال جاش رو هم عوض کردم ولی فرقی نکرد
نمیدونم انتظار داشتید چه فرقی بکنه، هزاران بار ممکنه مشکل پیش نیاد ولی یکبار که رخدادی در حین اجرای کد ایجاد میشه خطا رخ بده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
یا یکجای کد نویسی تون ایراد داره و یا ویندوز تون Policy Settings متفاوتی داره که بعیده اصلا عملی باشه. بهتره Event Viewer ویندوزتون رو چک کنید که معلوم بشه ایراد از کدتون هست یا اونجا هم موردی ثبت نمیشه.

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

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

نمیدونم انتظار داشتید چه فرقی بکنه، هزاران بار ممکنه مشکل پیش نیاد ولی یکبار که رخدادی در حین اجرای کد ایجاد میشه خطا رخ بده.

ممنون
برای قضیه ی start و stop ، در Event Viewer هم چیزی ثبت نمیشه
مشکل تنظیمات ویندوزمه؟
از یه روش دیگه درست شد احتمالا . (البته قضیه ی رخداد start و stop نه =)
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
از کمکتون واقعا ممنونم استاد علی :rose:
یه جورایی درست شد (البته بازم میگم با start و stop کردن ، رخدادی اجرا نمیشد) و برنامه رو منتشر کردم
 

the_king

مدیرکل انجمن
ممنون
برای قضیه ی start و stop ، در Event Viewer هم چیزی ثبت نمیشه
مشکل تنظیمات ویندوزمه؟
از یه روش دیگه درست شد احتمالا . (البته قضیه ی رخداد start و stop نه =)
بعضی قسمت های ویندوز میتونه جداگانه تنظیم Policy داشته باشه که کدوم رخداد ها رو ثبت بکنه یا نکنه. الزاما مشکل نیست ولی غیر عادیه و البته ربطی به کد شما نداره.
 

جدیدترین ارسال ها

بالا