Windows服务管理

下面是一个c#写的Windows服务管理类,包括服务的启动、停止、安装、卸载等常用功能

/*

 * 

 * 版本: 2.0.50727.3053 

 * 命名空间: Zhouyz.WindowsService

 * 文件名: ServiceControlHelp.cs

 * 

 * 创 建 人:zhouyz

 * 创建时间:2010-9-11 14:07:54 

 * 联系方式:http://www.cnblogs.com/zhouyz

 * 

 * 

 * 说明:

 * 

 * 修 改 人:

 * 联系方式:

 * 修改次数:

 * 修改时间:

 * 修改内容:

 * 

 * 

 * 

 */


using System;

using System.Collections;

using System.Configuration.Install;

using System.ServiceProcess;


namespace Zhouyz.WindowsService

{

    /// <summary>

    /// 服务控制类

    /// </summary>

    public class ServiceControlHelp

    {

        public ServiceControlHelp(string aServerName)

        {

            this._serverName = aServerName;

            ServiceController[] service = ServiceController.GetServices();

            for (int i = 0; i < service.Length; i++)

            {

                if (service[i].DisplayName.ToUpper().Equals(aServerName.ToUpper()))

                {

                    _serverCnt = service[i];

                }

            }

        }

        private string _serverName = "IIS Admin";

        private ServiceController _serverCnt = null;


        /// <summary>

        /// 服务名字

        /// </summary>

        public string ServerName

        {

            get

            {

                return _serverName;

            }

        }


        /// <summary>

        /// 服务是否启动

        /// </summary>

        public bool IsStart

        {

            get

            {

                if (_serverCnt.Status == ServiceControllerStatus.Running)

                {

                    return true;

                }

                return false;

            }

        }


        

        /// <summary>

        /// 安装服务

        /// </summary>

        /// <param name="stateSaver"> 服务名信息</param>

        /// <param name="filepath">安装服务路径</param>

        public  void InstallService(IDictionary aStateSaver, string aServiceExePath)

        {

            try

            {

                System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(_serverName);

                if (!IsExisted())

                {

                    AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();

                    myAssemblyInstaller.UseNewContext = true;

                    myAssemblyInstaller.Path = aServiceExePath;

                    myAssemblyInstaller.Install(aStateSaver);

                    myAssemblyInstaller.Commit(aStateSaver);

                    myAssemblyInstaller.Dispose();

                    service.Start();

                }

                else

                {

                    if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending)

                    {

                        service.Start();

                    }

                }

            }

            catch (Exception ex)

            {

                throw new Exception("服务安装发生异常\n" + ex.Message);

            }

        }


        /// <summary>

        /// 卸载windows服务

        /// </summary>

        /// <param name="filepath">服务路径</param>

        public  void UnInstallService(string aServiceExePath)

        {

            try

            {

                if (IsExisted())

                {

                    AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();

                    myAssemblyInstaller.UseNewContext = true;

                    myAssemblyInstaller.Path = aServiceExePath;

                    myAssemblyInstaller.Uninstall(null);

                    myAssemblyInstaller.Dispose();

                }

            }

            catch (Exception ex)

            {

                throw new Exception("服务卸载发生异常\n" + ex.Message);

            }

        }

        

        /// <summary>

        /// 检查服务是否存在

        /// </summary>

        /// <returns></returns>

        public bool IsExisted()

        {

            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController s in services)

            {

                if (s.ServiceName.Trim () == _serverName.Trim ())

                {

                    return true;

                }

            }

            return false;

        }



        /// <summary>

        /// 服务开始启动

        /// </summary>

        public void Start()

        {

            _serverCnt.Start();

        }


        /// <summary>

        /// 服务停止

        /// </summary>

        public void Stop()

        {

            _serverCnt.Stop();

        }


        /// <summary>

        /// 服务暂停

        /// </summary>

        public void Pause()

        {

            _serverCnt.Pause();

        }


        /// <summary>

        /// 服务继续

        /// </summary>

        public void Continue()

        {

            _serverCnt.Continue();

        }

    }

}

 

###################################################API管理服务的安装与卸载###################

public class ServiceInstall

{


    [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();


    ///     

    /// 安装和运行   

    /// /// C#安装程序路径.   

    /// /// 服务名   

    /// /// 服务显示名称.   

    /// /// 服务安装是否成功.   

    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;

        }

    }

    ///     

    /// 反安装服务.  

    /// ///     

    /// 服务名.    

    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;

    }

posted @ 2010-09-13 11:14  星释天狼  阅读(276)  评论(0)    收藏  举报