log off时应用程序不退出的2种解决办法
2010-11-01 16:57
211 查看
最近公司开发一个加密的项目,客户要求在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. 将数据转换过程写为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
这种方法。
相关文章推荐
- QMessageBox在系统托盘状态下确定后退出应用程序的解决办法
- 关于“打开项目**时发生问题,尝试退出并重新启动应用程序。如果问题仍然存在,则可能是由于正在使用不支持的项目版本,或者项目文件可能损坏”的问题的解决办法。
- QMessageBox在系统托盘状态下确定后退出应用程序的解决办法
- 关于”因为此版本的应用程序不支持其项目类型(.csproj)“错误的解决办法
- 关于win xp sp2 , rational rose 2003 退出报错"MEM_BAD_POINTER"的解决办法
- 关于安装.Net Framework 安装失败回滚退出的解决办法
- resgen.exe 已退出 代码为 1073741701的错误的解决办法
- 若要运行应用程序,您必须首先安装 .NET Framework 4.0 解决办法
- 无法在Web服务器上启动调试,您不具备调试此应用程序的权限 解决办法,此项目的URL位于Intenet区域
- android程序点击返回退出时,返回到欢迎界面的解决办法
- Code=3000 "未找到应用程序的“aps-environment”的权利字符串" 解决办法
- "创建控件时出错/lm/w3svc/... 不是一个有效的iis应用程序" 的解决办法
- ORA-01950 表空间'USERS'中无权限的2种解决办法
- Docker 容器操作退出后进入解决办法
- WIN7 64中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法
- VS2005 2008 2010 F5 调试自动退出解决办法
- 项目所需的应用程序未安装,确保已安装项目类型(.csproj)的应用程序的解决办法[转]
- Qt5 中使用了QQuickWidget,程序退出时容易崩溃的解决办法。
- ACE应用程序链接错误 error LNK2019 的解决办法
- Direct Show 应用程序某个编译错误的解决办法