下面这段代码怎么到不到关机的效果?(win2k)

dycdyc123 2003-08-18 07:50:30
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_POWEROFF|EWX_FORCE, 0);
...全文
108 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CityHost 2003-08-22
  • 打赏
  • 举报
回复
保留
dycdyc123 2003-08-21
  • 打赏
  • 举报
回复
这些代码 只是让我的机子重起

不能关机!

兄弟们,看清题目呀!


而且 把关机代码放在线程中运行,连重起都不行! 只是屏幕上什么也没有, 只有鼠标!
Behard 2003-08-21
  • 打赏
  • 举报
回复
// 如果你使用下面的代码还是不行的话,可能是你的电脑有问题了
UINT m_UStatus; // private:
m_UStatus = EWX_REBOOT; // 重启
m_UStatus = EWX_LOGOFF; // 注销
m_UStatus = EWX_SHUTDOWN| EWX_FORCE| EWX_POWEROFF; // 关机,EWX_FORCE 为强迫关机,必须要 EWX_POWEROFF,否则是到“您可以安全的关闭计算机了”

DWORD dwVersion = GetVersion();
if (dwVersion < 0x80000000) // NT
{
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;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0 );
ExitWindowsEx ( m_UStatus, 0 );
}
else // 9X
ExitWindowsEx ( m_UStatus, 0 );
wt_sanlian 2003-08-21
  • 打赏
  • 举报
回复


DWORD dwVersion = GetVersion();
if (dwVersion > 0x80000000) // Windows 98
{
ExitWindowsEx(EWX_POWEROFF,0);
return;
}

// WIndows 2000以上
HANDLE CurProcHandle;
CurProcHandle = OpenProcess(

PROCESS_ALL_ACCESS,
FALSE,
GetCurrentProcessId()
);
if( CurProcHandle == NULL )
{
Application -> MessageBox("OpenProcess Return error","提示",MB_OK);
return;
}


HANDLE CurTokenHandle;
if( OpenProcessToken(
CurProcHandle,
TOKEN_ADJUST_PRIVILEGES ,
&CurTokenHandle
) == FALSE)
{
CloseHandle(CurProcHandle);
Application -> MessageBox("OpenProcessToken Error","error",MB_OK);
return;
}

LUID MyUID;
if( LookupPrivilegeValue(

NULL,
SE_SHUTDOWN_NAME,
&MyUID
) == FALSE)
{
CloseHandle(CurProcHandle);
DWORD error;
error = GetLastError();
ShowMessage(" LookupPrivilegeValue error");
return;
}

TOKEN_PRIVILEGES Temp_Token_Privileges;
DWORD Length;

Temp_Token_Privileges.PrivilegeCount = 1;
Temp_Token_Privileges.Privileges[0].Luid.LowPart = MyUID.LowPart;
Temp_Token_Privileges.Privileges[0].Luid.HighPart = MyUID.HighPart;
Temp_Token_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;



if(AdjustTokenPrivileges(
CurTokenHandle,
FALSE,
&Temp_Token_Privileges,
sizeof(TOKEN_PRIVILEGES),
NULL,
NULL
) == FALSE)
{


DWORD ErrorCode;
ErrorCode = GetLastError();

ShowMessage("AdjustTokenPrivileges Error");
CloseHandle(CurProcHandle);
return;
}
CloseHandle(CurProcHandle);
ExitWindowsEx(EWX_POWEROFF,0);
dycdyc123 2003-08-20
  • 打赏
  • 举报
回复
谢谢

还是不能不关机 只是重起!~!

参数是怎样的?

和EWX_REBOOT 一样的效果!

系统是刚装的 win2k!

dycdyc123 2003-08-20
  • 打赏
  • 举报
回复
恩 好的 我看看
感谢!
xujie839997 2003-08-20
  • 打赏
  • 举报
回复
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwVersion;

dwVersion = GetVersion(); // 获得版本号
if ( dwVersion < 0x80000000)
{
// Windows NT,2000,XP
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|
TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1 ; //权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp, 0 ,(PTOKEN_PRIVILEGES)NULL,0);

ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0);
}
else
{
//9X系列
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
}
MEFULEU 2003-08-19
  • 打赏
  • 举报
回复
//要先提升进程的权限~~~~重起机器用
void SetProcessPrivilege( LPCTSTR szPrivilegeName, BOOL bOpen )
{
BOOL bResult;
DWORD dwCurProcId = GetCurrentProcessId();
HANDLE hCurProc;
hCurProc = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwCurProcId );
DWORD e = GetLastError();
HANDLE hToken;
bResult = OpenProcessToken( hCurProc, TOKEN_ADJUST_PRIVILEGES, &hToken );
bResult = CloseHandle(hCurProc);

LUID luid;
bResult = LookupPrivilegeValue( NULL, szPrivilegeName, &luid );

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
memcpy( &tp.Privileges[0].Luid, &luid, sizeof(LUID) );
tp.Privileges[0].Attributes = bOpen ? SE_PRIVILEGE_ENABLED : 0;
bResult = AdjustTokenPrivileges( hToken, FALSE, &tp, 0, NULL, NULL );
CloseHandle( hToken );
}
//重新启动机器函数
void ShutDownComputer(void)
{
SetProcessPrivilege(SE_SHUTDOWN_NAME,true);

DWORD dwVersion = GetVersion();
if (dwVersion < 0x80000000) //NT
{
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;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL,0);
//ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE|EWX_POWEROFF,0);//参数2;安全关机;参数2强行关机;
//ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF,0);
ExitWindowsEx(EWX_REBOOT,0);
}
else //9X
//ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF,0);
ExitWindowsEx(EWX_REBOOT,0);

}
zjsheng 2003-08-19
  • 打赏
  • 举报
回复

98 和 ME、2K、XP 是不一样的

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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