zoukankan      html  css  js  c++  java
  • 使用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;
            }
        }
    }
    

      

  • 相关阅读:
    Hadoop-2.4.1学习之Map任务源代码分析(下)
    微软面试题之两个链表的第一个公共结点
    再次轻度破解EXE文件
    源泉书签,助您管理海量收藏。www.yuanquanshuqian.com,今日更新:多标签功能已实现
    经验总结17--submitbutton,ajax提交
    python学习笔记(六)文件夹遍历,异常处理
    vue 数据传递的方法
    Vue 组件之间的数据传递
    Springboot文件下载
    springboot获取URL请求参数的几种方法
  • 原文地址:https://www.cnblogs.com/liulun/p/2223906.html
Copyright © 2011-2022 走看看