Remote Shut Down With vc++

الكاتب : نجيب المجيدي   المشاهدات : 804   الردود : 5    ‏2005-01-22
      مشاركة رقم : 1    ‏2005-01-22
  1. نجيب المجيدي

    نجيب المجيدي عضو فعّال

    التسجيل :
    ‏2003-12-08
    المشاركات:
    527
    الإعجاب :
    0
    المقدمة :
    لا يخفى على أحد أهمية البرامج التي تتعامل عبر الشبكة و بالذات تلك التي تستطيع أن تتحكم بالأجهزة و قد قمت بعمل ذلك باستخدام الفيجوال بيسك
    و أعتقد أنه من الشيق جداً أن نعمل هذا بلغة فيجوال سي ++ هذه اللغة التي تتحدى كل العوائق و التي لا يقف في طريقها شيء.
    فلنبدأ إذاً خطوة بخطوة لبناء هذا البرنامج



    نص الموضوع:
    * هذا البرنامج يمكنك من إيقاف تشغيل حاسب عبر الشبكة
    /////////////////////////////\\\\\\\\\\\\\\\\\\\\\

    سنقوم أولاً بإنشاء برنامج EXE جديد باستخدام المعالج و نعطيه الاسم التالي
    RemoteShutDown
    نختار الخيار
    dialog-based application
    وبعد الضغط على زر الإنهاء ستظهر لنا النافذة الأولى نقوم بعد ذلك بحذف كل الأدوات التي أنشأها ا لمعالج
    و نضع الأدوات تبعاً للجدول التالي

    Control :: Machine Name edit box

    ID :: IDC_NAME

    Variable :: m_mname

    Type :: CString

    ---------------------------------
    Control :: Alert edit box

    ID :: IDC_MSG

    Variable :: m_msg

    Type :: CString

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

    Control :: Machine Password edit box

    ID :: IDC_PWD

    Variable :: m_pwd

    Type :: CString

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

    Control :: Restart check box

    ID :: IDC_RST

    Variable :: m_rst

    Type :: BOOL

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


    Control :: Force application shutdown check box

    ID :: IDC_FAS

    Variable :: m_fas

    Type :: BOOL

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

    Control :: ShutDown button

    ID :: IDC_SD

    Control :: Close button

    ID :: IDOK

    ---------------------------------
    بعد ذلك نضيف الترويسة (Header) "winnetxk.h" ثم نربط المكتبة "mpr.lib" و ذلك كالتالي :
    ‘Project \ Settings \ Link’
    و من ثم من مربع التحرير
    ‘Object/library modules’
    قم بطباعة
    ‘mpr.lib’.

    أضف handlers لزر الأمر ‘ShutDown’ و أضف الكود التالي

    ====================================

    void CRemoteShutDownDlg::OnSd()
    {
    // TODO: Add your control notification handler code here
    UpdateData ( TRUE ) ;
    If ( m_mname == "" )
    {
    AfxMessageBox ( "لا يمكن وضع فراغ لاسم الكمبيوتر ...." ) ;
    }
    else
    {
    LPSTR lpMachineName = ( LPSTR ) ( LPCTSTR ) m_mname ;
    LPSTR lpMessage = ( LPSTR ) ( LPCTSTR ) m_msg ;
    DWORD dwTimeout = 10 ;
    BOOL bForceAppsClosed = m_fas ;
    BOOL bRebootAfterShutdown = m_rst ;

    HANDLE hToken ;
    TOKEN_PRIVILEGES TokenPrivileges ;
    WnetAddConnection ( ( LPCTSTR ) m_mname, ( LPCTSTR ) m_pwd, NULL ) ;
    OpenProcessToken ( GetCurrentProcess ( ), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_ALL_ACCESS, &hToken ) ;
    LookupPrivilegeValue( NULL, SE_REMOTE_SHUTDOWN_NAME, &( TokenPrivileges.Privileges[0].Luid ) ) ;
    TokenPrivileges.PrivilegeCount = 1 ;
    TokenPrivileges.Privileges[0].Attributes = 2 ;
    AdjustTokenPrivileges ( hToken, FALSE, &TokenPrivileges, sizeof ( TOKEN_PRIVILEGES ), NULL, NULL ) ;

    if ( !InitiateSystemShutdown ( lpMachineName, // اسم الكمبيوتر المراد إغلاقه
    // ملاحظة : في حال تم تمرير قيمة فارغة هنا يتم إغلاق الكمبيوتر المحلي
    lpMessage, // عنوان الرسالة المراد عرضها وهي الرسالة التي ستعرض في مربع حوار الإغلاق
    dwTimeout, // فترة عرض مربع حوار الإغلاق بالثواني
    // ملاحظة : يمكن في هذه الفترة وقف عملية الإغلاق باستخدام الدالة
    // AbortSystemShutdown( )
    bForceAppsClosed, // إغلاق التطبيقات المفتوحة بدون المطالبة بالحفظ
    bRebootAfterShutdown ) ) // وهنا أخيراً خيار لإعادة التشغيل
    AfxMessageBox ( " فشل في إغلاق الجهاز المحدد ...." ) ;
    else
    AfxMessageBox ( "نجحت العملية !!...." ) ;
    }
    }
    قمنا هنا بحفظ قيم الأدوات في المتغيرات وذلك عن طريق الدالة
    UpdateData( TRUE )
    وعن طريق الدالة
    WNetAddConnection( )
    قمنا بالاتصال بالكمبيوتر المحدد في مربع النص و المراد إغلاقه وذلك بتحديد اسم الكمبيوتر و كلمة السر التي يجب أن يعرفها المستخدم بالطبع
    و للإغلاق الجهاز يجب الحصول أولاً على التصريح لهذه العملية و يتم ذلك عن طريق الدوال

    OpenProcessToken( )
    LookupPrivilegeValue( )
    AdjustTokenPrivileges( )

    في حل كان الباراميتر الثالث أكبر من الصفر فإن مربع الحوار يقوم بعرض المستخدم الذي قام بإغلاق الجهاز و الرسالة التي حددها في الباراميتر الثاني
    ومن ثم يطلب من المستخدم تسجيل الخروج فإذا قام بتسجيل الخروج يقوم بالإغلاق في الحال مالم فإنه يقوم بالإغلاق بعد مرور الوقت المحدد
    في الباراميتر الثالث
    و إذا كانت قيمته صفر فإن الدالة تقوم بإغلاق الكمبيوتر بدون عرض الرسالة و تتجاهل حفظ البيانات
    وبالطبع لا يمكن في هذه الحالة إحباط عملية الإغلاق باستخدام الدالة
    AbortSystemShutdown( )

    الباراميتر الثالث يأخذ إما true أو False أي إما إغلاق مباشر بدون حفظ البيانات أو عرض رسالة للمستخدم ليقوم بعمل حفظ لبياناته حتى لا يفقدها
    و الباراميتر الأخير أيضاً إما True وفي هذه الحالة يقوم الجهاز بإعادة التشغيل أو False وفي هذه الحالة يتم إغلاق الجهاز نهائياً

    أتمنى أن يكون الشرح واضحاً ومفهوماً للجميع

    خالص التحية

    والسلام عليكم ورحمة الله وبركاته
     
  2.   مشاركة رقم : 2    ‏2005-01-23
  3. الشرعبي

    الشرعبي عضو نشيط

    التسجيل :
    ‏2003-11-06
    المشاركات:
    483
    الإعجاب :
    0
    والله مافهمت شيء
     
  4.   مشاركة رقم : 3    ‏2005-02-07
  5. نجيب المجيدي

    نجيب المجيدي عضو فعّال

    التسجيل :
    ‏2003-12-08
    المشاركات:
    527
    الإعجاب :
    0
    السلام عليكم ورحمة الله وبركاته

    و الله آسف جداً أخي الشرعبي , لكن هذا البرنامج للمتخصصين في البرمجة بلغة vc++ و بالنسبة للمبتدئين سأحاول قدر الإمكان وضع مقالات تشرح البرمجة بلغة vc++ في الفترة القادمة.

    خالص التحية
     
  6.   مشاركة رقم : 4    ‏2005-02-15
  7. yemen_ghost

    yemen_ghost عضو متميّز

    التسجيل :
    ‏2004-07-03
    المشاركات:
    1,456
    الإعجاب :
    0
    مييييييييييييييييين !!!!!!!!!!!

    نجييييييب بكله هنا

    وينك يا رجل

    كذا ترجم بنا هنا و تغييييييييب ؟؟؟

    و الله عاتبين عليك

    الحمد الله على السلامة

    و المهم انك عدت

    و العود احمد

    ومشكور على الدرس

    و متواصلين

    تحياتي
    -*-*-*-*-*-*-*
    يمن جوست
     
  8.   مشاركة رقم : 5    ‏2005-03-21
  9. وردةاليمن

    وردةاليمن عضو

    التسجيل :
    ‏2005-03-18
    المشاركات:
    70
    الإعجاب :
    0
    السلام عليكم
    تمنيت أخ نجيب أن تعطينا كمان دروس في vc++ لانه لغه جميله فأذا تكرمت و عطيتنا درس أخر تكون مشكور
     
  10.   مشاركة رقم : 6    ‏2005-03-21
  11. نجيب المجيدي

    نجيب المجيدي عضو فعّال

    التسجيل :
    ‏2003-12-08
    المشاركات:
    527
    الإعجاب :
    0
    بسم الله الرحمن الرحيم
    السلام عليكم ورحمة الله وبركاته

    أنا آسف أخي يمن جوست , لكن لكل إنسان ظروفه و أنا و الله مشغول لأبعد حد ( فسامحنا على التقصير ) ,,,

    الأخت وردة اليمن , قمت بكتابة موضوع حول إنشاء مكتبات الربط الديناميكية لكِ ولكل مهتم بالـ vc++

    تجدينه على الرابط التالي:

    إنشاء مكتبات الربط الديناميكية ( فيجوال سي ++)

    خالص التحية
     

مشاركة هذه الصفحة