Mega Code Archive

 
Categories / C# / Windows
 

IIS helper

using System; using System.Collections; using System.Diagnostics; using System.DirectoryServices; using System.Management; using System.Net; using System.ServiceProcess; using Microsoft.Web.Administration; using Microsoft.Win32; namespace harbar.net.Utils.APM {     internal static class Helper     {         #region Private Properties         private static string _iisRegKey = @"Software\Microsoft\InetStp";         private static string _metabasePath = @"IIS://localhost/w3svc/apppools";         private static string _stsadmPath = Environment.GetEnvironmentVariable("commonprogramfiles") + @"\Microsoft Shared\web server extensions\12\BIN\stsadm";         private static string _wmiQuery = @"SELECT * FROM Win32_Process WHERE Name = 'w3wp.exe'";         #endregion         #region Public Methods         // detects IIS6 and above         public static bool IisInstalled()         {             try             {                 using (RegistryKey iisKey = Registry.LocalMachine.OpenSubKey(_iisRegKey))                 {                     return (int)iisKey.GetValue("MajorVersion") >= 6;                 }             }             catch             {                 return false;             }         }         // returns status of web service         public static string W3svcStatus()         {             try             {                 using (ServiceController serviceController = new ServiceController("w3svc"))                 {                     return serviceController.Status.ToString();                 }             }             catch (Exception ex)             {                 throw ex;             }         }         // shim to prevent Assembly load failure on Windows 2003         public static AppPools GetAppPools()         {             return IsIIS7() ? GetAppPoolsIIS7() : GetAppPoolsIIS6();         }         // shim to prevent Assembly load failure on Windows 2003         public static ArrayList GetAppPoolNames()         {             return IsIIS7() ? GetAppPoolNamesIIS7() : GetAppPoolNamesIIS6();         }         // shim to prevent Assembly load failure on Windows 2003         public static void RecycleAppPool(string name)         {             if (IsIIS7())             {                 RecycleAppPoolIIS7(name);             }             else             {                 RecycleAppPoolIIS6(name);             }         }         // restarts an NT service using it's short name         public static void RestartService(string name)         {             try             {                 using (ServiceController serviceController = new ServiceController(name))                 {                     serviceController.Stop();                     serviceController.WaitForStatus(ServiceControllerStatus.Stopped);                     serviceController.Start();                     serviceController.WaitForStatus(ServiceControllerStatus.Running);                 }             }             catch (Exception ex)             {                 throw ex;             }         }         // executes iisreset.exe         public static void IisReset()         {             try             {                 using (Process p = new Process())                 {                     p.StartInfo.FileName = "iisreset.exe";                     p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;                     p.Start();                     p.WaitForExit();                 }             }             catch (Exception ex)             {                 throw ex;             }         }         // executes stsadm.exe with no arguments         public static void ExecuteStsAdm()         {             try             {                 using (Process p = new Process())                 {                     p.StartInfo.FileName = _stsadmPath;                     p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;                     p.Start();                     p.WaitForExit();                 }             }             catch (Exception ex)             {                 if (ex.Message == "The system cannot find the file specified")                 {                     throw new Exception("Could not find STSADM, SharePoint may not be installed.");                 }                 throw ex;             }         }         // performs a HTTP GET for a given URL         public static void HttpGet(string url)         {             try             {                 WebRequest request = WebRequest.Create(url);                 request.Credentials = CredentialCache.DefaultCredentials;                 request.Method = "GET";                 using (WebResponse response = request.GetResponse())                 {                     if (response.ContentLength <= 0)                     {                         throw new Exception("No content at " + url);                     }                     response.Close();                 }             }             catch (Exception ex)             {                 throw ex;             }         }         // writes an application event log         public static void WriteEvent(Exception ex)         {             string source = "APM2";             string log = "Application";             string entry = "An error occured in Application Pool Manager.\r\n\r\nMessage:\r\n" + ex.Message + "\r\n\r\nStackTrace:\r\n" + ex.StackTrace;             if (!EventLog.SourceExists(source))             {                 EventLog.CreateEventSource(source, log);             }             EventLog.WriteEntry(source, entry, EventLogEntryType.Error);         }         #endregion         #region Private Methods         // determines if IIS7 is installed         private static bool IsIIS7()         {             try             {                 using (RegistryKey iisKey = Registry.LocalMachine.OpenSubKey(_iisRegKey))                 {                     return (int)iisKey.GetValue("MajorVersion") == 7;                 }             }             catch (Exception ex)             {                 throw ex;             }         }         // uses WMI to get Process IDs (for legacy IIS6)         private static string GetProcessIDs(string appPoolName)         {             string ret = null;             try             {                 using (ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", _wmiQuery))                 {                     foreach (ManagementObject mo in mos.Get())                     {                         if (mo["CommandLine"].ToString().Contains(appPoolName))                         {                             ret += mo["ProcessId"].ToString() + ",";                         }                     }                 }             }             catch (Exception ex)             {                 ret = null;                 throw ex;             }             return ret;         }         // translates state into string (for legacy IIS6)         private static string GetAppPoolState(int state)         {             string ret = null;             try             {                 switch (state)                 {                     case 1:                         ret = "Starting";                         break;                     case 2:                         ret = "Started";                         break;                     case 3:                         ret = "Stopping";                         break;                     case 0:                         ret = "Stopped";                         break;                     default:                         ret = "Unknown";                         break;                 }             }             catch (Exception ex)             {                 ret = null;                 throw ex;             }             return ret;         }         // enumerates App Pools (using legacy IIS6 metabase)         private static ArrayList GetAppPoolNamesIIS6()         {             ArrayList ret = new ArrayList();             try             {                 using (DirectoryEntry appPools = new DirectoryEntry(_metabasePath))                 {                     foreach (DirectoryEntry ap in appPools.Children)                     {                         ret.Add(ap.Name);                         ap.Dispose();                     }                 }             }             catch (Exception ex)             {                 ret = null;                 throw ex;             }             return ret;         }         // enumerates App Pools (using Microsoft.Web.Administration)         private static ArrayList GetAppPoolNamesIIS7()         {             ArrayList ret = new ArrayList();             try             {                 using (ServerManager serverManager = new ServerManager())                 {                     foreach (ApplicationPool ap in serverManager.ApplicationPools)                     {                         ret.Add(ap.Name);                     }                 }             }             catch (Exception ex)             {                 ret = null;                 throw ex;             }             return ret;         }         // enumerates App Pools and properties (using legacy IIS6 metabase)         private static AppPools GetAppPoolsIIS6()         {             AppPools ret = new AppPools();             try             {                 using (DirectoryEntry appPools = new DirectoryEntry(_metabasePath))                 {                     foreach (DirectoryEntry ap in appPools.Children)                     {                         AppPool item = new AppPool();                         item.Name = ap.Name;                         item.Status = GetAppPoolState((int)ap.Properties["AppPoolState"].Value);                         item.Pids = GetProcessIDs(ap.Name);                         ap.Dispose();                         ret.Add(item);                     }                 }             }             catch (Exception ex)             {                 ret = null;                 throw ex;             }             return ret;         }         // enumerates App Pools and properties (using Microsoft.Web.Administration)         private static AppPools GetAppPoolsIIS7()         {             AppPools ret = new AppPools();             try             {                 using (ServerManager serverManager = new ServerManager())                 {                     foreach (ApplicationPool ap in serverManager.ApplicationPools)                     {                         AppPool item = new AppPool();                         item.Name = ap.Name;                         item.Status = ap.State.ToString();                         foreach (WorkerProcess wp in ap.WorkerProcesses)                         {                             item.Pids += wp.ProcessId + ",";                         }                         ret.Add(item);                     }                 }             }             catch (Exception ex)             {                 ret = null;                 throw ex;             }             return ret;         }         // recylces app pool (using legacy IIS6 metabase)         private static void RecycleAppPoolIIS6(string name)         {             try             {                 using (DirectoryEntry appPool = new DirectoryEntry(string.Format(_metabasePath + @"/{0}", name)))                 {                     appPool.Invoke("Recycle");                 }             }             catch (Exception ex)             {                 throw ex;             }         }         // recylces app pool (using Microsoft.Web.Administration)         private static void RecycleAppPoolIIS7(string name)         {             try             {                 using (ServerManager serverManager = new ServerManager())                 {                     ApplicationPool ap = serverManager.ApplicationPools[name];                     ap.Recycle();                 }             }             catch (Exception ex)             {                 throw ex;             }         }         #endregion     }     #region AppPool Wrappers     internal class AppPool     {         private string _name;         public string Name         {             get { return _name; }             set { _name = value; }         }         private string _status;         public string Status         {             get { return _status; }             set { _status = value; }         }         private string _pids;         public string Pids         {             get { return _pids; }             set { _pids = value; }         }     }     internal class AppPools : System.Collections.CollectionBase     {         public int Add(AppPool item)         {             return List.Add(item);         }         public void Insert(int index, AppPool item)         {             List.Insert(index, item);         }         public void Remove(AppPool item)         {             List.Remove(item);         }         public bool Contains(AppPool item)         {             return List.Contains(item);         }         public int IndexOf(AppPool item)         {             return List.IndexOf(item);         }         public void CopyTo(AppPool[] array, int index)         {             List.CopyTo(array, index);         }         public AppPool this[int index]         {             get { return (AppPool)List[index]; }             set { List[index] = value; }         }     }     #endregion }