1. 将数据转换过程写为service
这是最通用的方法,方法是将数据转换的线程转移到service中。当需要进行数据转换时,由utility通知service对需要加解密的卷进行数据转换。
这个方法实现起来改动幅度相对较大,并且要实现进程间的通信,需要学习相应的进程间通信的方法。
2. 使用local system account 来打开该应用程序
1) 使用psexec以local system account打开
这个方法是在 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这种方法。 因篇幅问题不能全部显示,请点此查看更多更全内容