windows service 与GUI窗口的实现

以前做过几次windows service,但都是没有界面的,想配置参数都只能使用文本文件,然后重启服务才行,而且不能查看服务的运行状态。
最近在网上找到一些文章,终于找到可以启动服务时有界面的方法。
首先服务工程中本身不能有窗体,这是WINDOWS系统本身不支持的。因此必须要有两个工程才能实现,一是服务程序,另一个是GUI程序。
当服务程序启动时通过代码启动GUI程序,从而实现自动启动GUI程序,并且有界面展示。为了能让服务程序能与GUI程序通信,可以在服务程序中建立一个TCP server,
GUI程序中建立一个tcp client,这样两个程序之间即可实现通信。
要使服务程序能打开GUI程序,并在窗口中显示出来,必须在安装服务之后设置其启动帐号为”本地系统帐号“且“允许与桌面交互”。
而”本地系统帐号“这项可以在服务程序开发时设置,而“允许与桌面交互”必须要使用另外的途径实现,请参考下面的代码。

具体步骤:
先建立一个WINFORM 程序。
然后再建立一个windows service project. (具体操作不在此说明)。
在serviceInstaller1_Committed事件中添加如下代码:

 ConnectionOptions coOptions = new ConnectionOptions();
            coOptions.Impersonation = ImpersonationLevel.Impersonate;
            ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions);

            mgmtScope.Connect();
            ManagementObject wmiService;
            wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");

            ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");

            InParam["DesktopInteract"] = true;

            ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);
此段代码即是将此Service设置为“允许与桌面交互”,有了此选项之后,服务启动时GUI程序的界面将会出现。

编译之后,将gui程序放在合适的位置,安装服务,并设置为自启动服务,针对windows2000/xp系统,启动服务时将会出现GUI程序的界面,如果调用没有出错的话。

要注意的是在windows 2003上启动服务时界面可能不会出现(虽然在服务管理器中“允许与桌面交互”已经勾上),但程序已经在运行(通过任务管理器查看)。
有两个解决办法,一是重启机器;二是在“服务管理器”中手工重新设置一下“允许与桌面交互”,然后确定,此时再启动服务即可(其实未做任何修改,搞不懂MS的东西为什么会这样,跟踪了注册表,也没看到有变化)。

使用双进程实现服务和GUI的好处是,可以随时查看服务的状态,并且GUI程序当掉之后,服务程序可以自动将其启动,有点象木马了。

参考地址:
双进程实现示例,只是用的是VC++,难度有点大,可以直接使用其XLogOff.exe服务程序,只是需要把里面的XLGUI替换为你的GUI程序。当然,最好的方法是参考这个服务用C#重写,应该比较容易的。
http://www.codeproject.com/useritems/xlogoff.asp
中国人自己做的,将任何程序做成服务启动程序的工具:
http://www.codeproject.com/system/xyntservice.asp
另一个讲述如何自动设置“允许与桌面交互”选项的,未成功,不知重启之后是否有效。
http://www.codeproject.com/csharp/CsWindowsServiceDesktop.asp
另一篇说明如何设置“允许与桌面交互”选项的
http://www.dotnet247.com/247reference/msgs/36/184247.aspx

posted @ 2006-03-01 11:07  margiex  阅读(9881)  评论(7编辑  收藏  举报