如何用VC++控制WindowsNT重启?

zzc 2000-03-01 09:56:00
  调用ExitWidnowsEx可正常重启Windows9x,但对于WindowsNT需要对进程

权限进行调整,MSDN里面虽然有,但没有实例,看不明白。有没有哪位对此比较

了解的,给出几行实例,先谢谢了!
...全文
111 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lu0 2000-03-01
  • 打赏
  • 举报
回复
其他详情见http://lu0.126.com
也就是我:)
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#pragma hdrstop



BOOL SetCurrentPrivilege( LPCTSTR Privilege, BOOL bEnablePrivilege );
void DisplayError( DWORD err );



int main( int argc, char * argv[] )
{
int i, errors = 0, local = 0, timeout = -1, force = 0, reboot = 0, oops = 0;
char *remote = NULL, *message = NULL;
BOOL rc;

if ( argc == 1 )
{
usage:
if ( errors )
putchar( '\n' );
puts( "reboot {-l and -s servername} [-m \"message\"] [-t timeout] [-f] [-r] [-oops]\n" );
puts( "-l reboot local machine" );
puts( "-s servername reboot named computer" );
puts( "-t timeout show a logoff dialog for <timeout> seconds; 0 suppresses it" );
puts( "-m \"message\" display \"message\" in that dialog" );
puts( "-f force apps closed" );
puts( "-r reboot after shutdown" );
puts( "-oops aborts a previous shutdown request (only -l, -s count)" );
return 1;
}

for ( i = 1; i < argc; i ++ )
{
if ( *argv[i] != '-' && *argv[i] != '/' )
{
printf( "\"%s\": switches must start with a '-' or '/' character.\n", argv[i] );
errors ++;
continue;
}

++ argv[i];
switch ( *argv[i] )
{
case 'l':
if ( remote != NULL and and local != 0 )
{
puts( "Only one of -l and -s may be used." );
++ errors;
}
else
++ local;
break;
case 's':
if ( remote != NULL and and local != 0 )
{
puts( "Only one of -l and -s may be used." );
++ errors;
}
else if ( i == argc - 1 )
{
puts( "-s must be followed by the name of the server to shut down." );
++ errors;
}
else
{
++ i;
remote = argv[i];
}
break;
case 't':
if ( timeout != -1 )
{
puts( "Only one timeout may be used." );
++ errors;
}
else if ( i == argc - 1 )
{
puts( "-t must be followed by a timeout." );
++ errors;
}
else
{
++ i;
timeout = atoi( argv[i] );
}
break;
case 'm':
if ( message != NULL )
{
puts( "Only one message may be used." );
++ errors;
}
else if ( i == argc - 1 )
{
puts( "-m must be followed by the message text." );
++ errors;
}
else
{
++ i;
message = argv[i];
}
break;
case 'f':

if ( force )
{
puts( "-f may only be used once." );
++ errors;
}
else
++ force;
break;
case 'r':
if ( reboot )
{
puts( "-r may only be used once." );
++ errors;
}
else
++ reboot;
break;
case 'o':
++ oops;
break;
default:
printf( "\"%s\" is not a valid switch.\n", argv[i] - 1 );
++ errors;
break;
}
}

if ( local == 0 && remote == NULL )
{
puts( "One of -l and -s must be used." );
++ errors;
}

if ( ! oops && timeout == -1 ) // no timeout used
{
puts( "Anti-goof feature: you must specify a timeout (0 seconds is OK)" );
++ errors;
}

if ( errors )
goto usage;

if ( local )
{
if ( ! SetCurrentPrivilege( SE_SHUTDOWN_NAME, TRUE ) )
{
DisplayError( GetLastError() );
return 2;
}
}

if ( oops )
{
printf( "\nTrying to abort the shutdown of %s ...", remote? remote: "this computer" );
rc = AbortSystemShutdown( remote );
}
else
{
printf( "\nTrying to shut down %s in %d seconds ...", remote? remote: "this computer", timeout );
rc = InitiateSystemShutdown( remote, message, (DWORD) timeout, force, reboot );
}

putchar( '\n' );

if ( ! rc )
{
DisplayError( GetLastError() );
return 1;
}

return 0;
}



BOOL SetCurrentPrivilege( LPCTSTR Privilege, BOOL bEnablePrivilege )
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tp, tpPrevious;
DWORD cbPrevious = sizeof( TOKEN_PRIVILEGES );
BOOL bSuccess = FALSE;

if ( ! LookupPrivilegeValue( NULL, Privilege, &luid ) )
return FALSE;

if( ! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY and TOKEN_ADJUST_PRIVILEGES, &hToken ) )
return FALSE;

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = 0;

AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof( TOKEN_PRIVILEGES ), &tpPrevious, &cbPrevious );

if ( GetLastError() == ERROR_SUCCESS )
{
tpPrevious.PrivilegeCount = 1;
tpPrevious.Privileges[0].Luid = luid;

if ( bEnablePrivilege )
tpPrevious.Privileges[0].Attributes and = ( SE_PRIVILEGE_ENABLED );
else
tpPrevious.Privileges[0].Attributes &= ~( SE_PRIVILEGE_ENABLED );

AdjustTokenPrivileges( hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL );

if ( GetLastError() == ERROR_SUCCESS )
bSuccess=TRUE;
}

CloseHandle( hToken );

return bSuccess;
}



void DisplayError( DWORD err )
{
char msgbuf[4096];

FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT),
msgbuf, sizeof( msgbuf ), NULL );
printf( "Error %d: %s\n", err, msgbuf );
}

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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