首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

InitiateSystemShutdown()函数""远程""关机有关问题(!)

2012-01-21 
InitiateSystemShutdown()函数远程关机问题(求助!!!!)InitiateSystemShutdown在条件许可的时候可以关

InitiateSystemShutdown()函数""远程""关机问题(求助!!!!)
InitiateSystemShutdown在条件许可的时候可以关闭指定的计算机。      
    要关闭本地机器,调用进程必须具有SE_SHUTDOWN_NAME特权;要关闭远程机器,调用进程必须具有SE_REMOTE_SHUTDOWN_NAME特权。      
    缺省的,用户可以使他登陆到的对本地机器的SE_SHUTDOWN_NAME特权有效,管理员可以使SE_REMOTE_SHUTDOWN_NAME特权有效。    

问题一:如何得到   SE_REMOTE_SHUTDOWN_NAME   特有权限????
       
    在调用InitiateSystemShutdown之前必须先使对应的特权有效,见如下源代码:      
       
    HANDLE       hToken;          
    TOKEN_PRIVILEGES       tkp;      
       
    //得到进程权标      
    if       (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES       and       TOKEN_QUERY,&hToken))      
    return;      
    //得到关机的特权的LUID      
    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);      
           
    //不应该只是测试AdjustTokenPrivileges的返回值      
    if       (GetLastError()       !=       ERROR_SUCCESS)      
        return;      
    调用AbortSystemShutdown()也要做一样的准备工作`。

//见这句     LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);      
也只是得到本机的吧!!!
问题是我想在局域网中远程关闭另一台主机.在那台主机上没有装任何程序.

在网上搜了一下这个.
//登录用户,取得访问令牌
  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   );


问题二:能否解释一下上述代码?

上述代码得到了SE_REMOTE_SHUTDOWN_NAME   特有权限吗?


不知道哪位高手有实现了远程关机的源码给指教一下?


[解决办法]
Details see MSDN in Platform SDK: Security
不过remote shutdown似乎在xp2下无效哦.
[解决办法]
呵呵,专业做关机,以前旧版本用那个函数,现在不用了,而且也没有太深入了解,不好意思...


============================================================
最新自动计时定时开关机的软件 Timer Explorer 6.0 发布
下载主页: http://www.timeearth.com
============================================================

热点排行