/* A basic C# Component that provides 2 helper classes dispCOMWrapper --> Helper class that uses reflection to make late bound calls on a component's default interface. COMPlusAdminHelper --> Wraps the functionality that talks to the COM+ Admin objects, not all of its methods are used though. Viz: deleteComPlusApp which could delete an app from your system given the app's name as a parameter.(USE with extreme caution !) */ namespace COMHelperSpace { using System; using System.Xml; using System.Reflection; public class dispCOMWrapper { private Object m_oCOM; private Type m_Type; public dispCOMWrapper (Object o) { this.m_oCOM = o; this.m_Type = this.m_oCOM.GetType(); } public dispCOMWrapper (String strProgId) { Type typ; typ = Type.GetTypeFromProgID(strProgId); this.m_oCOM = Activator.CreateInstance(typ); this.m_Type = this.m_oCOM.GetType(); } public Object getProperty(String strPropName) { Object oPropValue = this.m_Type.InvokeMember(strPropName, BindingFlags.InvokeMethod|BindingFlags.GetProperty, null, this.m_oCOM, new object [] {} ); return oPropValue; } public Object getProperty(String strPropName,String strPropType ) { Object oPropValue = this.m_Type.InvokeMember(strPropName, BindingFlags.InvokeMethod|BindingFlags.GetProperty, null, this.m_oCOM, new object [] {strPropType} ); return oPropValue; } public Object getProperty(String strPropName,int iPropType ) { Object oPropValue = this.m_Type.InvokeMember(strPropName, BindingFlags.InvokeMethod|BindingFlags.GetProperty, null, this.m_oCOM, new object [] {iPropType} ); return oPropValue; } public void setProperty(String strPropName, Object [] args) { this.m_Type.InvokeMember(strPropName, BindingFlags.Default | BindingFlags.SetProperty, null, this.m_oCOM, args ); return; } public Object callMethod(String strMethodName, Object [] args) { Object objRetVal = this.m_Type.InvokeMember(strMethodName, BindingFlags.Default | BindingFlags.InvokeMethod, null, this.m_oCOM, args ); return objRetVal ; } } } namespace COMAdminHelperSpace { using COMHelperSpace; using System; using System.Xml; using System.Reflection; public class COMPlusAdminHelper { private dispCOMWrapper m_oCatalog; private dispCOMWrapper m_oDispColApps; public COMPlusAdminHelper() { m_oCatalog = new dispCOMWrapper("COMAdmin.COMAdminCatalog"); m_oDispColApps = new dispCOMWrapper(m_oCatalog.callMethod("GetCollection" , new Object [] {"Applications"} )); } public bool deleteComPlusApp(String strAppName) { bool blnRetVal = false; m_oDispColApps.callMethod("Populate",new object [] {}); int j = (int)m_oDispColApps.getProperty("Count"), i = 0; while (i < j) { Object objTempApp = m_oDispColApps.getProperty("item", i) ; dispCOMWrapper oDispTempApp = new dispCOMWrapper(objTempApp); //Console.WriteLine(oDispTempApp.getProperty("Name").ToString()); //Console.WriteLine(oDispTempApp.getProperty("Value").ToString()); if (oDispTempApp.getProperty("Name").ToString() == strAppName) { m_oDispColApps.callMethod("Remove",new object [] {i}); m_oDispColApps.callMethod("SaveChanges",new object [] {}); blnRetVal = true; return blnRetVal; } i = i + 1; } return blnRetVal; } public void installComponent(String strAppName, String strComponentPath) { m_oCatalog.callMethod("InstallComponent" , new Object [] {strAppName, strComponentPath, "", ""} ); } public void GenerateReport() { XmlDocument oDocNew = new XmlDocument(); /*Create the main root Applications Element*/ oDocNew.LoadXml(""); XmlDocument oDoc = new XmlDocument(); oDoc.Load ("ComPlusPropertyMap.xml"); DocumentNavigator nav = new DocumentNavigator(oDoc); m_oDispColApps.callMethod("Populate",new object [] {}); int j = (int)m_oDispColApps.getProperty("Count"), i = 0; while (i < j) { Object objTempApp = m_oDispColApps.getProperty("item", i) ; dispCOMWrapper oDispTempApp = new dispCOMWrapper(objTempApp); nav.Select ("/PropertyMap/Application"); nav.MoveToNextSelected(); nav.Select ("PropName"); XmlNode oAppNode; /*Create the Application for every COM+ App*/ oAppNode = oDocNew.CreateNode (XmlNodeType.Element,"Application",""); XmlElement oRootElement = oDocNew.DocumentElement; XmlNode oNewAddedAppNode = oRootElement.AppendChild (oAppNode); XmlNamedNodeMap oNamedNodeMapForApps = oAppNode.Attributes; XmlAttribute oNewAttribute; while (nav.MoveToNextSelected()) { String strAttribName = nav.InnerText.ToString(), strAttribValue; oNewAttribute = oDocNew.CreateAttribute(strAttribName); strAttribValue = oDispTempApp.getProperty("Value",strAttribName).ToString(); oNewAttribute.Value = strAttribValue; oNamedNodeMapForApps.SetNamedItem(oNewAttribute); } //Console.WriteLine(oDocNew.OuterXml.ToString()); dispCOMWrapper m_oDispColComps = new dispCOMWrapper(m_oDispColApps.callMethod("GetCollection" , new Object [] {"Components", oDispTempApp.getProperty("Key")} )); m_oDispColComps.callMethod("Populate",new object [] {}); int k = (int)m_oDispColComps.getProperty("Count"), l = 0; while(l < k) { Object objTempComp = m_oDispColComps.getProperty("item", l) ; dispCOMWrapper oDispTempComp = new dispCOMWrapper(objTempComp); nav.Select ("/PropertyMap/Component"); nav.MoveToNextSelected(); nav.Select ("PropName"); XmlNode oCompNode; /*Create the Component element for every COM+ App*/ oCompNode = oDocNew.CreateNode (XmlNodeType.Element,"Component",""); XmlNode oNewAddedCompNode = oNewAddedAppNode.AppendChild (oCompNode); XmlNamedNodeMap oNamedNodeMapForComps = oCompNode.Attributes; XmlAttribute oNewCompAttribute; XmlNode oCompAttribNode; while (nav.MoveToNextSelected()) { String strCompAttribName = nav.InnerText.ToString(), strCompAttribValue; oCompAttribNode = oDocNew.CreateNode(XmlNodeType.Element,strCompAttribName,""); strCompAttribValue = oDispTempComp.getProperty("Value",strCompAttribName).ToString(); oCompAttribNode.InnerText = strCompAttribValue; oNewAddedCompNode.AppendChild (oCompAttribNode); } l = l + 1; } i = i + 1; } oDocNew.Save ("CompPlusReport.xml"); } } }