1,979
社区成员
发帖
与我相关
我的任务
分享
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
WriteLog("启动服务", "Monitor");
}
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
WriteLog("服务停止", "Monitor");
}
public int RunTask()
{
//MessageBox.Show(string.Format("重启Monitor_Task服务"));
WriteLog("开始重启Task程序","Monitor");
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "Task1.exe";
info.WorkingDirectory = @"C:\Users\Administrator\Documents\Visual Studio 2005\Projects\Task1\Task1\bin\Debug\";
info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
Process proc_satrt = new Process();
proc_satrt.StartInfo = info;
try
{
proc_satrt.Start();
Thread.Sleep(500);
}
catch (Exception ex)
{
WriteLog(string.Format("重启Task出现错误,错误原因:{0}__{1}",ex.Message,ex.StackTrace),"Monitor");
}
Process[] proc_task = Process.GetProcessesByName("Task1");
if (proc_task != null || proc_task.Length > 1)
{
WriteLog("重启Task程序成功", "Monitor");
return proc_task.Length;
}
else
{
WriteLog("重启Task程序失败", "Monitor");
}
return 0;
}
private void timer2_ElapsedEventHandler(object sender, ElapsedEventArgs e)
{
Monitor();
}
public void Monitor()
{
while (true)
{
//Process[] collection = Process.GetProcesses();
//foreach (Process proc in collection)
//{
// WriteLog(proc.Id.ToString()+"__"+proc.ProcessName+"__"+proc.Handle.ToString()+"__","Monitor");
//}
//WriteLog("执行timer1","Monitor");
string Task_pro_name = "Task1";
Process[] pros = Process.GetProcessesByName(Task_pro_name);
if (pros != null && pros.Length > 0)
{
foreach (Process pro in pros)
{
//MessageBox.Show(string.Format("获取线程:{0}",pro.Id.ToString()));
WriteLog(string.Format("获取线程:{0}___{1}", pro.Id.ToString(), pro.ProcessName),"Monitor");
int int_th = pro.Threads.Count;
int int_thcount = pro.Threads.Count;
//获取进程的线程组
System.Diagnostics.ProcessThreadCollection threads = pro.Threads;
foreach (ProcessThread th in threads)
{
if (th.ThreadState == System.Diagnostics.ThreadState.Unknown)
{
--int_th;
}
if (int_th < int_thcount) //发现有线程死掉,结束所有线程
{
pro.Kill();
pro.CloseMainWindow();
}
}
}
}
else
{
//启动Task程序
RunTask();
}
Thread.Sleep(30000);
}
}
public void WriteLog(string contex,string type)
{
string contring = "Server=LocalHost;Integrated Security=SSPI;Database=DMP";
SqlConnection sqlcon = new SqlConnection(contring);
string sqlstring = "insert into MonitorServiceLog(M_content,M_type,M_time) values(@contex,@type,GETDATE())";
SqlCommand sqlcom = new SqlCommand(sqlstring, sqlcon);
try
{
if (sqlcon.State == ConnectionState.Closed)
{
sqlcon.Open();
}
sqlcom.Parameters.Add("@contex", SqlDbType.NVarChar, 500).Value = contex;
sqlcom.Parameters.Add("@type", SqlDbType.NVarChar, 20).Value = type;
sqlcom.ExecuteNonQuery();
}
catch (Exception ex)
{
}
finally
{
sqlcon.Close();
sqlcom.Dispose();
}
}
}
1.在服务程序安装时编程实现,ProjectInstaller.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
//using System.Linq;
using Microsoft.Win32; //对注册表操作一定要引用这个命名空间
namespace MonitorService
{
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
//this.Context.Parameters["ServerCode"].ToString(); // 读取安装时输入的服务器编号
}
private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
//设置允许服务与桌面交互
SetServiceTable("MonitorService");
}
/// <summary>
/// 设置允许服务与桌面交互 ,修改了注册表,要重启系统才能生效
/// </summary>
/// <param name="ServiceName">服务程序名称</param>
private void SetServiceTable(string ServiceName)
{
RegistryKey rk = Registry.LocalMachine;
string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
RegistryKey sub = rk.OpenSubKey(key, true);
int value = (int)sub.GetValue("Type");
sub.SetValue("Type", value | 256);
}
}
}
2.注册表修改
onstart的时候修改注册表
[HKEY_LOCAL_MACHINE"SYSTEM"CurrentControlSet"Services"你的服务名]
"Type"=dword:00000010
key value+256
比如现在00000010是16+256=272
16精制就是00000110
3.SC程序修改, 允许与桌面进行交互
在dos命令提示符下输入:
sc config MonitorService type= interact type= own
回车即可。
可以用批处理的方式实现,把下面代码保存为 myservice.bat 即可:
rem 配置服务程序为允许与桌面进行交互方式
@echo "准备停止服务程序..."
sc stop MyService
@echo "设置允许与桌面进行交互方式允许"
sc config MyService type= interact type= own
@echo "正在重新启动服务..."
sc start MyService
@echo "启动服务成功!"
取消“允许与桌面进行交互”
DOS命令提示符下运行下面语句即可:
sc config MyService type= own
经测试:1,2 可以选中“允许与桌面进行交互”,但启动服务的时候,不能弹出应用程序的界面。
3 可以完美实现所有要求。
原帖地址:http://bbs.csdn.net/topics/360173492