透视远程关机过程

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 bugfree 的 blog


这篇文章贡献自: bugfree/csdn, 参考: www.codeguru.com
平台: vc6 windows xp(其它平台没有调试)

下面我就实现远程关机用到的函数做了简要的说明, 具体实现时要做类型检查, 详细参见后面的例子.
 函数具体信息可以参见csdn的解释.


// 用到的参数说明
//===============
    char *pname;   // 用户名
    char *pdomain; // 域名或远程计算机名(空为本地机)
    char *ppasswd; // 密码
    uint m_timeout;// 关机等待时的秒数

/*怎样实现远程关机*/
//===================
 //登录用户,取得访问令牌
 logonuser( pname, pdomain, ppasswd,logon32_logon_interactive,
  logon32_provider_default, &hlogontoken );
 // 复制访问令牌
 duplicatetokenex( hlogontoken, token_all_access, null,
  securityidentification, tokenprimary, &hadmintoken );
 
 impersonateloggedonuser( hadmintoken );
 // 打开关联于线程的访问令牌
 openthreadtoken( getcurrentthread(), token_adjust_privileges |
   token_query, true, &hthreadtoken );
 // 获得se_shutdown_name的luid
 lookupprivilegevalue( null, se_shutdown_name, &tkp.privileges[0].luid );
 // 设置访问令牌的属性
 tkp.privilegecount = 1;
 tkp.privileges[0].attributes = se_privilege_enabled;
 // 在此进程中得到关机特权
 adjusttokenprivileges( hthreadtoken, false, &tkp, 0, (ptoken_privileges)null, 0 );
 // 执行关机命令
 initiatesystemshutdown( premotename, pmessage, m_timeout, false, false );

 

实现:(参考www.codeguru.com的一个例子)
=================================
1. 创建关于对话框的应用程序
2. 在对话框类中加入, 并在构造函数中初始化
    cwinthread *m_pthread; // 用于存线程
    char *pname;   // 用户名
    char *pdomain; // 域名或远程计算机名(空为本地机)
    char *ppasswd; // 密码
    uint m_timeout;// 关机等待时的秒数
3. 在对话框上加入一个按钮,添加代码:
 m_pthread = afxbeginthread( shutdownthread, this );
4. 添加线程的实现码如下:
uint afx_cdecl cshutdwndlg::shutdownthread( lpvoid lpparam )
{
 handle hlogontoken;
 handle hadmintoken;
 handle hthreadtoken;
 token_privileges tkp;

 if( false == logonuser( pname, pdomain, ppasswd,
   logon32_logon_interactive,
   logon32_provider_default,
   &hlogontoken ) )
 { 
  assert(0);
 }
 if( false ==
  duplicatetokenex( hlogontoken, token_all_access, null,
   securityidentification, tokenprimary, &hadmintoken ) )
  assert(0);

 if( false == impersonateloggedonuser( hadmintoken ) )
  assert(0);

  if( false == openthreadtoken( getcurrentthread(),
  token_adjust_privileges | token_query, true, &hthreadtoken ) )
 {
  reverttoself();
  assert(0);
 }
 lookupprivilegevalue( null, se_shutdown_name, &tkp.privileges[0].luid );
 tkp.privilegecount = 1;
 tkp.privileges[0].attributes = se_privilege_enabled;
 adjusttokenprivileges( hthreadtoken, false, &tkp, 0, (ptoken_privileges)null, 0 );
 if( getlasterror() != error_success )
 {
  reverttoself();
  assert(0);
 }
   if( false ==
  initiatesystemshutdown( premotename, pmessage, pdlg->m_timeout, false, false ) )
 {
  reverttoself();
  assert(0);
 }
 
}   

本文关键:远程关机 特权操作
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top