log off时应用程序不退出的2种解决办法

     最近公司开发一个加密的项目,客户要求在log off以后加密过程不能停止,即数据转换过程必须还要继续。之前的程序是用MFC写的,为了最小化工作量,我做了一些调研,大致找到有两种办法。

 

1. 将数据转换过程写为service

 

     

这是最通用的方法,方法是将数据转换的线程转移到service 中。当需要进行数据转换时,由AP通知service 对需要加解密的目标进行数据转换。

这个方法实现起来改动幅度相对较大,并且要实现进程间的通信,需要学习相应的进程间通信的方法。

 

2. 使用local system account 来打开该应用程序

 

   

      1) 使用 psexec local system account 打开

    

   这个方法是在 <Windows Internal> 一书里面看到的,里面是使用 Sysinternal 开发的工具 psexec ,通过命令行可以将任意应用程序以系统账户打开。在 XP 下实验该工具确实可行,但是,这个方法存在一定问题:

     1. 如果原有应用程序存在更新进度条等界面工作,那么在 log off 后,程序界面部分会挂掉,具体表现为 log in 后整个界面近乎死掉, cpu 占用率 100% ,但是主管数据转换的线程扔在工作。如果将程序改写为 console 模式的,则不会出现问题。这里初步怀疑是由于 log off 后, windows 消息机制被死锁导致。

     2. Vista 之后的系统上会出现问题兼容性问题,通过 psexec notepad local system account 登陆,程序会出现在不一样的一个 session 里面,需要手动切换才能看到,同时 log off log in 后,该 session 不再可见, notepad 被关闭。

 

2) 使用 Windows API : CreateProcessAsUser

 

如果不借助诸如 psexec 的外部工具,使用 CreateProcessAsUser 这个 Windows API 也可以自己编程实现以 l ocal system account 来打开该应用程序

psexec 里面不知道是否是使用这个 API 来实现的,但是我在网上找到了一个以该 API 实现的软件: Run As System http://www.qwertylab.com/FreeTools.aspx

      通过对 RunAsSystem 进行反编译,同时参考网页如下网页:

http://www.codeproject.com/KB/vista-security/VistaSessions.aspx 该网页的中文翻译在此:

http://blog.csdn.net/xieqidong/archive/2008/09/16/2936771.aspx

     

  了解了程序的大致步骤,下面以 RunAsSystem 讲解如下:

 

 

      启动一个名为RunAsSystem的windows service

 

->  在该service中,查找程序winlogon.exe,并获得该进程的令牌(winlogon.exe就运行在local system account下)

 

->  在service中,复制令牌,并调用 CreateProcessAsUser以该令牌来启动我们要打开的应用程序

 

->  停止service

 

      之所以要启动service的原因是,在当前用户(Administrator)权限下,没法得到包含复制等权限的winlogon.exe的令牌,所以必须借助service,因为service正是运行在local system account下的。

   

     通过 RunAsSystem 进行 实验,这个方法 仍然存在一定问题:

 

1. Log off 后界面死掉的问题仍然存在。

2. Vista 后系统上测试,发现虽然不存在上面 psexec 有的兼容性问题,但 log off 后程序仍然退出,并不能达到我们需要的目的。

 

在实际工作中,可以按照自己的需要来选择,如果只是做 XP 下的控制台程序,可以选择 local system account 这种方法。

 

 

 

 


 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值