- 5
- 0
- 约3.85千字
- 约 3页
- 2018-06-01 发布于河南
- 举报
如何实现关闭远程Windows2000系统
如何实现关闭远程Windows 2000系统 2001-10-30· ·周侃··yesky 在Win9x中退出系统大家一定不陌生吧?好象挺神乎的,其实说穿了不过就是调用了一个底层的API函数ExitWindowsEx()罢了。但这在Win2000中行不通。不信?你随便用VB,Delphi,C++Builder试一试,没反应吧?
这是因为Win2000其实就是WinNT 5.0,用的就是NT的内核。Windows NT可不象Win9x和Dos,可以随意进行底层操作,如在Win9x中可以随意关掉任何进程(如kernel32进程,这将导致死机),随意进行绝对磁盘扇区读写(如CIH病毒),Windows NT非常注重系统每个进程的权利(这一点很像Unix,但只有这样才能算得上是一个比较完整的操作系统!),一个普通的进程是不应具备有调用系统的权利(这也是为什么Win9x和Dos下病毒成灾的原因),强行调用ExitWindowsEx()只能是没有反应。所以唯一的做法是我们来赋予它足够的权限。
启动C++Builder,新建一个工程,添加三个按钮,Caption依次为“注销当前用户”、“退出Windows2000”和“重新启动Windows2000”,然后双击Button1,在中间加入以下代码:
{HANDLE app;DWORD num;TOKEN_PRIVILEGES tok;//定义变量OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,app);tok.PrivilegeCount=1;/*
OpenProcessToken()这个函数的作用是打开一个进程的访问令牌,其函数原形为
BOOL OpenProcessToken( HANDLE ProcessHandle, // handle to processDWORD DesiredAccess, // desired access to processPHANDLE TokenHandle // pointer to handle of open access token );
其中第二个参数是访问的请求方式,比较繁杂,欲了解详情请查看 Win32 Programmers Reference
GetCurrentProcess()函数的作用是得到本进程的句柄
*/LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,(tok.Privileges[0].Luid));tok.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;/*
LookupPrivilegeValue()的作用是修改进程的权限,在此处为修改本进程成为具有退出系统的权限,其函数原形为
BOOL LookupPrivilegeValue(LPCTSTR lpSystemName, // address of string specifying the systemLPCTSTR lpName, // address of string specifying the privilegePLUID lpLuid // address of locally unique identifier );
*/AdjustTokenPrivileges(app,false,tok,sizeof(tok),tok,num);/*
AdjustTokenPrivileges()的作用是通知Windows NT修改本进程的权利,其函数原形为
BOOL AdjustTokenPrivileges(HANDLE TokenHandle, // handle to token that contains privilegesBOOL DisableAllPrivileges, // flag for disabling all privilegesPTOKEN_PRIVILEGES NewState, // pointer to new privilege informationDWORD BufferLength, // size, in bytes, of the PreviousState bufferPTOKEN_PRIVILEGES PreviousState, // receives original state of changed privilegesPDWORD ReturnLength // receives required size of the
原创力文档

文档评论(0)