// test32.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Windows.h> int _tmain(int argc, _TCHAR* argv[]) { HANDLE hToken = NULL; BOOL bResult = FALSE; TOKEN_PRIVILEGES tkp; bResult = ::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY | TOKEN_QUERY_SOURCE, &hToken);//得到当前进程的访问令牌句柄 if (bResult) { ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); //得到指定系统权限的特权值,放在Luid中 tkp.PrivilegeCount = 1; //Privileges个数,这里为1 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //该权限开放 ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);//调整获得的权限 if (::GetLastError() != ERROR_SUCCESS) { // } bResult = ::InitiateSystemShutdown( NULL, _T("我要帮你关机!"), //关机界面消息字符串 1000, //关机延时长度 FALSE, //是否强制关闭应用程序 FALSE); //关机后是否立即重启 tkp.Privileges[0].Attributes = 0; //该权限关闭 ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); //调整获得的权限 if (GetLastError() != ERROR_SUCCESS) { } } ::CloseHandle(hToken); hToken = NULL; return 0; }