View Full Version : اجرای دوباره برنامه
akbarg64
جمعه 25 شهریور 1390, 19:56 عصر
سلام دوستان.من یه نرم افزار مدیریت کافی نت نوشتم اما یه مشکل خیلی بزرگ داره.تسک منیجر cmd و ریجستری غیرفعال میشن.اما خیلی راحت میشه دوباره همشون رو فعال کرد و برنامه رو بست.حالا میخوام اگه کاربر تونست فعال کنه و برنامه رو بست دوباره برنامه اجرا بشه و فرم اولیه برنامه که هنوز لوگین نشده رو نشون بده.چون سیستم ها وصل هستند به اینترنت ولی کاربر نمیتونه استفاده کنه.کلید Alt+tab کار نکنه.فرم اولیه on top هست.ممنون میشم کمکم کنید
محسن واژدی
جمعه 25 شهریور 1390, 23:01 عصر
سلام علیکم
چند راه که پیشنهاد می کنم:
1- قرار دادن دو پروسه که اولی اجرا بودن برنامه مدیریت را بررسی کند که در صورت بسته شدن مجددا آنرا اجرا کند
2- عموما" چون دسترسی سیستم های کاربران در کافینت محدود شده است، میتوانید برنامه مدیریت را تحت Admin اجرا کنید که در اینصورت برنامه از طریق روش های معمولی نظیر TaskMgr نیز بسته نخواهد شد
3- ذستوراتی وجود دازد که برنامه را به عنوان یک پروسه مهم سیستمی ثبت میکند، همانگونه که میتدانید اگر یک پروسه مهم سیستمی بسته شود ویندوز restart خواهد شد
4- کامپوننتی وجود دارد بنام EventVB.dll که امکان غیرفعال کردن کلید های تریکیبی ویندوز نظیر Alt+tab، Ctrl+Alt+Del و ... را فراهم میکند (درباره این کامپوننت نیز قبلا" در سایت مطرح شده است، جستجو کنید)
5- میتوان دستوری نوشت که وضعیت اجرایی برنامه های TaskMgr و CMD را بررسی میکند، و به محض اجرا شدن این پروسه ها آنها را غیرفعال یا ببندد
موفق باشید
akbarg64
شنبه 26 شهریور 1390, 12:04 عصر
ممنون.در مورد گزینه های 2 4 و 5 خیلی روش کار کردم.اما یه نرم افزار پیدا کردم که تمام محدودیت ها رو حذف میکنه.و خودم هم داشتم.و روی ایزی کافی امتحان کردم جواب داد اما به محض بستن ایزی کافی دوباره اجرا شد.میشه در مورد گزینه 3 توضیح بدین؟؟؟؟؟چطور اینکار رو بکنم.بازم ممنون.
محسن واژدی
شنبه 26 شهریور 1390, 15:03 عصر
یه نرم افزار پیدا کردم که تمام محدودیت ها رو حذف میکنه.
بله، اگر برنامه را در کاربر admin نصب کرده باشید، این امکان فراهم شده است که بتواند به منابع سیستمی دسترسی داشته باشد، اما اگر یک برنامه مستقیما"
از کاربر محدود شده اجرا شود امکان بسته هیچ یک از برنامه های admin را ندارد
میشه در مورد گزینه 3 توضیح بدین؟؟؟؟؟چطور اینکار رو بکنم.
اگر برنامه های سیستمی همانند lsass.exe یا winlogon.exe را kill کنید، سیستم بلافاصله restart میشود (البته winlogon ویندوز سون اینگونه نیست)، شما میتوانید برنامه تان را به این صورت به لیست پروسه های لازم سیستمی اضافه کنید تا در صورت بسته شدن آن همانند kill شدن csrss.exe سیستم restart شود،
برای اینکار کد زیر را در یک ماژول کپی کنید:
Option Explicit
Private Const ANYSIZE_ARRAY = 1
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Type LUID
LowPart As Long
HighPart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLUID As LUID) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Public Const SE_DEBUG_NAME As String = "SeDebugPrivilege"
Public Declare Function RtlSetProcessIsCritical Lib "ntdll.dll" (ByVal NewValue As Boolean, ByVal OldValue As Boolean, ByVal WinLogon As Boolean)
Public Function GetPrivilegs(ByVal privilegio As String) As Long
On Error Resume Next
Dim lpLUID As LUID
Dim lpToken As TOKEN_PRIVILEGES
Dim lpAntToken As TOKEN_PRIVILEGES
Dim hToken As Long
Dim hProcess As Long
Dim res As Long
hProcess = GetCurrentProcess()
res = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)
If res = 0 Then
Exit Function
End If
res = LookupPrivilegeValue(vbNullString, privilegio, lpLUID)
If res = 0 Then
Exit Function
End If
With lpToken
.PrivilegeCount = 1
.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
.Privileges(0).pLuid = lpLUID
End With
res = AdjustTokenPrivileges(hToken, False, lpToken, Len(lpToken), lpAntToken, Len(lpAntToken))
If res = 0 Then
Exit Function
End If
GetPrivilegs = res
End Function
برای استفاده کد زیر را در Sub Main یا Load فرم کپی کنید:
Private Sub Command1_Click()
GetPrivilegs SE_DEBUG_NAME
Call RtlSetProcessIsCritical(0, 0, 1)
End Sub
این دستور را یکبار در یک فرم اجرا کنید کافی است،
برای بررسی عملکرد، برنامه را کمپایل و اجرا کنید سپس در TaskMgr یا هربرنامه دیگر آنرا kill کنید (پیشنهاد میکنم قبل از تست داده هایتان را ذخیره کنید)
موفق باشید
majidbestgame
چهارشنبه 05 مهر 1391, 11:38 صبح
سلام شاید یکم دیر به برنامه نویس سر زدم...
ولی همون طور که دوستان گفتن شما میتونید از دو برنامه استفاده کنید که در صورت بسته شدن هر یک از آنها برنامه ی دیگری آن یکی را اجرا کنید و در این صورت همیشه دو پروسه در حال اجرا دارید که یک جورایی از هم محافظت میکنند... که البته این روش برای جلو گیری از بسته شدن برنامه روش خوبی هست ولی یک روش کامل نیست چون حتی اگه پروسه های در حال اجراتون حتی بیش از 5 تا هم باشه میشه با یک فایل .cmd همشونو یکجا بست..
از یک طرف دیگه هم میتونید پروستونو سیستمی کنید که به قول دوستمون تو سون جواب نمیده و سیستم ریست نمیشه که البته تو ایکس پی هم میشه یک جورایی جلوی ریست شدنشو گرفت
/// واسه اینکه بعد از اینکه برنامه بسته شد و دباره اجرا شد فرم لوگین رو نشون بده شما باید به هنگام اجرا شدنش به برنامه یک پسورد داده باشید و اون پسورد رو توی یک قسمتی مثل رجیستری و یا یک فایل کد بندی شده ذخیره بشه و وقتی که برنامه دباره اجرا شد چک کنه که اگه در فلان کلید مقداری ذخیره شده فرم لوگین نشون داده بشه...
من خودم قبلا یک نمونه برنامه مدیریت کافی نت نوشته بودم...که البته یکسری کنترل رو میشد روی کلاینت ها داشت واسه شبکه بودنش هم از کمپونت های internetsocket استفاده کرده بودم که ابته این کامپونت ها با خود دلفی نصب میشن و شما باید فقط اونو به پکیج های دلفی اضافه کنید
اگه سوالی بود...و اگه کمکی از دستم بر بیاد هستم در خدمت دوستان
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.