有关WINDOWS服务程序,轻松注册Exe程序为Windows系统服务

来源:互联网 发布:徐水政府网络互动平台 编辑:程序博客网 时间:2024/05/23 00:03

有关WINDOWS服务程序

楼主Cassati(渴望突破)2005-12-29 21:58:14 .NET技术 / C# 提问

我想在服务程序里启动外部程序,启动是启动了,在资源管理器里可以看到,但是却看不到外部程序的界面啊??  
   
 
是不是WINDOWS服务程序不支持显示外部程序?(有这种说法吗?晕)  
   
 
比如说:     我在我的“WINDOWS服务程序里启动了CALC.EXE,虽然任务管理器里有了CALC.EXE的进程,但是我却看不到CALC.EXE的界面啊?  
   
 
欢迎大家讨论!顶者有分 问题点数:100、回复次数:12Top

1 mmclConstor回复于 2005-12-29 22:21:16 得分 20

我试了一下,可以启动的,并且有程序界面.  
 
不知你是怎么启动的,把代码发上来吧.Top

2 zwfhome1(任由风吹)回复于 2005-12-29 22:26:56 得分 10

把代码发出来吧Top

3 Cassati(渴望突破)回复于 2005-12-29 22:44:26 得分 0

System.Diagnostics.ProcessStartInfo   Info   =   new   System.Diagnostics.ProcessStartInfo();  
   
  Info.FileName   =   "notepad.exe";  
  Info.WorkingDirectory   =   "C://";  
   
  System.Diagnostics.Process   Proc   ;  
  Proc   =   System.Diagnostics.Process.Start(Info);  
  Proc.WaitForExit();  
   
   
 
就是这个了,同样这段代码,在WINFORM程序里可以正常显示,但是到服务里就不行  
   
  Top

4 mmclConstor回复于 2005-12-29 23:16:42 得分 0

我把你的代码拷到我新建的工程里面,编译直接运行,还是能出来记事本窗口的.我用的是windows   2000   server   ,vs2005.  
   
 
如下:  
  using   System;  
  using   System.Collections.Generic;  
  using   System.ComponentModel;  
  using   System.Data;  
  using   System.Diagnostics;  
  using   System.ServiceProcess;  
  using   System.Text;  
   
   
  namespace   WindowsService1  
  {  
          public   partial   class   Service1   :   ServiceBase  
          {  
                  public   Service1()  
                  {  
                          InitializeComponent();  
                          System.Diagnostics.ProcessStartInfo   Info   =   new   System.Diagnostics.ProcessStartInfo();  
   
                          Info.FileName   =   "notepad.exe";  
                          Info.WorkingDirectory   =   "C://winnt//";  
   
                          System.Diagnostics.Process   Proc;  
                          Proc   =   System.Diagnostics.Process.Start(Info);  
                          Proc.WaitForExit();  
   
                  }  
   
                  protected   override   void   OnStart(string[]   args)  
                  {  
                           
   
                  }  
   
                  protected   override   void   OnStop()  
                  {  
                          //   TODO:   Add   code   here   to   perform   any   tear-down   necessary   to   stop   your   service.  
                  }  
          }  
  }  
  Top

5 Sunmast(速马@Redmond, WA回复于 2005-12-30 04:40:04 得分 30

service   ->   property   ->   log   on   ->   allow   this   service   to   interact   with   desktopTop

6 mumuliangCR苏杭)回复于 2005-12-30 09:31:31 得分 30

你需要在服务管理器里面,右键查看yourService的属性,在登陆页中选中允许服务与桌面交互  
   
  Top

7 Cassati(渴望突破)回复于 2005-12-30 12:40:49 得分 0

我按照楼上两位的设置,可是还是弹不出来啊  
 
倒是可以弹个对话框,  
   
 
我用的是WIN   2000   SERVERvs2003Top

8 Cassati(渴望突破)回复于 2005-12-30 12:45:20 得分 0

郁闷啊郁闷  
   
  Top

9 JackFure(魔鬼的眼睛)回复于 2005-12-30 13:59:39 得分 0

不要使用SYSTEM权限,   使用你当前的登录帐号来运行服务Top

10 Cassati(渴望突破)回复于 2005-12-30 14:52:07 得分 0

回楼上的,我按照你说的可还是不行啊Top

11 Cassati(渴望突破)回复于 2005-12-30 20:44:06 得分 0

太开心啦,终于可以啦,感谢各位的帮忙哈~  
   
 
是这样的,安装完服务后,得先在属性里面把允许服务与桌面交互给选上,然后在启动服务!!!  
   
   
 
如果先启动服务,再把允许服务与桌面交互给选上,那么还是弹不出程序窗口!!  
   
 
不知道是不是都这样的!!  
   
 
大家再试试看吧,晚上回宿舍前结帖!  
  Top

12 mumuliangCR苏杭)回复于 2005-12-31 10:02:23 得分 10

可能是我们说的太不详细了,没告诉你要先设置属性后启动。(-v-!!!)

 

 

 

 

 

 

轻松注册Exe程序为Windows系统服务

前几天搞那个邮件接口的程序,用到一个叫1st smtp server的程序来做smtp服务器,但这个东西是不支持以服务方式运行的,又不能像java一样使用java service wrapperGoogle了几个小时,看到有介绍用sc.exe注册系统服务的文章,但压根就不能用,新添加的服务怎么也启不来,有说要改注册表的,又说了半天也说不清楚。后来发动鸡肉搜索引擎,帮我找到篇比较靠谱的文章《把EXE文件注册成服务的方法》,介绍了使用Windows 2000 Resource Kit Tools中两个小程序Instsrv.exeSrvany.exe可以达到目的,虽然找这两个程序又花了很久,但最终还是搞定了。

该文提到的步骤比较繁琐,原理大概是以Srvany.exe作为一个shell来启动其它的exe程序作为服务,Instsrv.exe是配合注册服务用的,作为服务的程序路径要记在注册表里。我在实施的时候顺便结合了一下新学习到的sc.exe,为该服务更改了启动方式,并修改描述内容。

为了方便和我有同样想法的人,干脆写了个批处理脚本,一步实现停止->删除->注册->启动的功能,包括生成注册表文件并导入。

    * 脚本内容如下:


@echo off

::设置服务名称
set service_name=smtpsvr

::设置服务描述
set service_description=1st smtp server
服务

::设置服务程序路径
::set prog_path2=E:/test2/UpdateRegistryDate.exe
set prog_path2=UpdateRegistryDate.exe

::设置服务的启动方式 auto:自动 demand:手动 disabled:禁用
set strt=auto

::当前目录是
set prog_path=%~d0/%~p0/%prog_path2%


echo                     EasyService
一键服务
echo ===========================================================
::pause
::======================
以下部分勿随意修改==========================
echo
当前目录是:%prog_path%

set s32=%windir%/system32
set reg_file=EasyService.reg

net stop %service_name% 2>nul
copy instsrv.exe %s32%
copy srvany.exe %s32%

%s32%/instsrv.exe %service_name% remove 2>nul
%s32%/instsrv.exe %service_name% %s32%/srvany.exe >nul

::设置服务的启动方式 auto:自动 demand:手动 disabled:禁用
sc config %service_name% start= %strt%
sc description %service_name% "%service_description%"

echo 生成注册表文件...
echo Windows Registry Editor Version 5.00 > %reg_file%
echo [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/%service_name%/Parameters] >> %reg_file%
echo "Application"="%prog_path%" >> %reg_file%

echo 导入注册表文件...
%reg_file%

net start %service_name%
echo ===========================
完成============================
pause


    *
使用方法:

修改脚本中service_nameservice_descriptionprog_pathstrt4个变量的内容,分别设置为服务名、功能描述、程序路径、启动方式,保存后运行脚本,弹出是否导入注册表,选是,大功告成,已在winxpwin2k下测试通过。