使用WINAPI安装Windows服务[转]
using system; using system.runtime.interopservices; namespace myserviceinstaller { class serviceinstaller { #region private variables private string _servicepath; private string _servicename; private string _servicedisplayname; #endregion private variables #region dllimport [dllimport("advapi32.dll")] public static extern intptr openscmanager(string lpmachinename, string lpscdb, int scparameter); [dllimport("advapi32.dll")] public static extern intptr createservice(intptr sc_handle, string lpsvcname, string lpdisplayname, int dwdesiredaccess, int dwservicetype, int dwstarttype, int dwerrorcontrol, string lppathname, string lploadordergroup, int lpdwtagid, string lpdependencies, string lpservicestartname, string lppassword); [dllimport("advapi32.dll")] public static extern void closeservicehandle(intptr schandle); [dllimport("advapi32.dll")] public static extern int startservice(intptr svhandle, int dwnumserviceargs, string lpserviceargvectors); [dllimport("advapi32.dll", setlasterror = true)] public static extern intptr openservice(intptr schandle, string lpsvcname, int dwnumserviceargs); [dllimport("advapi32.dll")] public static extern int deleteservice(intptr svhandle); [dllimport("kernel32.dll")] public static extern int getlasterror(); #endregion dllimport /// <summary> /// 应用程序入口. /// </summary> [stathread] static void main(string[] args) { string svcpath; string svcname; string svcdispname; //服务程序的路径 svcpath = @"c:\myservice.exe"; svcdispname = "myservice"; svcname = "myservice"; serviceinstaller c = new serviceinstaller(); c.installservice(svcpath, svcname, svcdispname); console.read(); } /// <summary> /// 安装和运行 /// </summary> /// <param name="svcpath">程序路径.</param> /// <param name="svcname">服务名</param> /// <param name="svcdispname">服务显示名称.</param> /// <returns>服务安装是否成功.</returns> public bool installservice(string svcpath, string svcname, string svcdispname) { #region constants declaration. int sc_manager_create_service = 0x0002; int service_win32_own_process = 0x00000010; //int service_demand_start = 0x00000003; int service_error_normal = 0x00000001; int standard_rights_required = 0xf0000; int service_query_config = 0x0001; int service_change_config = 0x0002; int service_query_status = 0x0004; int service_enumerate_dependents = 0x0008; int service_start = 0x0010; int service_stop = 0x0020; int service_pause_continue = 0x0040; int service_interrogate = 0x0080; int service_user_defined_control = 0x0100; int 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); int service_auto_start = 0x00000002; #endregion constants declaration. try { intptr sc_handle = openscmanager(null, null, sc_manager_create_service); if (sc_handle.toint32() != 0) { intptr sv_handle = createservice(sc_handle, svcname, svcdispname, service_all_access, service_win32_own_process, service_auto_start, service_error_normal, svcpath, null, 0, null, null, null); if (sv_handle.toint32() == 0) { closeservicehandle(sc_handle); return false; } else { //试尝启动服务 int i = startservice(sv_handle, 0, null); if (i == 0) { return false; } closeservicehandle(sc_handle); return true; } } else return false; } catch (exception e) { throw e; } } /// <summary> /// 反安装服务. /// </summary> /// <param name="svcname">服务名.</param> public bool uninstallservice(string svcname) { int generic_write = 0x40000000; intptr sc_hndl = openscmanager(null, null, generic_write); if (sc_hndl.toint32() != 0) { int delete = 0x10000; intptr svc_hndl = openservice(sc_hndl, svcname, delete); if (svc_hndl.toint32() != 0) { int i = deleteservice(svc_hndl); if (i != 0) { closeservicehandle(sc_hndl); return true; } else { closeservicehandle(sc_hndl); return false; } } else return false; } else return false; } } }