调整当前进程权限并关机

85 views 十月 21, 04 by Timothy

核心代码片断:

if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
MessageBox(“OpenProcessToken failed!”);
}

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); //调整获得的权限

if (GetLastError() != ERROR_SUCCESS)
{
MessageBox(“切换系统级权限失败!”);
}

fResult =InitiateSystemShutdown(
NULL, // 要关的计算机用户名
“关机时间已到,WINDOWS将在上面的时间内关机,请做好保存工作!”, // 显示的消息
10, // 关机所需的时间
TRUE, // ask user to close apps
FALSE); //设为TRUE为重起,设为FALSE为关机
if(!fResult)
{
MessageBox(“初始化系统关机失败!”);
}

tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
{
MessageBox(“AdjustTokenPrivileges disable failed.”);
}

ExitWindowsEx(EWX_SHUTDOWN,0);

CMD界面下的关机程序

81 views 九月 07, 04 by Timothy

此程序运行在CMD界面下,支持多参数选择

源代码下载:

点击下载此文件

自动关机程序

99 views 九月 07, 04 by Timothy

主要实现了定时关机的功能
在NT系统下,和win98不同,需要调整本进程的权限。
主要代码如下:

void EnableDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return;
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
{
CloseHandle( hToken );
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
CloseHandle( hToken );
}

本程序源代码下载:

点击下载此文件