我有好多根据一些桌面程序改编的自动化程序,一直运行Windows服务器上。程序太大了,而且是Win32的C++写的,要转换成服务程序需要花很大工夫。终于发现了有个叫做srvany的程序,是Windows Resource Kit的一部分,能把程序简单地转换服务运行。步骤如下:


必须用管理员执行


1,安装好Windows Resource Kit(据说Windows server 2008不在支持中,不过试了后没有问题)

安装路径 C:\ResourceKit

2,运行 C:\ResourceKit\INSTSRV.EXE MyService C:\ResourceKit\SRVANY.EXE

3,运行 regedit

找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService

新建一个Key 叫 Parameters

在Parameters中

新建一个Value AppDirectory 指向应用程序的目录

新建一个Value Application 指向应用程序

新建一个Value AppParameters 列出运行参数


执行,没有问题。在公司规定的会话时效终结之后,可以看到程序仍然正常活着。


其实根据资料,Windows server 2008只是把Session 0给隐藏起来了,即使在RDP中使用-admin也只是连接到普通远程会话。在普通远程会话中通过下列命令可以连接到0会话:


rundll32.exe winsta.dll,WinStationSwitchToServicesSession


但是这个命令好象没有什么用。因为如果0会话只有在发现有交互式服务时才会显示,显示的只是服务程序的窗口,没有系统桌面。


有一个非常tricky的方式可以让远程会话在连接终止后不被杀死。在用远程桌面登录后,打开命令行,执行以下命令:


query session


打印出当前所有会话,找到自己的会话id, 譬如说是2,然后执行:


tscon 2 /dest:console


据说此命令可以把当前会话转向到console上,就不会被杀死了.试验了一下有效果.