C#服务操作类 卸载 查询 停止

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.ServiceProcess;

namespace DeleteTest
{
    internal class Services
    {
        private string _servicePath;
        private string _serviceName;
        private string _serviceDisplayName;

        #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>
        /// <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>
       /// <returns>true   false</returns>
 
        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;
        }

        /// <summary>
        /// 查看服务是否存在
        /// </summary>
        /// <param name="serviceName">服务名称</param>
        /// <returns>true false</returns>
        private bool ServiceIsExisted(string svcName)
        {

            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController s in services)
            {

                if (s.ServiceName == svcName)
                {

                    return true;

                }

            }

            return false;

        }

        /// <summary>
        /// 停止服务
        /// </summary>
        public void StopService(string svcName)
        {
            try
            {
                string m_ServiceName = svcName;
                ServiceController service = new ServiceController(m_ServiceName);
                TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 60);

                //判断服务状态为启用状态才停止,负责会报错
                if (service.Status != ServiceControllerStatus.Stopped &&
                    service.Status != ServiceControllerStatus.StopPending)
                {
                    service.Stop();
                    service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
                }
            }
            catch (Exception)
            {
               
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值