문제

절대 Winapi를 프로그래밍하여 여기에 약간의 문제가 있습니다.

응용 프로그램에서 내 PC를 끄면 필요합니다.

이 예를 찾았습니다 링크 텍스트 그런 다음이 예를 찾았습니다. 특권을 바꾸는 방법을 찾았습니다 링크 텍스트

하지만 해당 매개 변수 핸들을 얻는 방법 HTOKEN // 액세스 토큰 손잡이를 얻는 방법에 문제가 있습니다.

매개 변수 OpenProcessToken LookupPrivileGeValue AdjustokenPrivileges를 얻기 위해 다음 순서로 만들어야한다고 생각하지만 무엇을 해야할지 모르는 많은 매개 변수가 있습니다.

어쩌면 당신은 내가 그 작업을 수행하기 위해 Htoken 매개 변수를 처리하는 방법을 예제했을 것입니다.

그건 그렇고 나는 이미 다음 게시물을 보았습니다 링크 텍스트

여러분 모두에게 감사드립니다.

도움이 되었습니까?

해결책

이것은 다니엘의 답변에 대한 의견에 약간의 것이므로 여기에 넣을 것입니다.

이 시점에서 주요 문제는 시스템 종료를 수행하는 데 필요한 명백한 과정에서 프로세스가 실행되지 않는다는 것입니다.

문서 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