当我们创建一个WINDOWS服务后却发觉我们所创建的服务没有相关的描述(你可以打开服务管理器程序查看)而SystemServiceProcessServiceBase这些相关的类都没有提供这方面的信息同样如果我们需要给我们的服务加上恰当的描述我们也只能通过非托管代码来处理 using System; using SystemRuntimeInteropServices; namespace FileWatchService { public class modAPI { [DllImport(advapidll)] public static extern int LockServiceDatabase(int hSCManager); [DllImport(advapidll)] public static extern bool UnlockServiceDatabase(int hSCManager); [DllImport(kerneldll)] public static extern void CopyMemory(IntPtr pDst SC_ACTION[] pSrcint ByteLen); [DllImport(advapidll)] 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(advapidll)] public static extern bool ChangeServiceConfigA( int hService InfoLevel dwInfoLevel [MarshalAs(UnmanagedTypeStruct)] ref SERVICE_DESCRIPTION lpInfo); [DllImport(advapidll)] public static extern bool ChangeServiceConfigA( int hService InfoLevel dwInfoLevel [MarshalAs(UnmanagedTypeStruct)] ref SERVICE_FAILURE_ACTIONS lpInfo); [DllImport(advapidll)] public static extern int OpenServiceA( int hSCManager string lpServiceName ACCESS_TYPE dwDesiredAccess); [DllImport(advapidll)] public static extern int OpenSCManagerA( string lpMachineName string lpDatabaseName ServiceControlManagerType dwDesiredAccess); [DllImport(advapidll)] public static extern bool CloseServiceHandle( int hSCObject); [DllImport(advapidll)] public static extern bool QueryServiceConfigA( int hService [MarshalAs(UnmanagedTypeStruct)] ref QUERY_SERVICE_CONFIG lpServiceConfig int cbBufSize int pcbBytesNeeded); [DllImport(advapidll)] public static extern int StartService(int SVHANDLEint dwNumServiceArgsstring lpServiceArgVectors); public const int STANDARD_RIGHTS_REQUIRED = xF; public const int GENERIC_READ = ; public const int ERROR_INSUFFICIENT_BUFFER = ; public const int SERVICE_NO_CHANGE = ; //public const int SERVICE_NO_CHANGE = xFFFF; public enum ServiceType { SERVICE_KERNEL_DRIVER = x SERVICE_FILE_SYSTEM_DRIVER = x SERVICE_WIN_OWN_PROCESS = x SERVICE_WIN_SHARE_PROCESS = x SERVICE_INTERACTIVE_PROCESS = x SERVICETYPE_NO_CHANGE = SERVICE_NO_CHANGE } public enum ServiceStartType:int { SERVICE_BOOT_START = x SERVICE_SYSTEM_START = x SERVICE_AUTO_START = x SERVICE_DEMAND_START = x SERVICE_DISABLED = x SERVICESTARTTYPE_NO_CHANGE = SERVICE_NO_CHANGE } public enum ServiceErrorControl:int { SERVICE_ERROR_IGNORE = x SERVICE_ERROR_NORMAL = x SERVICE_ERROR_SEVERE = x SERVICE_ERROR_CRITICAL = x msidbServiceInstallErrorControlVital = x SERVICEERRORCONTROL_NO_CHANGE = SERVICE_NO_CHANGE } public enum ServiceStateRequest:int { SERVICE_ACTIVE = x SERVICE_INACTIVE = x SERVICE_STATE_ALL = (SERVICE_ACTIVE + SERVICE_INACTIVE) } public enum ServiceControlType:int { SERVICE_CONTROL_STOP = x SERVICE_CONTROL_PAUSE = x SERVICE_CONTROL_CONTINUE = x SERVICE_CONTROL_INTERROGATE = x SERVICE_CONTROL_SHUTDOWN = x SERVICE_CONTROL_PARAMCHANGE = x SERVICE_CONTROL_NETBINDADD = x SERVICE_CONTROL_NETBINDREMOVE = x SERVICE_CONTROL_NETBINDENABLE = x SERVICE_CONTROL_NETBINDDISABLE = xA SERVICE_CONTROL_DEVICEEVENT = xB SERVICE_CONTROL_HARDWAREPROFILECHANGE = xC SERVICE_CONTROL_POWEREVENT = xD SERVICE_CONTROL_SESSIONCHANGE = xE } public enum ServiceState:int { SERVICE_STOPPED = x SERVICE_START_PENDING = x SERVICE_STOP_PENDING = x SERVICE_RUNNING = x SERVICE_CONTINUE_PENDING = x SERVICE_PAUSE_PENDING = x SERVICE_PAUSED = x } public enum ServiceControlAccepted:int { SERVICE_ACCEPT_STOP = x SERVICE_ACCEPT_PAUSE_CONTINUE = x SERVICE_ACCEPT_SHUTDOWN = x SERVICE_ACCEPT_PARAMCHANGE = x SERVICE_ACCEPT_NETBINDCHANGE = x SERVICE_ACCEPT_HARDWAREPROFILECHANGE = x SERVICE_ACCEPT_POWEREVENT = x SERVICE_ACCEPT_SESSIONCHANGE = x } public enum ServiceControlManagerType:int { SC_MANAGER_CONNECT = x SC_MANAGER_CREATE_SERVICE = x SC_MANAGER_ENUMERATE_SERVICE = x SC_MANAGER_LOCK = x SC_MANAGER_QUERY_LOCK_STATUS = x SC_MANAGER_MODIFY_BOOT_CONFIG = x 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 = x SERVICE_CHANGE_CONFIG = x SERVICE_QUERY_STATUS = x SERVICE_ENUMERATE_DEPENDENTS = x SERVICE_START = x SERVICE_STOP = x SERVICE_PAUSE_CONTINUE = x SERVICE_INTERROGATE = x SERVICE_USER_DEFINED_CONTROL = x 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(LayoutKindSequential)] public struct SERVICE_STATUS { public int dwServiceType; public int dwCurrentState; public int dwControlsAccepted; public int dwWinExitCode; public int dwServiceSpecificExitCode; public int dwCheckPoint; public int dwWaitHint; } [StructLayout(LayoutKindSequential)] 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 = SC_ACTION_RESTART = SC_ACTION_REBOOT = SC_ACTION_RUN_COMMAND = } [StructLayout(LayoutKindSequential)] public struct SC_ACTION { public SC_ACTION_TYPE SCActionType; public int Delay; } public enum InfoLevel:int { SERVICE_CONFIG_DESCRIPTION = SERVICE_CONFIG_FAILURE_ACTIONS = } [StructLayout(LayoutKindSequential)] public struct SERVICE_DESCRIPTION { public string lpDescription; } [StructLayout(LayoutKindSequential)] public struct SERVICE_FAILURE_ACTIONS { public int dwResetPeriod; public string lpRebootMsg; public string lpCommand; public int cActions; public int lpsaActions; } } } 当我们给服务增加安装包时我们可以在ProjectInstaller里加上我们修改服务描述的代码 private void InitializeComponent() { //这里要增加代码 thisAfterInstall += new SystemConfigurationInstallInstallEventHandler(thisProjectInstaller_AfterInstall); } private void ProjectInstaller_AfterInstall(object senderSystemConfigurationInstallInstallEventArgs e) { int iSCManagerHandle = ; int iSCManagerLockHandle = ; int iServiceHandle = ; bool bChangeServiceConfig = false; bool bChangeServiceConfig = false; modAPISERVICE_DESCRIPTION ServiceDescription; modAPISERVICE_FAILURE_ACTIONS ServiceFailureActions; modAPISC_ACTION[] ScActions = new modAPISC_ACTION[]; bool bCloseService = false; bool bUnlockSCManager = false; bool bCloseSCManager = false; IntPtr iScActionsPointer = new IntPtr(); try { //打开服务控制台 iSCManagerHandle = modAPIOpenSCManagerA(null null modAPIServiceControlManagerTypeSC_MANAGER_ALL_ACCESS); if (iSCManagerHandle < ) { throw new Exception(不能打开服务管理器); } iSCManagerLockHandle = modAPILockServiceDatabase(iSCManagerHandle); if (iSCManagerLockHandle < ) { throw new Exception(不能锁定服务管理器); } //服务名 iServiceHandle = modAPIOpenServiceA(iSCManagerHandle JadeWatchService modAPIACCESS_TYPESERVICE_ALL_ACCESS); if (iServiceHandle < ) { throw new Exception(不能打开服务进行修改); } bChangeServiceConfig = modAPIChangeServiceConfigA(iServiceHandle modAPIServiceTypeSERVICE_WIN_OWN_PROCESS | modAPIServiceTypeSERVICE_INTERACTIVE_PROCESS modAPISERVICE_NO_CHANGE modAPISERVICE_NO_CHANGE null null null null null null); if (bChangeServiceConfig==false) { throw new Exception(不能改变服务设置); } ServiceDescriptionlpDescription = 青鸟文件监控服务如果停止该服务数据将不能正常进行备份!; bChangeServiceConfig = modAPIChangeServiceConfigA(iServiceHandle modAPIInfoLevelSERVICE_CONFIG_DESCRIPTIONref ServiceDescription); if (bChangeServiceConfig==false) { throw new Exception(不能进行服务描述更改); } ServiceFailureActionsdwResetPeriod = ; ServiceFailureActionslpRebootMsg = 服务启动失败! 重启中; // ServiceFailureActionslpCommand = SomeCommandexe Param Param; ServiceFailureActionslpCommand = ; ServiceFailureActionscActions = ScActionsLength; //故障恢复设置这里没有设置 ScActions[]Delay = ; ScActions[]SCActionType = modAPISC_ACTION_TYPESC_ACTION_NONE; //不要对失败操作做任何处理如果重启服务等 ScActions[]Delay = ; ScActions[]SCActionType = modAPISC_ACTION_TYPESC_ACTION_NONE; ScActions[]Delay = ; ScActions[]SCActionType = modAPISC_ACTION_TYPESC_ACTION_NONE; iScActionsPointer = MarshalAllocHGlobal(MarshalSizeOf(new modAPISC_ACTION()) * ); modAPICopyMemory(iScActionsPointer ScActions MarshalSizeOf(new modAPISC_ACTION()) * );
ServiceFailureActionslpsaActions = iScActionsPointerToInt(); bChangeServiceConfig = modAPIChangeServiceConfigA(iServiceHandle modAPIInfoLevelSERVICE_CONFIG_FAILURE_ACTIONSref ServiceFailureActions); if (bChangeServiceConfig==false) { throw new Exception(不能设置服务的故障恢复设置); } } catch(Exception ex) { throw new Exception(exMessage); } finally { MarshalFreeHGlobal(iScActionsPointer); if (iServiceHandle > ) { bCloseService = modAPICloseServiceHandle(iServiceHandle); } if (iSCManagerLockHandle > ) { bUnlockSCManager = modAPIUnlockServiceDatabase(iSCManagerLockHandle); } if (iSCManagerHandle != ) { bCloseSCManager = modAPICloseServiceHandle(iSCManagerHandle); } } } 在安装完成后我们对服务进行这里可以修改的内容包括服务的描述服务的故障处理等 如果你在安装时需要对服务进行自动处于运行状态或卸载时需要自动将服务也卸载你只要注册 thisbeforeuninstall+=new InstallEventHandler(ProjectInstaller_BeforeUninstall); thisCommitted+=new InstallEventHandler(ProjectInstaller_Committed); 这二个事件 committed事件在这里可以将安装的服务进行调整到运行状态 beforeuninstall事件您可以在这里将服务自动卸载掉 |