Since I wanted to learn more about how this control worked, I decided to use reflector to poke around. Here is the small amount of info I discovered of the items in the list:
public class Program { static void Main(string[] args) { DiscoverAppPools(); } public class AppPoolInfo { public string Name { get; set; } public string IISObjectName { get; set; } public IdentityType IdentityType { get; set; } public string Username { get; set; } } //Queries the farm to find the list of AppPools to display in an IisWebServiceApplicationPoolSection control public static void DiscoverAppPools() { ListdiscoveredAppPools = new List (); Assembly assembly = Assembly.Load("Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"); Type typeSPIisWebServiceSettings = assembly.GetType("Microsoft.SharePoint.Administration.SPIisWebServiceSettings"); /* * There are a few other interesting properties that we aren't pulling, but might be handy to peek at. * oSettings.IisSiteName * oSettings.HttpPort * oSettings.HttpsPort * oAppPool.Id * oAppPool.Status * oAppPool.ProcessAccount.SecurityIdentifier.Value */ object oSettings = SPFarm.Local.GetObject("SharePoint Web Services", SPFarm.Local.Id, typeSPIisWebServiceSettings); if (oSettings != null) { Type typeSPIisWebServiceApplicationPoolCollection = assembly.GetType("Microsoft.SharePoint.Administration.SPIisWebServiceApplicationPoolCollection"); ConstructorInfo constructor = typeSPIisWebServiceApplicationPoolCollection.GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeSPIisWebServiceSettings }, null); object oAppPools = null; if (constructor != null) { oAppPools = constructor.Invoke(new object[] {oSettings}); if (oAppPools != null) { Type typeSPIisWebServiceApplicationPool = assembly.GetType("Microsoft.SharePoint.Administration.SPIisWebServiceApplicationPool"); IEnumerable appPools = (IEnumerable)oAppPools; if (appPools != null) { IEnumerator enumerator = appPools.GetEnumerator(); while (enumerator.MoveNext()) { AppPoolInfo api = new AppPoolInfo(); object oAppPool = enumerator.Current; PropertyInfo piName = typeSPIisWebServiceApplicationPool.GetProperty("Name"); if (piName != null) { api.Name = (string)piName.GetValue(oAppPool, null); } PropertyInfo piIisObjectName = typeSPIisWebServiceApplicationPool.GetProperty("IisObjectName", BindingFlags.Instance | BindingFlags.NonPublic); if (piIisObjectName != null) { api.IISObjectName = (string)piIisObjectName.GetValue(oAppPool, null); } //not terribly useful; really only gives a SID. Maybe good if you wanted their credentials as a SecureString //PropertyInfo piProcessAccount = typeSPIisWebServiceApplicationPool.GetProperty("ProcessAccount"); //if (piProcessAccount != null) //{ // object o = piProcessAccount.GetValue(oAppPool, null); //} PropertyInfo piCurrentIdentityType = typeSPIisWebServiceApplicationPool.GetProperty("CurrentIdentityType", BindingFlags.Instance | BindingFlags.NonPublic); if (piCurrentIdentityType != null) { api.IdentityType = (IdentityType)piCurrentIdentityType.GetValue(oAppPool, null); } PropertyInfo piManagedAccount = typeSPIisWebServiceApplicationPool.GetProperty("ManagedAccount", BindingFlags.Instance | BindingFlags.NonPublic); if (piManagedAccount != null) { object oManagedAccount = piManagedAccount.GetValue(oAppPool, null); if (oManagedAccount != null) { PropertyInfo piUsername = oManagedAccount.GetType().GetProperty("Username"); if (piUsername != null) { api.Username = (string)piUsername.GetValue(oManagedAccount, null); } } } discoveredAppPools.Add(api); } } } } } Console.WriteLine("SharePoint knows about the following AppPools"); foreach(AppPoolInfo api in discoveredAppPools) { Console.WriteLine("\nAppPool: {0}", api.Name); Console.WriteLine(" IIS Object Name: {0}", api.IISObjectName); Console.WriteLine(" Identity Type: {0}", api.IdentityType); Console.WriteLine(" Username: {0}", api.Username ); } } }
No comments:
Post a Comment