这篇文章贡献自: 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);
}
}