使用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;
        }
    }
}

  

时间: 2024-10-28 15:03:58

使用WINAPI安装Windows服务[转]的相关文章

service-程序发布——把mfc程序(带有dll)做成安装包, 安装过程中自动安装windows服务

问题描述 程序发布--把mfc程序(带有dll)做成安装包, 安装过程中自动安装windows服务 如题 怎么实现??? 有高手留一下联系方式么~~跪求 如题 怎么实现??? 有高手留一下联系方式么~~跪求如题 怎么实现??? 解决方案 //打开服务控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { return FALSE; } // Get the exe

如何安装Windows服务(Windows Service)?

安装:(另存为.bat文件) c:\windows\microsoft.net\framework\v2.0.50727\InstallUtil.exe 您的服务.exepause 卸载:(别存为.bat文件)  c:\windows\microsoft.net\framework\v2.0.50727\InstallUtil.exe /u 您的服务.exepause

帮帮忙: 安装Windows服务时出现异常 索引和长度必须引用该字符串内的位置 参数名:Length

问题描述 发表于:2007-11-0921:09:54楼主本人在VS中建立了一个服务,但在安装是出现如上问题,请问如何解决?代码如下://ServiceName="Service1"namespaceWindowsService2{publicpartialclassService1:ServiceBase{publicService1(){InitializeComponent();}protectedoverridevoidOnStart(string[]args){//TODO:

C#创建、安装一个Windows服务

关于WIndows服务的介绍,之前写过一篇:http://blog.csdn.net/yysyangyangyangshan/article/details/7295739.可能这里对如何写一个服务不是很详细.现在纯用代码的形式介绍一下windows服务是如何开发和安装的. 开发环境:Win7 32位:工具:visualstudio2010. 因为win7自带的就有.net环境,算是偷一下懒吧.因为无论是手动安装或程序安装都要用到.一个目录(默认C盘为操作系统的情况):C:\Windows\Mi

MongoDB安装到windows服务的方法及遇到问题的完美解决方案_MongoDB

MongoDB的安装方法详情请查看 :   MongoDB的安装方法 配置MongoDB的环境变量及好处     今天我们说一下如何配置MongoDB的环境变量及好处,因为每次我们启动MongoDB服务的时候都需要在黑窗口(dos窗口)中切换到MongoDB所在路径,然后执行 net start mongodb 命令来开启服务.所以每次手动开机开启MongoDB服务的时候都特别的麻烦,为了解决这个问题.我们可以将MongoDB配置到系统环境变量中. 下次在开机的时候可以直接打开黑窗口或者以管理员

Windows服务创建及安装

原文:Windows服务创建及安装 我们将研究如何创建一个作为Windows服务的应用程序.内容包含什么是Windows服务,如何创建.安装和调试它们.会用到System.ServiceProcess.ServiceBase命名空间的类.什么是Windows服务? Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合.它没有用户界面,并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件日志.计算机启动时,服务会自动开始运行.它们不要用户一定登录才运行,

用.NET创建Windows服务

window|创建 我们将研究如何创建一个作为Windows服务的应用程序.内容包含什么是Windows服务如何创建.安装和调试它们.会用到System.ServiceProcess.ServiceBase命名空间的类.  什么是Windows服务 Windows服务应用程序是一种需要长期运行的应用程序它对于服务器环境特别适合.它没有用户界面并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件日志.计算机启动时服务会自动开始运行.它们不要用户一定登录才运行它们能在包括这个系统内的

C# windows服务 调用OCX控件问题请教,急求大牛帮忙!

问题描述 需求:我们有一套专门连接设备的windows服务程序,现需要接入一种新设备,设备方提供了三个OCX控件供我们调用.测试程序:一.新建了一个类库(此处我称"设备封装库"),封装OCX控件:1.新建一个窗体,并拖动ocx控件到窗体.2.仿照窗体中实例化控件的方法,对外提供了控件实例化的方法(此处称"实例化方法A").二.创建一个windows服务程序,该服务程序调用"设备封装库",并调用里面"实例化方法A".测试程序出现

新建了一个windows服务,关机再开机能够自启动,但是用cmd命令行创建此服务需要手动启动

问题描述 有没有什么方法,创建此windows服务之后,不用手动启动,一运行此windows服务,它就自启动了?现在这个windows方法,运行完毕之后,需要手动去启动,但是关机开机之后他能自启动,我想要的是,运行完毕之后能达到像开机关机之后自启动这个情况,希望各位大神指点 解决方案 本帖最后由 a981583536 于 2016-07-11 13:05:10 编辑解决方案二:自己去看下Program.cs的Main函数吧默认如果是服务的话通过ServiceBase.Run来运行你可以自己加个参