为什么不能控制系统重起?

jingling76 2007-03-29 12:47:41
我在logon下注入了一个dll,在logon的时候弹出窗口进行重起操作,部分代码如下:
HINSTANCE hInst = LoadLibrary("shell32.dll");

SHUTDOWNDLG ShutDownDialog;
if(hInst != NULL)
{
ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
(*ShutDownDialog)(0);
}
FreeLibrary(hInst);
为什么点击之后,系统返回到登录界面。如果登录系统的话,会提示系统正在关闭。
...全文
330 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingling76 2007-03-30
  • 打赏
  • 举报
回复
问题解决,权限释放。
jingling76 2007-03-30
  • 打赏
  • 举报
回复
SE_SHUTDOWN_NAME已经被设定了,可是重起的话,系统将死在正在用户设置的画面。
但是,相同的代码如果是正常进入windows之后被执行的话就会正常重起。
现在的要求是,在安全模式下,登录系统,输入完用户密码后再次弹出一个窗口(此时系统还没有被完全启动,即系统桌面还没有出现)进行系统重起。我现在是在注册表中Winlogon/Notify下增加了一个key,StartShell时,调用重起功能的函数。
我的代码如下:
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

if ( !OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
AfxMessageBox ( "Can't Restart.OpenProcessToken" );
return ;
}

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), (PTOKEN_PRIVILEGES)NULL, NULL);

if (GetLastError() != ERROR_SUCCESS) {
AfxMessageBox ( "Can't Restart.AdjustTokenPrivileges");
::CloseHandle(hToken);
}

if (!ExitWindowsEx(EWX_LOGOFF | EWX_REBOOT | EWX_FORCE, 0 )) {
AfxMessageBox ( "Can't Restart.ExitWindowsEx");
}
蒋晟 2007-03-30
  • 打赏
  • 举报
回复
Error 53 is ERROR_BAD_NETPATH ("The network path was not found."). So, if you specified machine name, then you should have SE_SHUTDOWN_NAME/SE_REMOTE_SHUTDOWN_NAME priviledge.

jingling76 2007-03-30
  • 打赏
  • 举报
回复
权限设定了
GetLastError()是53
提升优先级?
palmax 2007-03-29
  • 打赏
  • 举报
回复
把 GetLastError()的内容FormatMessage出来看看是什么原因,调用ShutdownDlg或是ExitWindowsEx效果是一样的,估计是权限问题
handsomerun 2007-03-29
  • 打赏
  • 举报
回复
自动关机和自动重起的代码网上好像很多的呀

如果是xp,winnt这种系统
记得提升优先级就可以了,
jingling76 2007-03-29
  • 打赏
  • 举报
回复
上面的代码在进入windows桌面后执行并没有什么问题,我试验过了。
但是dll注入到winlogon里面后,此时windows桌面还没有出现,只是在登录后就弹出窗口进行系统重起或关闭,调用以上功能代码却不能正常的重起或关闭系统。
rd828 2007-03-29
  • 打赏
  • 举报
回复
lz参考一下这段关机的代码

//////////////////
BOOL CAutoshutdownDlg::MySystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;


// Get a token for this process.


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


// 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, 0,
(PTOKEN_PRIVILEGES)NULL, 0);


if (GetLastError() != ERROR_SUCCESS)
return FALSE;


// Shut down the system and force all applications to close.


if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
0x00020000 |
0x00000003 |
0x80000000))
return FALSE;


return TRUE;
}
jingling76 2007-03-29
  • 打赏
  • 举报
回复
结果,结果,没有结果!
jingling76 2007-03-29
  • 打赏
  • 举报
回复
进入系统后,以上的方法没有问题,但是在系统桌面出现之前弹出窗口进行重起却还是没有效果
happyness44 2007-03-29
  • 打赏
  • 举报
回复
if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken ) )
goto FAILED_MESSAGE;

TOKEN_PRIVILEGES tkp;
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 )
goto FAILED_MESSAGE;


if ( ! InitiateSystemShutdown( NULL, strInfo,0, TRUE, bRestart ) )
goto FAILED_MESSAGE;
jingling76 2007-03-29
  • 打赏
  • 举报
回复
我已经设定了权限,而且GetProcAddress可以被执行,只是在点击执行重起的死后没有什么反应
CathySun118 2007-03-29
  • 打赏
  • 举报
回复
GetProcAddress函数和操作系统有关,lz什么操作系统。
有些操作系统需要先调用设置权限级别的api
jingling76 2007-03-29
  • 打赏
  • 举报
回复
自己再顶一次
jingling76 2007-03-29
  • 打赏
  • 举报
回复
顶上去,100分啊~

16,472

社区成员

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

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

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