分享
 
 
 

给WINDOWS服务加上描述

王朝c#·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

当我们创建一个WINDOWS服务后,却发觉我们所创建的服务没有相关的描述。(你可以打开服务管理器程序查看)。而System.ServiceProcess.ServiceBase这些相关的类都没有提供这方面的信息。同样如果我们需要给我们的服务加上恰当的描述,我们也只能通过非托管代码来处理。

using System;

using System.Runtime.InteropServices;

namespace FileWatchService

{

public class modAPI

{

[DllImport('advapi32.dll')]

public static extern int LockServiceDatabase(int hSCManager);

[DllImport('advapi32.dll')]

public static extern bool UnlockServiceDatabase(int hSCManager);

[DllImport('kernel32.dll')]

public static extern void CopyMemory(IntPtr pDst, SC_ACTION[] pSrc,int ByteLen);

[DllImport('advapi32.dll')]

public static extern bool ChangeServiceConfigA(

int hService, ServiceType dwServiceType, int dwStartType,

int dwErrorControl, string lpBinaryPathName, string lpLoadOrderGroup,

int lpdwTagId, string lpDependencies, string lpServiceStartName,

string lpPassword, string lpDisplayName);

[DllImport('advapi32.dll')]

public static extern bool ChangeServiceConfig2A(

int hService, InfoLevel dwInfoLevel,

[MarshalAs(UnmanagedType.Struct)] ref SERVICE_DESCRIPTION lpInfo);

[DllImport('advapi32.dll')]

public static extern bool ChangeServiceConfig2A(

int hService, InfoLevel dwInfoLevel,

[MarshalAs(UnmanagedType.Struct)] ref SERVICE_FAILURE_ACTIONS lpInfo);

[DllImport('advapi32.dll')]

public static extern int OpenServiceA(

int hSCManager, string lpServiceName, ACCESS_TYPE dwDesiredAccess);

[DllImport('advapi32.dll')]

public static extern int OpenSCManagerA(

string lpMachineName, string lpDatabaseName, ServiceControlManagerType dwDesiredAccess);

[DllImport('advapi32.dll')]

public static extern bool CloseServiceHandle(

int hSCObject);

[DllImport('advapi32.dll')]

public static extern bool QueryServiceConfigA(

int hService, [MarshalAs(UnmanagedType.Struct)] ref QUERY_SERVICE_CONFIG lpServiceConfig, int cbBufSize,

int pcbBytesNeeded);

[DllImport('advapi32.dll')]

public static extern int StartService(int SVHANDLE,int dwNumServiceArgs,string lpServiceArgVectors);

public const int STANDARD_RIGHTS_REQUIRED = 0xF0000;

public const int GENERIC_READ = -2147483648;

public const int ERROR_INSUFFICIENT_BUFFER = 122;

public const int SERVICE_NO_CHANGE = -1;

//public const int SERVICE_NO_CHANGE = 0xFFFF;

public enum ServiceType

{

SERVICE_KERNEL_DRIVER = 0x1,

SERVICE_FILE_SYSTEM_DRIVER = 0x2,

SERVICE_WIN32_OWN_PROCESS = 0x10,

SERVICE_WIN32_SHARE_PROCESS = 0x20,

SERVICE_INTERACTIVE_PROCESS = 0x100,

SERVICETYPE_NO_CHANGE = SERVICE_NO_CHANGE

}

public enum ServiceStartType:int

{

SERVICE_BOOT_START = 0x0,

SERVICE_SYSTEM_START = 0x1,

SERVICE_AUTO_START = 0x2,

SERVICE_DEMAND_START = 0x3,

SERVICE_DISABLED = 0x4,

SERVICESTARTTYPE_NO_CHANGE = SERVICE_NO_CHANGE

}

public enum ServiceErrorControl:int

{

SERVICE_ERROR_IGNORE = 0x0,

SERVICE_ERROR_NORMAL = 0x1,

SERVICE_ERROR_SEVERE = 0x2,

SERVICE_ERROR_CRITICAL = 0x3,

msidbServiceInstallErrorControlVital = 0x8000,

SERVICEERRORCONTROL_NO_CHANGE = SERVICE_NO_CHANGE

}

public enum ServiceStateRequest:int

{

SERVICE_ACTIVE = 0x1,

SERVICE_INACTIVE = 0x2,

SERVICE_STATE_ALL = (SERVICE_ACTIVE + SERVICE_INACTIVE)

}

public enum ServiceControlType:int

{

SERVICE_CONTROL_STOP = 0x1,

SERVICE_CONTROL_PAUSE = 0x2,

SERVICE_CONTROL_CONTINUE = 0x3,

SERVICE_CONTROL_INTERROGATE = 0x4,

SERVICE_CONTROL_SHUTDOWN = 0x5,

SERVICE_CONTROL_PARAMCHANGE = 0x6,

SERVICE_CONTROL_NETBINDADD = 0x7,

SERVICE_CONTROL_NETBINDREMOVE = 0x8,

SERVICE_CONTROL_NETBINDENABLE = 0x9,

SERVICE_CONTROL_NETBINDDISABLE = 0xA,

SERVICE_CONTROL_DEVICEEVENT = 0xB,

SERVICE_CONTROL_HARDWAREPROFILECHANGE = 0xC,

SERVICE_CONTROL_POWEREVENT = 0xD,

SERVICE_CONTROL_SESSIONCHANGE = 0xE,

}

public enum ServiceState:int

{

SERVICE_STOPPED = 0x1,

SERVICE_START_PENDING = 0x2,

SERVICE_STOP_PENDING = 0x3,

SERVICE_RUNNING = 0x4,

SERVICE_CONTINUE_PENDING = 0x5,

SERVICE_PAUSE_PENDING = 0x6,

SERVICE_PAUSED = 0x7,

}

public enum ServiceControlAccepted:int

{

SERVICE_ACCEPT_STOP = 0x1,

SERVICE_ACCEPT_PAUSE_CONTINUE = 0x2,

SERVICE_ACCEPT_SHUTDOWN = 0x4,

SERVICE_ACCEPT_PARAMCHANGE = 0x8,

SERVICE_ACCEPT_NETBINDCHANGE = 0x10,

SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x20,

SERVICE_ACCEPT_POWEREVENT = 0x40,

SERVICE_ACCEPT_SESSIONCHANGE = 0x80

}

public enum ServiceControlManagerType:int

{

SC_MANAGER_CONNECT = 0x1,

SC_MANAGER_CREATE_SERVICE = 0x2,

SC_MANAGER_ENUMERATE_SERVICE = 0x4,

SC_MANAGER_LOCK = 0x8,

SC_MANAGER_QUERY_LOCK_STATUS = 0x10,

SC_MANAGER_MODIFY_BOOT_CONFIG = 0x20,

SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED + SC_MANAGER_CONNECT + SC_MANAGER_CREATE_SERVICE + SC_MANAGER_ENUMERATE_SERVICE + SC_MANAGER_LOCK + SC_MANAGER_QUERY_LOCK_STATUS + SC_MANAGER_MODIFY_BOOT_CONFIG

}

public enum ACCESS_TYPE:int

{

SERVICE_QUERY_CONFIG = 0x1,

SERVICE_CHANGE_CONFIG = 0x2,

SERVICE_QUERY_STATUS = 0x4,

SERVICE_ENUMERATE_DEPENDENTS = 0x8,

SERVICE_START = 0x10,

SERVICE_STOP = 0x20,

SERVICE_PAUSE_CONTINUE = 0x40,

SERVICE_INTERROGATE = 0x80,

SERVICE_USER_DEFINED_CONTROL = 0x100,

SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED + SERVICE_QUERY_CONFIG + SERVICE_CHANGE_CONFIG + SERVICE_QUERY_STATUS + SERVICE_ENUMERATE_DEPENDENTS + SERVICE_START + SERVICE_STOP + SERVICE_PAUSE_CONTINUE + SERVICE_INTERROGATE + SERVICE_USER_DEFINED_CONTROL

}

[StructLayout(LayoutKind.Sequential)]

public struct SERVICE_STATUS

{

public int dwServiceType;

public int dwCurrentState;

public int dwControlsAccepted;

public int dwWin32ExitCode;

public int dwServiceSpecificExitCode;

public int dwCheckPoint;

public int dwWaitHint;

}

[StructLayout(LayoutKind.Sequential)]

public struct QUERY_SERVICE_CONFIG

{

public int dwServiceType;

public int dwStartType;

public int dwErrorControl;

public string lpBinaryPathName;

public string lpLoadOrderGroup;

public int dwTagId;

public string lpDependencies;

public string lpServiceStartName;

public string lpDisplayName;

}

public enum SC_ACTION_TYPE:int

{

SC_ACTION_NONE = 0,

SC_ACTION_RESTART = 1,

SC_ACTION_REBOOT = 2,

SC_ACTION_RUN_COMMAND = 3,

}

[StructLayout(LayoutKind.Sequential)]

public struct SC_ACTION

{

public SC_ACTION_TYPE SCActionType;

public int Delay;

}

public enum InfoLevel:int

{

SERVICE_CONFIG_DESCRIPTION = 1,

SERVICE_CONFIG_FAILURE_ACTIONS = 2

}

[StructLayout(LayoutKind.Sequential)]

public struct SERVICE_DESCRIPTION

{

public string lpDescription;

}

[StructLayout(LayoutKind.Sequential)]

public struct SERVICE_FAILURE_ACTIONS

{

public int dwResetPeriod;

public string lpRebootMsg;

public string lpCommand;

public int cActions;

public int lpsaActions;

}

}

}

当我们给服务增加安装包时,我们可以在ProjectInstaller里加上我们修改服务描述的代码

private void InitializeComponent()

{

//这里要增加代码

this.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.ProjectInstaller_AfterInstall);

}

private void ProjectInstaller_AfterInstall(object sender,System.Configuration.Install.InstallEventArgs e)

{

int iSCManagerHandle = 0;

int iSCManagerLockHandle = 0;

int iServiceHandle = 0;

bool bChangeServiceConfig = false;

bool bChangeServiceConfig2 = false;

modAPI.SERVICE_DESCRIPTION ServiceDescription;

modAPI.SERVICE_FAILURE_ACTIONS ServiceFailureActions;

modAPI.SC_ACTION[] ScActions = new modAPI.SC_ACTION[3];

bool bCloseService = false;

bool bUnlockSCManager = false;

bool bCloseSCManager = false;

IntPtr iScActionsPointer = new IntPtr();

try

{

//打开服务控制台

iSCManagerHandle = modAPI.OpenSCManagerA(null, null,

modAPI.ServiceControlManagerType.SC_MANAGER_ALL_ACCESS);

if (iSCManagerHandle < 1)

{

throw new Exception('不能打开服务管理器.');

}

iSCManagerLockHandle = modAPI.LockServiceDatabase(iSCManagerHandle);

if (iSCManagerLockHandle < 1)

{

throw new Exception('不能锁定服务管理器.');

}

//服务名

iServiceHandle = modAPI.OpenServiceA(iSCManagerHandle, 'JadeWatchService',

modAPI.ACCESS_TYPE.SERVICE_ALL_ACCESS);

if (iServiceHandle < 1)

{

throw new Exception('不能打开服务进行修改.');

}

bChangeServiceConfig = modAPI.ChangeServiceConfigA(iServiceHandle,

modAPI.ServiceType.SERVICE_WIN32_OWN_PROCESS | modAPI.ServiceType.SERVICE_INTERACTIVE_PROCESS,

modAPI.SERVICE_NO_CHANGE, modAPI.SERVICE_NO_CHANGE, null, null,

0, null, null, null, null);

if (bChangeServiceConfig==false)

{

throw new Exception('不能改变服务设置.');

}

ServiceDescription.lpDescription = '青鸟文件监控服务,如果停止该服务,数据将不能正常进行备份!';

bChangeServiceConfig2 = modAPI.ChangeServiceConfig2A(iServiceHandle,

modAPI.InfoLevel.SERVICE_CONFIG_DESCRIPTION,ref ServiceDescription);

if (bChangeServiceConfig2==false)

{

throw new Exception('不能进行服务描述更改.');

}

ServiceFailureActions.dwResetPeriod = 600;

ServiceFailureActions.lpRebootMsg = '服务启动失败! 重启中...';

// ServiceFailureActions.lpCommand = 'SomeCommand.exe Param1 Param2';

ServiceFailureActions.lpCommand = '';

ServiceFailureActions.cActions = ScActions.Length;

//故障恢复设置,这里没有设置

ScActions[0].Delay = 20000;

ScActions[0].SCActionType = modAPI.SC_ACTION_TYPE.SC_ACTION_NONE; //不要对失败操作做任何处理,如果重启服务等

ScActions[1].Delay = 20000;

ScActions[1].SCActionType = modAPI.SC_ACTION_TYPE.SC_ACTION_NONE;

ScActions[2].Delay = 20000;

ScActions[2].SCActionType = modAPI.SC_ACTION_TYPE.SC_ACTION_NONE;

iScActionsPointer = Marshal.AllocHGlobal(Marshal.SizeOf(new modAPI.SC_ACTION()) * 3);

modAPI.CopyMemory(iScActionsPointer, ScActions, Marshal.SizeOf(new modAPI.SC_ACTION()) * 3);

ServiceFailureActions.lpsaActions = iScActionsPointer.ToInt32();

bChangeServiceConfig2 = modAPI.ChangeServiceConfig2A(iServiceHandle,

modAPI.InfoLevel.SERVICE_CONFIG_FAILURE_ACTIONS,ref ServiceFailureActions);

if (bChangeServiceConfig2==false)

{

throw new Exception('不能设置服务的故障恢复设置.');

}

}

catch(Exception ex)

{

throw new Exception(ex.Message);

}

finally

{

Marshal.FreeHGlobal(iScActionsPointer);

if (iServiceHandle > 0)

{

bCloseService = modAPI.CloseServiceHandle(iServiceHandle);

}

if (iSCManagerLockHandle > 0)

{

bUnlockSCManager = modAPI.UnlockServiceDatabase(iSCManagerLockHandle);

}

if (iSCManagerHandle != 0)

{

bCloseSCManager = modAPI.CloseServiceHandle(iSCManagerHandle);

}

}

}

在安装完成后,我们对服务进行。这里可以修改的内容包括服务的描述,服务的故障处理等.

如果你在安装时,需要对服务进行自动处于运行状态,或卸载时需要自动将服务也卸载,你只要注册

this.BeforeUninstall+=new InstallEventHandler(ProjectInstaller_BeforeUninstall);

this.Committed+=new InstallEventHandler(ProjectInstaller_Committed);

这二个事件

Committed事件,在这里可以将安装的服务进行调整到运行状态

BeforeUninstall事件,您可以在这里将服务自动卸载掉

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有