Example #1
0
        protected void imagePlay_Click(object sender, ImageClickEventArgs e)
        {
            if (PreWarmUp.Started == DateTime.MinValue)
            {
                System.Security.Principal.WindowsImpersonationContext impersonationContext;
                impersonationContext =
                    ((System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity).Impersonate();

                IISHelpers.SetAutoStartProvider();
                IISHelpers.SetAutoStart(HttpContext.Current.Request.ApplicationPath, true);

                impersonationContext.Undo();

                Thread.Sleep(1000); // allow IIS to warmup.
                Response.Redirect("./");
                return;
            }


            this.ServiceState = EnumServiceState.Started;
            if (OnChangeServiceState != null)
            {
                OnChangeServiceState(this, e);
            }
        }
Example #2
0
 protected void imagePause_Click(object sender, ImageClickEventArgs e)
 {
     this.ServiceState = EnumServiceState.Paused;
     if (OnChangeServiceState != null)
     {
         OnChangeServiceState(this, e);
     }
 }
        /// <summary>
        /// 遍历从属服务
        /// </summary>
        /// <param name="serviceHandle"></param>
        /// <param name="state">选择性遍历(活动、非活动、全部)</param>
        private static string[] EnumDependentServices(IntPtr serviceHandle, EnumServiceState state)
        {
            int bytesNeeded   = 0; //存放从属服务的空间大小,由API返回
            int numEnumerated = 0; //从属服务数,由API返回

            //先尝试以空结构获取,如获取成功说明从属服务为空,否则拿到上述俩值
            if (Win32Class.EnumDependentServices(serviceHandle, state, IntPtr.Zero, 0, ref bytesNeeded, ref numEnumerated))
            {
                return(new string[0]);
            }
            if (Marshal.GetLastWin32Error() != 0xEA) //仅当错误值不是大小不够(ERROR_MORE_DATA)时才抛异常
            {
                throw new Win32Exception();
            }

            //在非托管区域创建指针
            IntPtr structsStart = Marshal.AllocHGlobal(new IntPtr(bytesNeeded));

            try
            {
                //往上述指针处塞存放从属服务的结构组,每个从属服务是一个结构
                if (!Win32Class.EnumDependentServices(serviceHandle, state, structsStart, bytesNeeded, ref bytesNeeded, ref numEnumerated))
                {
                    throw new Win32Exception();
                }

                string[] dependentServices   = new string[numEnumerated];
                int      sizeOfStruct        = Marshal.SizeOf(typeof(Win32Class.ENUM_SERVICE_STATUS)); //每个结构的大小
                long     structsStartAsInt64 = structsStart.ToInt64();
                for (int i = 0; i < numEnumerated; i++)
                {
                    Win32Class.ENUM_SERVICE_STATUS structure = new Win32Class.ENUM_SERVICE_STATUS();
                    IntPtr ptr = new IntPtr(structsStartAsInt64 + i * sizeOfStruct); //根据起始指针、结构次序和结构大小推算各结构起始指针
                    Marshal.PtrToStructure(ptr, structure);                          //根据指针拿到结构
                    dependentServices[i] = structure.serviceName;                    //从结构中拿到服务名
                }

                return(dependentServices);
            }
            finally
            {
                Marshal.FreeHGlobal(structsStart);
            }
        }
 public static extern bool EnumDependentServices(IntPtr serviceHandle, EnumServiceState serviceState, IntPtr bufferOfENUM_SERVICE_STATUS, int bufSize, ref int bytesNeeded, ref int numEnumerated);
Example #5
0
        public EnumServiceState GetState()
        {
            EnumServiceState res = EnumServiceState.Runned;

            return(res);
        }
Example #6
0
 public static extern bool EnumDependentServices(IntPtr serviceHandle, EnumServiceState serviceState, IntPtr bufferOfENUM_SERVICE_STATUS, int bufSize, ref int bytesNeeded, ref int numEnumerated);
Example #7
0
 /// <summary>
 /// 遍历从属服务
 /// </summary>
 /// <param name="serviceHandle"></param>
 /// <param name="state">选择性遍历(活动、非活动、全部)</param>
 private static string[] EnumDependentServices(IntPtr serviceHandle, EnumServiceState state)
 {
     int bytesNeeded = 0; //存放从属服务的空间大小,由API返回
     int numEnumerated = 0; //从属服务数,由API返回
     //先尝试以空结构获取,如获取成功说明从属服务为空,否则拿到上述俩值
     if (Win32Class.EnumDependentServices(serviceHandle, state, IntPtr.Zero, 0, ref bytesNeeded, ref numEnumerated))
     {
         return new string[0];
     }
     if (Marshal.GetLastWin32Error() != 0xEA) //仅当错误值不是大小不够(ERROR_MORE_DATA)时才抛异常
     {
         throw new Win32Exception();
     }
     //在非托管区域创建指针
     IntPtr structsStart = Marshal.AllocHGlobal(new IntPtr(bytesNeeded));
     try
     {
         //往上述指针处塞存放从属服务的结构组,每个从属服务是一个结构
         if (!Win32Class.EnumDependentServices(serviceHandle, state, structsStart, bytesNeeded, ref bytesNeeded, ref numEnumerated))
         {
             throw new Win32Exception();
         }
         string[] dependentServices = new string[numEnumerated];
         int sizeOfStruct = Marshal.SizeOf(typeof(Win32Class.ENUM_SERVICE_STATUS)); //每个结构的大小
         long structsStartAsInt64 = structsStart.ToInt64();
         for (int i = 0; i < numEnumerated; i++)
         {
             Win32Class.ENUM_SERVICE_STATUS structure = new Win32Class.ENUM_SERVICE_STATUS();
             IntPtr ptr = new IntPtr(structsStartAsInt64 + i * sizeOfStruct); //根据起始指针、结构次序和结构大小推算各结构起始指针
             Marshal.PtrToStructure(ptr, structure); //根据指针拿到结构
             dependentServices[i] = structure.serviceName; //从结构中拿到服务名
         }
         return dependentServices;
     }
     finally
     {
         Marshal.FreeHGlobal(structsStart);
     }
 }