想Restart Computer碰到的问题,知道的一下就搞定了...

NothingRemained 2003-02-23 08:46:05
查MSDN,ExitWindowsEx ,
To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges.
调用告诉说没有权限 >>

BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option
PTOKEN_PRIVILEGES NewState, // privilege information
DWORD BufferLength, // size of buffer
PTOKEN_PRIVILEGES PreviousState, // original state buffer
PDWORD ReturnLength // required buffer size
); >>

需handle to token >>

BOOL OpenProcessToken(
HANDLE ProcessHandle, // handle to process
DWORD DesiredAccess, // desired access to process
PHANDLE TokenHandle // handle to open access token
);

or

BOOL OpenThreadToken(
HANDLE ThreadHandle, // handle to thread
DWORD DesiredAccess, // access to process
BOOL OpenAsSelf, // process or thread security
PHANDLE TokenHandle // handle to open access token
);

>> handle to thread or handle to process

>> 使用
GetCurrentProcess
GetCurrentThread
OpenProcess
等函数来获取的handle在调用OpenThreadToken or OpenProcessToken时都返回错误
说不存在的1008:试图引用不存在的令牌。

不知道怎么回事,知道的告诉一把,thx

当然,能告诉不如此,怎么就可以enable the SE_SHUTDOWN_NAME privilege更好

...全文
121 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
NothingRemained 2003-02-23
  • 打赏
  • 举报
回复
ai,以后都要先到google去search一下
发表后就找到了一个跟你的差不多的程序

thx!
masterz 2003-02-23
  • 打赏
  • 举报
回复
我们可以自己编写一个reboot.exe来取代reboot.bat,原理很简单,代码如下:
#include "stdio.h"
#include "windows.h"
int main()
{
     //定义重起的时候发送给所有用户的消息
     LPSTR msg="Reboot Tool By Lion Hook\nhttp://www.xici.net";
     //尝试用最简单的API函数重起
     if(ExitWindowsEx(EWX_REBOOT, 0))return TRUE;
     if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))return TRUE;
     //因为上面的重起不成功,所以需要调整本进程的特权
     HANDLE hToken;
     TOKEN_PRIVILEGES tkp;
     if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE;
     //获取重起的特权SE_SHUTDOWN_NAME
     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);
     //判断是NT内核还是9x内核,选择用不同的方式
     if(!(GetVersion() & 0x80000000))
       InitiateSystemShutdown(NULL, msg, 20, TRUE, TRUE);
     else if (!ExitWindowsEx(EWX_REBOOT, 0))
         if(!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
            return FALSE;
     return TRUE;
}

上面的这段代码取自响马的一段程序,编译以后的reboot.exe在http://www.patching.net/shotgun/reboot.exe可以下载。

15,471

社区成员

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

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