c# windows service如何通过bat文件来安装和卸载服务?

c# windows service如何通过bat文件来安装和卸载服务?,第1张

安装:程序名 + /install 或程序名 + /service

启动:net start + 服务名 或 sc start +服务名

停止:net stop + 服务名 或 sc stop +服务名

卸载:sc delete +服务名 或 程序名+ /uninstall

例:对C盘根目录下的AA.exe(服务名:AA)进行操作的BAT如下:

C:\\aa /install

sc start aa

sc stop aa

c:\\aa /uninstall

安装Winfows服务首先要添加安装程序,添加安装程序步骤如下:

1、将Windows服务程序切换到设计视图, 右击设计视图选择“添加安装程序”

2、切换到刚被添加的ProjectInstaller的设计视图

一般设置如下:

设置serviceInstaller1组件的属性:

1) ServiceName = 服务名称

2) StartType = Automatic ,即自动

设置serviceProcessInstaller1组件的属性

1) Account = LocalSystem,账户一般设置为本地系统

3、生成解决方案

安装服务:

方法一、使用DOS命令安装window服务

1、在服务所在的文件夹下的bin\debug文件夹下找到.exe文件(例如WindowsService1.exe)

将此文件拷贝到你想安装的文件夹中。

2、进入DOS界面

(VS2008-->Visual Studio Tools-->Visual Studio 2008 命令提示)来进入DOS,直接用cmd可能有些命令找不到;

3、输入

方法二、使用安装项目安装windows服务

个人比较推荐这个方法,选择目录安装更灵活,而且不用在DOS环境下运行。

因为本人比较懒,直接给出别人总结的地址

注意,以后每次服务项目有更改的时候,需要编译服务后,在安装项目中刷新依赖项!!!

方法三、

在ProjectInstaller.cs的后台代码中添加安装服务和卸载服务的代码

/// <summary>

/// 安装服务

/// </summary>

/// <param name="stateSaver"></param>

public override void Install(System.Collections.IDictionary stateSaver)

{

Microsoft.Win32.RegistryKey system,

//HKEY_LOCAL_MACHINE\Services\CurrentControlSet

currentControlSet,

//...\Services

services,

//...\<Service Name>

service,

//...\Parameters - this is where you can put service-specific configuration

config

try

{

//Let the project installer do its job

base.Install(stateSaver)

//Open the HKEY_LOCAL_MACHINE\SYSTEM key

system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System")

//Open CurrentControlSet

currentControlSet = system.OpenSubKey("CurrentControlSet")

//Go to the services key

services = currentControlSet.OpenSubKey("Services")

//Open the key for your service, and allow writing

service = services.OpenSubKey(conServiceName, true)

//Add your service's description as a REG_SZ value named "Description"

service.SetValue("Description", "描述语言")

//(Optional) Add some custom information your service will use...

config = service.CreateSubKey("Parameters")

}

catch (Exception e)

{

Console.WriteLine("An exception was thrown during service installation:\n" + e.ToString())

}

}

/// <summary>

/// 卸载服务

/// </summary>

/// <param name="savedState"></param>

public override void Uninstall(System.Collections.IDictionary savedState)

{

Microsoft.Win32.RegistryKey system,

currentControlSet,

services,

service

try

{

//Drill down to the service key and open it with write permission

system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System")

currentControlSet = system.OpenSubKey("CurrentControlSet")

services = currentControlSet.OpenSubKey("Services")

service = services.OpenSubKey(conServiceName, true)

//Delete any keys you created during installation (or that your service created)

service.DeleteSubKeyTree("Parameters")

//...

}

catch (Exception e)

{

Console.WriteLine("Exception encountered while uninstalling service:\n" + e.ToString())

}

finally

{

//Let the project installer do its job

base.Uninstall(savedState)

}

}

代码添加完成后

添加window service安装的批处理命令

1)在项目添加一个文本文件,更名为install.bat,编辑文件的内容如下:

@echo off

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -i "WindowsService1.exe"

@pause

2)在项目添加一个文本文件,更名为uninstall.bat,编辑文件的内容如下

@echo off

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -u "WindowsService1.exe"

@pause

说明:上面绿色字体为服务名称

编译完成后将debug的文件拷贝到想安装的目录下,点击install.bat即完成安装。

方法一:修改注册表

在注册表编辑器,展开分支"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services",在右侧窗格中显示的就是本机安装的服务项。如果要新建服务,只须点击"编辑→新建→项" ,然后为此项命名,如"test";然后右击该项,选择"新建→字符串值"或"新建→Dword值"即可。添加一个服务项目具体需要添加的键值如下:"DisplayName",字符串值,对应服务名称;

"Description",字符串值,对应服务描述;

"ImagePath",字符串值,对应该服务程序所在的路径;

"ObjectName",字符串值,值为"LocalSystem",表示本地登录;

"ErrorControl",Dword值,值为"1";

"Start",Dword值,值为2表示自动运行,值为3表示手动运行,值为4表示禁止;

"Type",Dword值,应用程序对应10,其它对应20。

另外,还要在"test"项下新建一个"Enum"项。如果有些必须通过srvany来加载的还必须 添加另外的Parameters子项在该项中提供详细的要加为服务的程序所在的路径。而上面的那个 路径就需要指到srvany所在的路径。

方法二:脚本操作

sc create myserver binpath= c:\windows\Sc\myserver.exe

sc config myservers tart= auto

sc start myserver

方法三: 写注册表文件

现在很多的木马、后门、蠕虫病毒都是通过修改注册表中的RUN键值来实现自启动。

但是这种自启动模式不是很隐蔽的,稍微懂点安全的人,一般发现电脑被黑,都会查看RUN键值的。

于是系统服务便成为了一种相对隐蔽的自启动模式。比如冲击波杀手就采用系统服务来自启动病毒程序。

现在添加系统服务的工具很多,最典型的就是netservice。但是我们这里讲的是手工添加系统服务,所以工具的使用不在本文的讨论范围之内。

WINDOWS里的很多东西都是跟注册表息息相关的,系统服务也不例外。

系统服务跟以下的注册表几个项目相关:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services

我们完全可以找到在系统服务中已注册的服务的键值来依样画葫芦。

在以上任何注册表列中添加一个新项:

名字是你想要添加系统服务的名字,比如Backdoor。

在BACKDOOR项下新建一个字符串,数值名称Displayname 数值数据为要添加服务的

名称Backdoor。

下面列出一个表,会直观一些:

名称 类型 数据 备注

Displayname REG_SZ 想要添加服务的名称 想要添加服务的名称

Description REG_SZ 服务的描述 服务的描述

ImagePath REG EXPAND SZ 程序的路径

Start REG_DWORD 0,2,3,4 2代表自动启动,3代表手动启动服务.4代表禁用服务,0代表系统对底层设备驱动(一般不需要这个)

ErrorControl REG_DWORD 1

Type REG_DWORD 10 or 20 一般应用程序都是10,其他的对应20

ObjectName REG_SZ LocalSystem 显示本地登陆

注意:在XP/2003下可以完全手工来添加REG EXPAND SZ类型。在XP/2003下直接修改ImagePath 键值就可以了。但是在WIN2000下却不可以。原因我也不清楚:(。但是在WIN2000下我们写一个REG来直接注册系统服务,这样WIN2000下添加系统也能很轻松了。这里同样需要注意的是注册表文件里的ImagePath的数值类型必须是HEX(16进制)。可以拿WINHEX来把程序的绝对路径转换成16进制的。每一个数值用逗号搁开。比如我的ImagePath键值是C:\winnt\nukegroup.exe那就应该转换成:

63,3A,5C,77,69,6E,6E,74,5C,6E,75,6B,65,2E,65,78,65(无空格)

打开记事本,敲入以下内容:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\"want to create the name of service"]

"Type"=dword:00000010

"Start"=dword:00000002

"ErrorControl"=dword:00000001

"ImagePath"=hex(2):63,3A,5C,77,69,6E,6E,74,5C,6E,75,6B,65,2E,65,78,65

"DisplayName"="SRVTEST"

"ObjectName"="LocalSystem"

"Description"="系统服务测试"

把以上信息保存为addsrv.reg,我们就可以依靠命令来导入注册表,从而达到添加系统服务的目的。

我们在命令控制台输入regedit /s addsrv.reg,等机器重新启动,这个服务就被成功添加了。

但是我在真正实验的时候就遇到困难了。ImagePath的数值是乱码(1)(2),

怎么想也不明白。但是这时可以把乱码修改成绝对路径了。如果直接把REG信息写成这样

"ImagePath"=hex(2):C:\WINNT\NUKEGROUP.EXE

其他的键值都可以添加,这个键值就不可以了?总之我们可以先添加乱码的ImagePath,然后再修改成C:\winnt\nukegroup.exe 这样也不是不可能的。就是在命令行下来添加就很麻烦了。(3)

以上是Windows 2000手工添加系统服务的方法,对于Windows 98 注册表结构是不一样的,但是Windows 98仍然可以通过注册表来实现添加系统服务,而且还要更简单一些。

在项目“HKLM/SOFTWARE/Microsoft/WindowsCurrentVersion/RunServices”下添加一个新字符串数值。

比如,如果程序的名字叫做“BACKDOOR”,就建立一个名为“BACKDOOR”的字符串数值,然后在数据域中输入执行程序的完整路径。

手工添加一个系统服务就这么简单,手工删除系统也是一个道理。通过注册表来实现,这里就不多说了。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/227232.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-08
下一篇2023-04-08

发表评论

登录后才能评论

评论列表(0条)

    保存