问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用C#语言通过服务来实现开机启动?

发布网友 发布时间:2022-04-25 15:02

我来回答

5个回答

热心网友 时间:2023-10-10 16:57

很多开机启动程序仅仅加在启动项里面,只有登陆后才真正启动。windows服务在开机未进行用户登录前就启动了。正是利用这一点,解决一些服务器自动重启后特定软件也自动启动的问题。
1.新建一个服务项目 visual C#----windows----windows服务;
2.添加一个dataset(.xsd),用于存储启动目标的路径,日志路径等。
在dataset可视化编辑中,添加一个datatable,包含两列 StartAppPath 和 LogFilePath。分别用于存储目标的路径、日志路径。
*我认为利用dataset.xsd存储配置参数的优势在于可以忽略xml解析的具体过程直接使用xml文件。
在dataset中 提供了ReadXml方法用于读取xml文件并将其转换成内存中的一张datatable表,数据很容易取出来!同样,WriteXml方法用于存储为xml格式的文件,也仅仅需要一句话而已。
3. program.cs文件 作为程序入口,代码如下:
view plaincopy to clipboardprint?
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;

namespace WindowsServices_AutoStart
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;

// 同一进程中可以运行多个用户服务。若要将
// 另一个服务添加到此进程中,请更改下行以
// 创建另一个服务对象。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };

ServiceBase.Run(ServicesToRun);
}
}
}
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
// 同一进程中可以运行多个用户服务。若要将
// 另一个服务添加到此进程中,请更改下行以
// 创建另一个服务对象。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };
ServiceBase.Run(ServicesToRun);
}
}
}
4.service.cs主文件,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
public partial class WindowsServices_AutoStart : ServiceBase
{
public WindowsServices_AutoStart()
{
InitializeComponent();
}
string StartAppPath =""; //@"F:\00.exe";
string LogFilePath ="";// @"f:\WindowsService.txt";
protected override void OnStart(string[] args)
{
string exePath = System.Threading.Thread.GetDomain().BaseDirectory;
//
if (!File.Exists(exePath + @"\ServiceAppPath.xml"))
{
dsAppPath ds = new dsAppPath();
object[] obj=new object[2];
obj[0]="0";
obj[1]="0";
ds.Tables["dtAppPath"].Rows.Add(obj);
ds.Tables["dtAppPath"].WriteXml(exePath + @"\ServiceAppPath.xml");
return;
}
try
{
dsAppPath ds = new dsAppPath();
ds.Tables["dtAppPath"].ReadXml(exePath + @"\ServiceAppPath.xml");
DataTable dt = ds.Tables["dtAppPath"];
StartAppPath = dt.Rows[0]["StartAppPath"].ToString();
LogFilePath = dt.Rows[0]["LogFilePath"].ToString();
}
catch { return; }

if (File.Exists(StartAppPath))
{
try
{
Process proc = new Process();
proc.StartInfo.FileName = StartAppPath; //注意路径
//proc.StartInfo.Arguments = "";
proc.Start();
}
catch (System.Exception ex)
{
//MessageBox.Show(this, "找不到帮助文件路径。文件是否被改动或删除?\n" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
FileStream fs = new FileStream(LogFilePath, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("WindowsService: Service Started" + DateTime.Now.ToString() + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
fs.Close();
}
}
protected override void OnStop()
{
try
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
FileStream fs = new FileStream(LogFilePath, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("WindowsService: Service Stopped " + DateTime.Now.ToString() + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
fs.Close();
}
catch
{
}
}
}
}

5.启动调试,成功时也会弹出一个对话框大致意思是提示服务需要安装。
6.把Debug文件夹下面的.exe执行程序,安装为windows系统服务,安装方法网上很多介绍。我说一种常用的:
安装服务
访问项目中的已编译可执行文件所在的目录。
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil yourproject.exe
卸载服务
用项目的输出作为参数,从命令行运行 InstallUtil.exe。
installutil /u yourproject.exe
至此,整个服务已经编写,编译,安装完成,你可以在控制面板的管理工具的服务中,看到你编写的服务。
7.安装好了之后在系统服务列表中可以管理服务,这时要注意将服务的属性窗口----登陆----“允许于桌面交互”勾选!这样才能在启动了你要的目标程序后不单单存留于进程。在桌面上也看得到。
8.关于卸载服务,目前有两个概念:一是禁用而已;一是完全删除服务。 前者可以通过服务管理窗口直接完成。后者则需要进入注册表“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”找到服务名称的文件夹,整个删掉,重新启动电脑后,服务消失。
9.扩展思考:经过修改代码,还可以实现:启动目标程序之前,检测进程中是否存在目标程序,存在则不再次启动

热心网友 时间:2023-10-10 16:58

楼主,你好,你按照下面的方法做,一定成功。祝你愉快!
创建服务步骤:
1.先在VS中创建一个Windows服务的项目,在自动生成的service1.cs文件里添加如下语句:
//定义一个全局变量
string StartAppPath = @"C:\Program Files\QQb.exe"; 注释:该路径是你的小软件的exe 。
Process proc = new Process();

2.在OnStart()函数中添加如下代码
try
{
proc.StartInfo.FileName = StartAppPath; //注意路径
proc.Start();
}
catch (System.Exception ex)
{
//错误处理
}

3.在OnStop() 函数中添加如下代码
Proc.kill(); //关闭进程
4.击Service1.cs打开设计视图,在设计视图中右键,选择添加 安装程序,然后在生成的ProjectInstaller.Designer.cs文件中的InitializeComponent()函数下添加如下代码

this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; //权限账户设置
this.serviceInstaller1.ServiceName = "MYservice"; //我的服务名称,这个名字你说了算
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; //服务自动运行

5. 好了,现在可以编译生成exe了,下面要用cmd命令将刚才写的这个Windows服务安装并启动:

设置自动启动
第一步:cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
注释:跳转到指定目录下。

第二步:InstallUtil C:\QQ_WinService.exe
注意("C:\QQ_WinService.exe “ 是你服务的exe文件)
net strat MYservice //开启服务
我是在网上找到的,我也这样做,成功了的。追问先谢了
然后还有一点就是 能不能不用cmd形式注册和启动服务 能不能再写一个软件来注册这个服务?

热心网友 时间:2023-10-10 16:58

那里刷机,刷个高版本的系统!你现在的系统存在BUG!
另外,站长团上有产品团购,便宜有保证

热心网友 时间:2023-10-10 16:59

写windows服务,设置为自动运行就可以开机启动了

热心网友 时间:2023-10-10 16:59

private void button1_Click(object sender, EventArgs e)
{
RunWhenStart(true, "我的快捷工具箱", @"F:\源代码\我的快捷工具箱\我的快捷工具箱\bin\Debug\我的快捷工具箱.exe"); //调用发放 ,程序名以及路径
}

//实现开机自启动功能方法,直接使用下面的发放就可以
public void RunWhenStart(bool Started, string name, string path)
{
RegistryKey HKLM = Registry.LocalMachine;
RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
if (Started == true)
{
try
{
Run.SetValue(name, path);
HKLM.Close();
MessageBox.Show("已成功设置开机自启动");
}
catch (System.Exception ex)
{
MessageBox.Show("注册表修改错误,未实现开机自启动");
}
}
else
{
try
{
if (Run.GetValue(name) != "")
{
Run.DeleteValue(name);
HKLM.Close();
}
else return;
}
catch (System.Exception ex)
{
}
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
哥们,我是黑龙江齐齐哈尔现在高一的,想报考中国刑警学院,什么分数线啊... 没有驾驶证车辆查到有违章怎么办 广州岭南印象园景区介绍 ...从新选像我这样的人不知道读什么又懒又不想背书。 哎呀哎呀好烦阿要期末考试了,我不想背书 高考我是文科的光不想背书怎么办呢 我不想背书啊啊啊啊,考第一真难,现在的初中生涯好难熬,哪位大神教我... 现在初二了 不想背书 感觉好无聊 只想玩 但是成绩还是不错的 我该... ...时候学习还中等。现在基本一窍不通。也不想背书,身边也没人背,上课... [精选]菊花茶的副作用 关于windows版本问题 如何组装一个家用服务器 服务被全部禁用 如何安装,升级,重新安装和卸载 Microsoft Proxy Server 2.0 win7里面的C:&#92;Windows&#92;Microsoft.NET&#92;Framework&#92;v4.0.30319&#92;Temporary ASP.NET Files里面没东西? 高手请进,关于spring2.0+hibernate3声明式事务不回滚的问题 Microsoft.net Framework 2.0安装失败怎么办? 跪求!无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe)... windows服务启动失败 无法从命令行或调试器 Microsoft .NET Framework 2.0 Service Pack 这个软件是什么,有什么... 如何安装 dell idrac service module2.0 fusionserver rh2288h v3 能上其他内存条吗 安装Win2008R2引导菜单过后黑屏,无任何显示 hello啥意思? 梦见妈妈挖坟墓挖开看见棺才 昨晚梦见自己和母亲在挖别人的坟墓!自己还把人家的灵位给挖断了!谁给我解解梦呢!最近不太顺呢 梦进外婆和妈妈挖外公的坟墓,坟墓里有蛇爬出来,而且挖开以后看到盖棺材上的红布,帮忙解梦 做梦梦见挖坟墓?昨晚做梦梦见我跟妈妈挖坟墓,好像是姥爷的。然后还挖新坟墓,碰见了朋友的爸爸 我是江苏的,想找烟台鸿星尔克直播基地去卖货,请问在哪里? 鸿星尔克直播间被挤爆,销量狂增52倍,为什么这么多人支持鸿星尔克? 厨房灶台的标准高度是多少? 厨房灶台的高度应该是多少啊 发表一下厨柜高度多少合适? 橱柜的高度一般是多少? 怎么创建百度账号 请问厨房灶台的高度应该是多少最合适? 灶具的高度是多少 灶具高度尺度标准 怎样创建百度账号 如何在百度创建账号 怎样注册百度百科帐号 百度怎么创建账号 我想重新创建一个百度账号,但我手机号只有一个,怎么办 怎样重新建立百度账号 怎样在百度注册用户名 怎样创建百度帐号 怎样创建百度账号? 备用金拿出来2天还回去可以吗 百度用户怎么创建贴吧啊??? 搪瓷锅烧焦了,锅底结了一层黑色的东西,怎么解决? 如何改微信支付密码怎么修改