有关WINDOWS服务程序
楼主Cassati(渴望突破)2005-12-29 21:58:14 在 .NET技术 / C# 提问
我想在服务程序里启动外部程序,启动是启动了,在资源管理器里可以看到,但是却看不到外部程序的界面啊??
是不是WINDOWS服务程序不支持显示外部程序?(有这种说法吗?晕)
比如说: 我在我的“WINDOWS服务程序”里启动了CALC.EXE,虽然任务管理器里有了CALC.EXE的进程,但是我却看不到CALC.EXE的界面啊?
欢迎大家讨论!顶者有分 问题点数:100、回复次数:12Top
1 楼mmcl(Constor)回复于 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 楼mmcl(Constor)回复于 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 楼mumuliang(CR苏杭)回复于 2005-12-30 09:31:31 得分 30
你需要在服务管理器里面,右键查看yourService的属性,在登陆页中选中“允许服务与桌面交互”。
Top
7 楼Cassati(渴望突破)回复于 2005-12-30 12:40:49 得分 0
我按照楼上两位的设置,可是还是弹不出来啊
倒是可以弹个对话框,
我用的是WIN 2000 SERVER,vs2003Top
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 楼mumuliang(CR苏杭)回复于 2005-12-31 10:02:23 得分 10
可能是我们说的太不详细了,没告诉你要先设置属性后启动。(-v-!!!)
轻松注册Exe程序为Windows系统服务
前几天搞那个邮件接口的程序,用到一个叫1st smtp server的程序来做smtp服务器,但这个东西是不支持以服务方式运行的,又不能像java一样使用java service wrapper。Google了几个小时,看到有介绍用sc.exe注册系统服务的文章,但压根就不能用,新添加的服务怎么也启不来,有说要改注册表的,又说了半天也说不清楚。后来发动鸡肉搜索引擎,帮我找到篇比较靠谱的文章《把EXE文件注册成服务的方法》,介绍了使用Windows 2000 Resource Kit Tools中两个小程序Instsrv.exe和Srvany.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_name、service_description、prog_path、strt这4个变量的内容,分别设置为服务名、功能描述、程序路径、启动方式,保存后运行脚本,弹出是否导入注册表,选是,大功告成,已在winxp及win2k下测试通过。