OSVERSIONINFO oi;
oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&oi); if (oi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE handle;
TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(handle, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, 0);
} ::ExitWindowsEx(ShutdownFlag,0);在win2000server下也能关机,在关机前提是一个cmd.exe错误!请问何故?? :) 谢谢!!
oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&oi); if (oi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE handle;
TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(handle, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, 0);
} ::ExitWindowsEx(ShutdownFlag,0);在win2000server下也能关机,在关机前提是一个cmd.exe错误!请问何故?? :) 谢谢!!
解决方案 »
- VC之初探。。。
- 请真的熟悉COM进程空间的朋友来指点一下
- 关于控制台方式下输入密码的问题!
- 完成端口在用WSASend发送数据的时候,到底是已经发送完了还是只进入完成端口线程操作?
- 如何添加多个文件?
- classwizard的问题,密切关注中!!!
- 求学中如何从界面中,首先按增加按钮,将Edit控件的值设空,让用户输入后存入数据库.
- 网络通讯在hub局域网内能通信,但是通过交换机则不行,为何?
- 请问,如何建立 Console 然后在其上面现实信息?
- 有没有研究WDM 的战友,我想研究WDM自动生成软件,这个想法现实吗?
- 如何得知系统的分区数目和每个分区的盘符
- 能得知任一程序弹出的对话框是何种类型吗?
我想是其他原因,和你的程序无关。
static TOKEN_PRIVILEGES tp;
static LUID luid;
::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken ) ;
::LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL );
::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
{
OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!GetVersionEx((OSVERSIONINFO *)&osvi))
{
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (!GetVersionEx ( (OSVERSIONINFO *) &osvi))
return FALSE;
} BOOL bIsNt = FALSE;
if (VER_PLATFORM_WIN32_WINDOWS == osvi.dwPlatformId)
bIsNt = FALSE;
else if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId)
bIsNt = TRUE; DWORD dwType = 0;
if (bForce) dwType = EWX_FORCE; if ( !bIsNt )
{
ExitWindowsEx(EWX_LOGOFF|EWX_SHUTDOWN|dwType, 0);
}
else
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp; // Get a token for this process.
if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
MessageBox(NULL, "´ò¿ª½ø³Ì±êʶ³ö´í", "ÓêÈËÈí¼þ", MB_OK);
return FALSE;
}
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid );
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); // Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
{
return FALSE;
} //now we can reboot;
ExitWindowsEx( EWX_LOGOFF|EWX_SHUTDOWN|dwType, 0 );
} if (GetLastError() != ERROR_SUCCESS)
{
return FALSE;
} return TRUE;
}