
using Systemusing System Runtime InteropServices
namespace FileWatchService{ public class modAPI { [DllImport( advapi dll )] public static extern int LockServiceDatabase(int hSCManager) [DllImport( advapi dll )] public static extern bool UnlockServiceDatabase(int hSCManager) [DllImport( kernel dll )] public static extern void CopyMemory(IntPtr pDst SC_ACTION[] pSrc int ByteLen) [DllImport( advapi 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( advapi dll )] public static extern bool ChangeServiceConfig A( int hService InfoLevel dwInfoLevel [MarshalAs(UnmanagedType Struct)] ref SERVICE_DESCRIPTION lpInfo)
[DllImport( advapi dll )] public static extern bool ChangeServiceConfig A( int hService InfoLevel dwInfoLevel [MarshalAs(UnmanagedType Struct)] ref SERVICE_FAILURE_ACTIONS lpInfo)
[DllImport( advapi dll )] public static extern int OpenServiceA( int hSCManager string lpServiceName ACCESS_TYPE dwDesiredAccess)
[DllImport( advapi dll )] public static extern int OpenSCManagerA( string lpMachineName string lpDatabaseName ServiceControlManagerType dwDesiredAccess)
[DllImport( advapi dll )] public static extern bool CloseServiceHandle( int hSCObject)
[DllImport( advapi dll )] public static extern bool QueryServiceConfigA( int hService [MarshalAs(UnmanagedType Struct)] ref QUERY_SERVICE_CONFIG lpServiceConfig int cbBufSize int pcbBytesNeeded) [DllImport( advapi dll )] public static extern int StartService(int SVHANDLE int dwNumServiceArgs string 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(LayoutKind Sequential)] public struct SERVICE_STATUS { public int dwServiceType public int dwCurrentState public int dwControlsAccepted public int dwWin ExitCode 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 = SC_ACTION_RESTART = SC_ACTION_REBOOT = SC_ACTION_RUN_MAND = }
[StructLayout(LayoutKind Sequential)] public struct SC_ACTION { public SC_ACTION_TYPE SCActionType public int Delay }
public enum InfoLevel:int { SERVICE_CONFIG_DESCRIPTION = SERVICE_CONFIG_FAILURE_ACTIONS = }
[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 = int iSCManagerLockHandle = int iServiceHandle = bool bChangeServiceConfig = false bool bChangeServiceConfig = false modAPI SERVICE_DESCRIPTION ServiceDescription modAPI SERVICE_FAILURE_ACTIONS ServiceFailureActions modAPI SC_ACTION[] ScActions = new modAPI SC_ACTION[ ]
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 <) { throw new Exception( 不能打开服务管理器 ) }
iSCManagerLockHandle = modAPI LockServiceDatabase(iSCManagerHandle)
if (iSCManagerLockHandle <) { throw new Exception( 不能锁定服务管理器 ) }
//服务名 iServiceHandle = modAPI OpenServiceA(iSCManagerHandle JadeWatchService modAPI ACCESS_TYPE SERVICE_ALL_ACCESS)
if (iServiceHandle <) { throw new Exception( 不能打开服务进行修改 ) } bChangeServiceConfig = modAPI ChangeServiceConfigA(iServiceHandle modAPI ServiceType SERVICE_WIN _OWN_PROCESS | modAPI ServiceType SERVICE_INTERACTIVE_PROCESS modAPI SERVICE_NO_CHANGE modAPI SERVICE_NO_CHANGE null null null null null null)
if (bChangeServiceConfig==false) { throw new Exception( 不能改变服务设置 ) }
ServiceDescription lpDescription = 青鸟文件监控服务 如果停止该服务 数据将不能正常进行备份!
bChangeServiceConfig = modAPI ChangeServiceConfig A(iServiceHandle modAPI InfoLevel SERVICE_CONFIG_DESCRIPTION ref ServiceDescription)
if (bChangeServiceConfig ==false) { throw new Exception( 不能进行服务描述更改 ) }
ServiceFailureActions dwResetPeriod = ServiceFailureActions lpRebootMsg = 服务启动失败! 重启中 // ServiceFailureActions lpCommand = SomeCommand exe Param Param ServiceFailureActions lpCommand = ServiceFailureActions cActions = ScActions Length
//故障恢复设置 这里没有设置 ScActions[ ] Delay = ScActions[ ] SCActionType = modAPI SC_ACTION_TYPE SC_ACTION_NONE//不要对失败 *** 作做任何处理 如果重启服务等 ScActions[ ] Delay = ScActions[ ] SCActionType = modAPI SC_ACTION_TYPE SC_ACTION_NONE ScActions[ ] Delay = ScActions[ ] SCActionType = modAPI SC_ACTION_TYPE SC_ACTION_NONE
iScActionsPointer = Marshal AllocHGlobal(Marshal SizeOf(new modAPI SC_ACTION()) * )
modAPI CopyMemory(iScActionsPointer ScActions Marshal SizeOf(new modAPI SC_ACTION()) * )
ServiceFailureActions lpsaActions = iScActionsPointer ToInt ()
bChangeServiceConfig = modAPI ChangeServiceConfig A(iServiceHandle modAPI InfoLevel SERVICE_CONFIG_FAILURE_ACTIONS ref ServiceFailureActions)
if (bChangeServiceConfig ==false) { throw new Exception( 不能设置服务的故障恢复设置 ) } } catch(Exception ex) { throw new Exception(ex Message) } finally { Marshal FreeHGlobal(iScActionsPointer)
if (iServiceHandle >) { bCloseService = modAPI CloseServiceHandle(iServiceHandle) }
if (iSCManagerLockHandle >) { bUnlockSCManager = modAPI UnlockServiceDatabase(iSCManagerLockHandle) }
if (iSCManagerHandle != ) { bCloseSCManager = modAPI CloseServiceHandle(iSCManagerHandle) } } }
在安装完成后 我们对服务进行 这里可以修改的内容包括服务的描述 服务的故障处理等
如果你在安装时 需要对服务进行自动处于运行状态 或卸载时需要自动将服务也卸载 你只要注册
this beforeuninstall+=new InstallEventHandler(ProjectInstaller_BeforeUninstall) this Committed+=new InstallEventHandler(ProjectInstaller_Committed)
这二个事件
mitted事件 在这里可以将安装的服务进行调整到运行状态
lishixinzhi/Article/program/net/201311/13252Service项目中最少要有两个组件类,一个组件类A 继承ServiceBase(Windows服务类),另一个组件类B 继承Installer(安装程序类),B中要有两个组件:System.ServiceProcess.ServiceProcessInstaller和System.ServiceProcess.ServiceInstaller,在ServiceInstaller的Description中填写服务的描述,DisplayName中填写在services.msc中显示的友好名称,ServiceName填写服务名,会在ServiceProcessInstaller被调用。在WMI遍历时也是以这个服务名为准。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)