用ExitWindowsEx 定时关机,在win2000porfessional下好用,在win2000server下报错cmd.exe

MrHg 2004-06-15 02:44:18
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错误!请问何故?? :) 谢谢!!
...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gladstone 2004-07-14
  • 打赏
  • 举报
回复
2003下都好使的

BOOL __stdcall Shutdown(BOOL bForce)
{
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;
}
sohou 2004-07-13
  • 打赏
  • 举报
回复
权限他已经取得了,可能和你的程序没没关系,CMD.EXE好象是DOS的SHELL吧,是不是有什么CONSOLE程序无法关闭了
lixiaosan 2004-07-13
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3157/3157550.xml?temp=.2972681
taianmonkey 2004-07-12
  • 打赏
  • 举报
回复
static HANDLE hToken;
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);
kugou123 2004-06-27
  • 打赏
  • 举报
回复
楼主,CMD.EXE报错,应该和你的程序没有关系吧?
我想是其他原因,和你的程序无关。
Pipi0714 2004-06-15
  • 打赏
  • 举报
回复
在windows2000下关机需要足够的权限!

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧