使用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 ; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2009-10-25 多线程,异步委托,同步委托几种方式的区别