搜索
您的当前位置:首页正文

log off后程序不退出的两种解决方法及实现

2022-04-25 来源:步旅网
Logoff后程序不退出的两种解决方法及简单实现

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

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

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

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

1) 使用psexec以local system account打开

这个方法是在一书里面看到的,里面是使用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也可以自己编程实现以local 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讲解如下:

1. 启动一个名为RunAsSystem的windows service 2. 在该service中,查找程序winlogon.exe,并获得该进程的令牌(winlogon.exe就运行在local system account下) 3. 在service中,复制令牌,并调用 CreateProcessAsUser以该令牌来启动我们要打开的应用程序 4. 停止service 之所以要启动service的原因是,在当前用户(Administrator)权限下,没法得到包含复制等权限的winlogon.exe的 令牌,所以必须借助service,因为service正是运行在local system account下的。 通过实验,这个方法仍然存在一定问题:

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

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

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top