Windows Server-如何在以普通用户登录而运行的程序中关闭、重启计算机

Windows Server-如何在以普通用户登录而运行的程序中关闭、重启计算机

灵芸 发布于 2017-01-08 字数 189 浏览 1090 回复 2

对于NT操作系统,不能随便的重启机器和关闭机器,若要进行以上操作,必须要具有相应的权限才可以,否则就不行。如果应用程序是以普通用户的身份登录的,如何在程序中实现关闭、重启计算机的功能?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

偏爱自由 2017-06-11 2 楼

window中的进程中有个令牌,需要提升它的权限,应用层下提升就可以了。见如下代码:

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
// 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, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL);
// GetLastError() != ERROR_SUCCESS;
if(choose==IDYES)
{
if (b_state==1)
{
//AfxMessageBox("reboot");
// reboot the system and force all applications to close.
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else
{
//AfxMessageBox("shutdown");
// Shut down the system and force all applications to close.
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
}

}

重启关机需要SE_SHUTDOWN_NAME权限,远程关机需要SE_REMOTE_SHUTDOWN_NAME权限,调试程序需要提升到SE_DEBUG_NAME权限。这也是病毒木马常用手段,所以要做HIPS,也可以从这个地方入手,HOOK住LookupPrivilegeValue和AdjustTokenPrivileges。

偏爱自由 2017-02-08 1 楼

C++ 的话:

#include <stdlib.h>
#include <iostream>

using namespace std;

int main(void)
{
// 关机
system("shutdown -s -t 0");
// 重启
system("shutdown -r -t 0");
// 注销
system("shutdown -l");

return 0;
}

直接调用系统的 exe 也可以哦
祝好,
斑驳敬上