سؤال

أنا مطلقا مبرمجة Winapi لذلك لدي مشكلة صغيرة هنا.

أحتاج إيقاف تشغيل الكمبيوتر الخاص بي من طلبي.

لقد وجدت هذا المثال رابط النص ثم وجدت هذا المثال كيفية تغيير الامتيازات رابط النص

ولكن لدي مشكلة كيفية الحصول على هذا المعلمة مقبض HETOKON //

أعتقد أنني بحاجة إلى جعله في الترتيب التالي للحصول على المعلمة openprocesstoken lookupprivilegevalue التعديلات ولكن هناك الكثير من المعلمات التي ليس لدي أي فكرة عما يجب القيام به معهم.

ربما لديك جيري بعض المثال كيف يمكنني التعامل مع هذه المعلمة HETOKAN لجعل هذا العمل.

بالمناسبة رأيت بالفعل المنشور التالي رابط النص

شكرا جزيلا كل ما عليك.

هل كانت مفيدة؟

المحلول

هذا كثير بعض الشيء للتعليقات على إجابة دانيال، لذلك سأضعه هنا.

يبدو أن مشكلتك الرئيسية في هذه المرحلة هي أن عمليةك لا تعمل مع الخصوصية المطلوبة لإجراء إيقاف تشغيل النظام.

المستندات ل ExitWindowSex. تحتوي على هذا الخط:

لإيقاف أو إعادة تشغيل النظام، يجب أن تستخدم عملية الاتصال AdjustTokenPrivileges وظيفة لتمكين SE_SHUTDOWN_NAME شرف. لمزيد من المعلومات، راجع تشغيل مع امتيازات خاصة.

لديهم أيضا بعض مثال رمز. وبعد في قرصة، يمكنك فقط نسخ ذلك.

نصائح أخرى

// ==========================================================================
// system shutdown
// nSDType: 0 - Shutdown the system
//          1 - Shutdown the system and turn off the power (if supported)
//          2 - Shutdown the system and then restart the system
void SystemShutdown(UINT nSDType)
{
    HANDLE           hToken;
    TOKEN_PRIVILEGES tkp   ;

    ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
    ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

    tkp.PrivilegeCount          = 1                   ; // set 1 privilege
    tkp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;

    // get the shutdown privilege for this process
    ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

    switch (nSDType)
    {
        case 0: ::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE, 0); break;
        case 1: ::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0); break;
        case 2: ::ExitWindowsEx(EWX_REBOOT  |EWX_FORCE, 0); break;
    }
}

يمكنك استخدام shellexecute () للإتصال Shutdown.exe.

http://msdn.microsoft.com/en-us/library/aa376868(VS.85).aspx.

محاولة

ExitWindowsEx(EWX_POWEROFF, 0);
#include<iostream>
using namespace std;
int main(){
system("shutdown -s -f -t 0");
}

بعض رمز العمل ل InitiateSystemShutdownEx:

// Get the process token
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
    &hToken);

// Build a token privilege request object for shutdown
TOKEN_PRIVILEGES tk;
tk.PrivilegeCount = 1;
tk.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
LookupPrivilegeValue(NULL, TEXT("SeShutdownPrivilege"), &tk.Privileges[0].Luid);

// Adjust privileges
AdjustTokenPrivileges(hToken, FALSE, &tk, 0, NULL, 0);

// Go ahead and shut down
InitiateSystemShutdownEx(NULL, NULL, 0, FALSE, FALSE, 0);

بقدر ما أستطيع أن أقول، ميزة هذا على ExitWindowsEx الحل هو أن عملية الاتصال لا تحتاج إلى الانتماء إلى المستخدم النشط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top