Beispiel #1
0
        public SPServerCollectionInstance(ObjectInstance prototype, SPServerCollection serverCollection)
            : this(prototype)
        {
            if (serverCollection == null)
            {
                throw new ArgumentNullException("serverCollection");
            }

            m_serverCollection = serverCollection;
        }
Beispiel #2
0
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("server");
                dt.Columns.Add("selected", typeof(bool));

                string    epmliveservers = "";
                ArrayList arrServers     = new ArrayList();
                try
                {
                    epmliveservers = SPFarm.Local.Properties["EPMLiveServers"].ToString();
                    foreach (string epmliveserver in epmliveservers.Split(','))
                    {
                        if (epmliveserver != "")
                        {
                            arrServers.Add(epmliveserver);
                        }
                    }
                }
                catch { }

                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    SPServerCollection servers = SPFarm.Local.Servers;
                    foreach (SPServer server in servers)
                    {
                        if (server.Role == SPServerRole.WebFrontEnd || server.Role == SPServerRole.Application)
                        {
                            if (arrServers.Contains(server.Name.ToLower()))
                            {
                                dt.Rows.Add(new object[] { server.Name, true });
                            }
                            else
                            {
                                dt.Rows.Add(new object[] { server.Name, false });
                            }
                        }
                    }
                });

                GvItems.DataSource = dt;
                GvItems.DataBind();
            }
        }
Beispiel #3
0
        private XmlNode GetServersNode(SPServerCollection servers, string nodeName)
        {
            XmlNode serversNode = FarmXml.CreateElement(nodeName);

            AttributeValuePair serverCount;

            serverCount.Attribute = "Count";
            serverCount.Value     = servers.Count.ToString();

            XmlNode countAttribute = FarmXml.CreateAttribute(serverCount.Attribute);

            countAttribute.Value = serverCount.Value;
            serversNode.Attributes.SetNamedItem(countAttribute);

            foreach (SPServer deployedServer in servers)
            {
                XmlNode deployedServerNode = FarmXml.CreateElement("Server");
                List <AttributeValuePair> serverAttributes = SPAttributes.GetSPServerAttributes(deployedServer);
                foreach (AttributeValuePair serverAttribute in serverAttributes)
                {
                    deployedServerNode.Attributes.SetNamedItem(GetXmlAttribute(serverAttribute));
                }

                // Get Server's service instances
                SPServiceInstanceCollection serverServiceInstances = deployedServer.ServiceInstances;
                XmlNode serverServicesNode = GetServerServiceInstanceNode(serverServiceInstances);
                deployedServerNode.AppendChild(serverServicesNode);
                serversNode.AppendChild(deployedServerNode);

                // Get Database Service Instances
                XmlNode databaseServiceInstances = GetDatabaseServiceInstancesNode(serverServiceInstances);
                if (databaseServiceInstances != null)
                {
                    serversNode.AppendChild(databaseServiceInstances);
                }
            }
            return(serversNode);
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request["delete"] != "")
            {
                EPMLiveCore.CoreFunctions.deleteKey(Request["delete"]);
            }


            MenuTemplate propertyNameListMenu = new MenuTemplate();

            propertyNameListMenu.ID = "PropertyNameListMenu";

            MenuItemTemplate testMenu = new MenuItemTemplate(

                "Delete Key", "/_layouts/images/delete.gif");

            testMenu.ClientOnClickNavigateUrl = "features.aspx?delete=%NAME%";

            propertyNameListMenu.Controls.Add(testMenu);

            this.Controls.Add(propertyNameListMenu);



            DataTable dt = new DataTable();

            dt.Columns.Add("feature");
            dt.Columns.Add("company");
            dt.Columns.Add("features");
            dt.Columns.Add("users");
            dt.Columns.Add("servers");
            dt.Columns.Add("dtcreated");
            dt.Columns.Add("expiration");

            int servercount = 0;

            string[] features = EPMLiveCore.CoreFunctions.featureList();
            foreach (string feature in features)
            {
                string[] featureData = EPMLiveCore.CoreFunctions.Decrypt(feature, "jLHKJH5416FL>1dcv3#I").Split('\n');
                if (featureData[2] == "0")
                {
                    featureData[2] = "Unlimited";
                }
                string[] featureNames    = featureData[1].Split(',');
                string   featureRealName = "";
                string   servers         = "";
                try
                {
                    servers      = featureData[5];
                    servercount += int.Parse(servers);
                }catch {}
                foreach (string featureName in featureNames)
                {
                    featureRealName += CoreFunctions.getFeatureName(featureName);
                }
                if (featureRealName.Length > 0)
                {
                    featureRealName = featureRealName.Substring(4);
                }

                if (featureData[0][0] == '*')
                {
                    dt.Rows.Add(new string[] { HttpUtility.UrlEncode(feature), featureData[2], featureRealName, featureData[2], servers, DateTime.Parse(featureData[1]).ToShortDateString(), featureData[4] });
                }
                else
                {
                    dt.Rows.Add(new string[] { HttpUtility.UrlEncode(feature), featureData[0], featureRealName, featureData[2], servers, featureData[3], featureData[4] });
                }
            }

            GvItems.DataSource = dt;
            GvItems.DataBind();


            DataTable dt2 = new DataTable();

            dt2.Columns.Add("featureid");
            dt2.Columns.Add("feature");
            dt2.Columns.Add("quantity");
            dt2.Columns.Add("active");

            SortedList acts = Act.GetAllAvailableLevels(out actType);

            ArrayList arrUsers = new ArrayList();

            if (actType == 3)
            {
                MenuTemplate propertyNameListMenu2 = new MenuTemplate();
                propertyNameListMenu2.ID = "PropertyNameListMenu2";
                MenuItemTemplate testMenu2 = new MenuItemTemplate(
                    "Manage Users", "");
                testMenu2.ClientOnClickScript = "managelicv2('%NAME%');";
                propertyNameListMenu2.Controls.Add(testMenu2);
                this.Controls.Add(propertyNameListMenu2);

                arrUsers = CoreFunctions.getFeatureUsers(1000);
                if (arrUsers.Count == 1 && arrUsers[0].ToString() == "")
                {
                    arrUsers = new ArrayList();
                }
            }
            else
            {
                MenuTemplate propertyNameListMenu2 = new MenuTemplate();
                propertyNameListMenu2.ID = "PropertyNameListMenu2";
                MenuItemTemplate testMenu2 = new MenuItemTemplate(
                    "Manage Users", "");
                //testMenu2.ClientOnClickNavigateUrl = "users.aspx?feature=%NAME%";
                testMenu2.ClientOnClickScript = "managelic('%NAME%');";
                propertyNameListMenu2.Controls.Add(testMenu2);
                this.Controls.Add(propertyNameListMenu2);
            }

            foreach (DictionaryEntry de in acts)
            {
                if (actType == 3)
                {
                    int counter = 0;
                    foreach (string user in arrUsers)
                    {
                        string[] sUserInfo = user.Split(':');
                        try
                        {
                            if (sUserInfo[1] == de.Key.ToString())
                            {
                                counter++;
                            }
                        }
                        catch { }
                    }

                    string count = de.Value.ToString();
                    if (count == "0")
                    {
                        count = "Unlimited";
                    }

                    dt2.Rows.Add(new string[] { de.Key.ToString(), Act.GetFeatureNameV2(de.Key.ToString()), count, counter.ToString() });
                }
                else
                {
                    CoreFunctions.getFeatureLicenseUserCount(int.Parse(de.Key.ToString()));

                    string count = de.Value.ToString();
                    if (count == "0")
                    {
                        count = "Unlimited";
                    }
                    dt2.Rows.Add(new string[] { de.Key.ToString(), Act.GetFeatureName(de.Key.ToString()), count, CoreFunctions.getFeatureUsers(int.Parse(de.Key.ToString())).Count.ToString() });
                }
            }

            gvFeatures.DataSource = dt2;
            gvFeatures.DataBind();

            lblFarmId.Text = SPFarm.Local.Id.ToString();

            string epmliveservers = "";

            try
            {
                epmliveservers = SPFarm.Local.Properties["EPMLiveServers"].ToString();
            }
            catch { }
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPServerCollection servers = SPFarm.Local.Servers;
                int farmservercount        = 0;
                foreach (SPServer server in servers)
                {
                    if (server.Role == SPServerRole.WebFrontEnd || server.Role == SPServerRole.Application)
                    {
                        farmservercount++;
                    }
                }

                if (farmservercount > servercount && servercount != 0 && epmliveservers != "")
                {
                    lblWarning.Text = "<b>Warning:</b> It appears you have may have more servers in your farm than your key allows. To select specific servers go to the <a href=\"servers.aspx\">EPM Live Servers</a> page.";
                }
            });
        }
Beispiel #5
0
        static void GatherData(string action)
        {
            ResetDataTable();

            //loop for all machines in the farm
            SPFarm             myFarm     = SPFarm.Local;
            SPServerCollection serverColl = myFarm.Servers;

            if (serverColl != null && serverColl.Count > 0)
            {
                i_machine = 0;
                foreach (SPServer spserver in serverColl)
                {
                    if (spserver.Role != SPServerRole.Invalid)
                    {
                        i_machine++;
                        string m = spserver.Address;
                        switch (action)
                        {
                        case "Local Admins":
                            //Schema
                            if (i_machine == 1)
                            {
                                dt.Columns.Clear();
                                dt.Columns.Add("User");
                            }
                            dt.Columns.Add(m);

                            //Data source
                            DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + m + ",Computer");
                            DirectoryEntry admGroup     = localMachine.Children.Find("Administrators", "group");
                            object         members      = admGroup.Invoke("members", null);

                            //Ensure 1 row-per-service (dynamic height)
                            foreach (object groupMember in (IEnumerable)members)
                            {
                                DirectoryEntry member = new DirectoryEntry(groupMember);
                                bool           local  = false;
                                if (member.Path.ToUpper().Contains(m.ToUpper()))
                                {
                                    local = true;
                                }
                                string user = member.Path.ToUpper().Replace("WINNT://", "").Replace("/", "\\").Replace(Environment.UserDomainName + "\\" + m.ToUpper(), m.ToUpper());
                                //Assume row does not exist
                                bool rowExists = false;
                                foreach (DataRow row in dt.Rows)
                                {
                                    if (row[0].ToString() == user.ToString())
                                    {
                                        rowExists = true;
                                    }
                                }
                                if (!rowExists)
                                {
                                    DataRow row = dt.NewRow();
                                    row[0] = user;
                                    dt.Rows.Add(row);
                                }
                            }

                            //Populate most recent machine column
                            foreach (object groupMember in (IEnumerable)members)
                            {
                                DirectoryEntry member = new DirectoryEntry(groupMember);
                                bool           local  = false;
                                if (member.Path.ToUpper().Contains(m.ToUpper()))
                                {
                                    local = true;
                                }
                                string user = member.Path.ToUpper().Replace("WINNT://", "").Replace("/", "\\").Replace(Environment.UserDomainName + "\\" + m.ToUpper(), m.ToUpper());
                                foreach (DataRow row in dt.Rows)
                                {
                                    if (row[0].ToString().ToUpper() == user.ToString().ToUpper())
                                    {
                                        row[dt.Columns.Count - 1] = (local ? "L" : "D");
                                    }
                                }
                            }
                            break;

                        case "WEB PART files in INETPUB":
                            string[] webpart = Directory.GetFiles(@"\\" + m + @"\c$\inetpub\wwwroot", "*.webpart", SearchOption.AllDirectories);
                            string[] dwp     = Directory.GetFiles(@"\\" + m + @"\c$\inetpub\wwwroot", "*.dwp", SearchOption.AllDirectories);
                            string[] files   = new string[webpart.Length + dwp.Length];
                            Array.Copy(webpart, 0, files, 0, webpart.Length);
                            Array.Copy(dwp, 0, files, webpart.Length, dwp.Length);

                            if (i_machine == 1)
                            {
                                dt.Columns.Add("WEB PART File");
                            }
                            foreach (string f in files)
                            {
                                DataRow row = dt.NewRow();
                                row["Machine"]       = m;
                                row["WEB PART File"] = f.Replace(@"\\" + m + @"\", "");;
                                dt.Rows.Add(row);
                            }
                            if (files.GetUpperBound(0) == -1)
                            {
                                DataRow row = dt.NewRow();
                                row["Machine"]       = m;
                                row["WEB PART File"] = "None found";
                                dt.Rows.Add(row);
                            }
                            break;

                        case "FEATURE folder in SP hive":
                            string[] dirs = Directory.GetDirectories(@"\\" + m + @"\c$\program files\common files\microsoft shared\web server extensions\14\template\features", "*", SearchOption.TopDirectoryOnly);
                            if (dt.Columns.Count == 1)
                            {
                                dt.Columns.Add("Feature Dir");
                            }
                            foreach (string d in dirs)
                            {
                                DataRow row = dt.NewRow();
                                row["Machine"]     = m;
                                row["Feature Dir"] = d.Replace(@"\\" + m + @"\", "");;
                                dt.Rows.Add(row);
                            }
                            break;

                        case "Global Assembly Cache (GAC)":
                            if (dt.Columns.Count == 1)
                            {
                                dt.Columns.Add("GAC File");
                            }
                            files = Directory.GetFiles(@"\\" + m + @"\C$\windows\assembly\gac", "*.dll", SearchOption.AllDirectories);
                            foreach (string f in files)
                            {
                                DataRow row = dt.NewRow();
                                row["Machine"]  = m;
                                row["GAC File"] = f.Replace(@"\\" + m + @"\", "");
                                dt.Rows.Add(row);
                            }
                            break;

                        case "Logical Disks":
                            if (i_machine == 1)
                            {
                                dt.Columns.Add("Logical Disk");
                                dt.Columns.Add("GB Free");
                                dt.Columns.Add("GB Total Size");
                            }
                            ConnectionOptions          opt        = new ConnectionOptions();
                            ObjectQuery                oQuery     = new ObjectQuery("SELECT Size, FreeSpace, Name, FileSystem FROM Win32_LogicalDisk WHERE DriveType = 3");
                            ManagementScope            scope      = new ManagementScope("\\\\" + m + "\\root\\cimv2", opt);
                            ManagementObjectSearcher   moSearcher = new ManagementObjectSearcher(scope, oQuery);
                            ManagementObjectCollection collection = moSearcher.Get();
                            foreach (ManagementObject res in collection)
                            {
                                decimal size      = Convert.ToDecimal(res["Size"]) / 1024 / 1024 / 1024;
                                decimal freeSpace = Convert.ToDecimal(res["FreeSpace"]) / 1024 / 1024 / 1024;
                                DataRow row       = dt.NewRow();
                                row["Machine"]       = m;
                                row["Logical Disk"]  = res["Name"];
                                row["GB Free"]       = Decimal.Round(freeSpace, 1);
                                row["GB Total Size"] = Decimal.Round(size, 1);
                                dt.Rows.Add(row);
                            }
                            break;

                        case "File Versions":
                            //Schema
                            if (i_machine == 1)
                            {
                                dt.Columns.Clear();
                                dt.Columns.Add("File Name");
                            }
                            dt.Columns.Add(m);

                            //Local SPFarm major versoin (14,15,etc.)
                            string SPFarmVersion = SPFarm.Local.BuildVersion.Major.ToString();

                            //Target files on remote C$
                            string[] targetFiles = config.FileVersion;

                            //Ensure 1 row-per-file (fixed height)
                            foreach (string f in targetFiles)
                            {
                                bool rowExists = false;
                                foreach (DataRow row in dt.Rows)
                                {
                                    if (row[0].ToString() == String.Format(f, SPFarmVersion))
                                    {
                                        rowExists = true;
                                    }
                                }
                                if (!rowExists)
                                {
                                    DataRow row = dt.NewRow();
                                    row[0] = String.Format(f, SPFarmVersion);
                                    dt.Rows.Add(row);
                                }
                            }

                            //Populate most recent machine column
                            foreach (DataRow row in dt.Rows)
                            {
                                string ver = "";
                                //get remote C$ file version
                                try
                                {
                                    //reformat UNC
                                    string filepath = "\\\\" + m + "\\" + row[0].ToString();

                                    //get file version
                                    FileVersionInfo finfo = FileVersionInfo.GetVersionInfo(filepath);
                                    ver = finfo.FileVersion;
                                }
                                catch (System.IO.FileNotFoundException) { }
                                catch (Exception x)
                                {
                                    Logger.LogInfo(x.Message + "/" + x.StackTrace + "/" + x.GetType().ToString());
                                }

                                //display
                                row[dt.Columns.Count - 1] = ver;
                            }
                            break;

                        case "IIS NTAuthProv":
                            //open all IIS websites, build datatable, read string 1:website
                            //show button to change (NTLM, NTLMNego, Nego, Blank) per row
                            if (i_machine == 1)
                            {
                                dt.Columns.Add("Web ID");
                                dt.Columns.Add("Web Title");
                                dt.Columns.Add("NTAuthentionProviders");
                            }
                            try
                            {
                                DirectoryEntry iisServer = new DirectoryEntry("IIS://" + m + "/W3SVC");
                                foreach (DirectoryEntry iisWeb in iisServer.Children)
                                {
                                    if (iisWeb.SchemaClassName == "IIsWebServer")
                                    {
                                        DirectoryEntry iisWebRoot = new DirectoryEntry("IIS://" + m + "/W3SVC/" + iisWeb.Name + "/root");
                                        DataRow        row        = dt.NewRow();
                                        row["Machine"]   = m;
                                        row["Web ID"]    = iisWeb.Name;
                                        row["Web Title"] = iisWeb.Properties["ServerComment"][0].ToString();
                                        string temp = "";
                                        foreach (PropertyValueCollection pc in iisWebRoot.Properties)
                                        {
                                            if (pc.PropertyName == "NTAuthenticationProviders")
                                            {
                                                temp = pc[0].ToString();
                                            }
                                        }
                                        row["NTAuthentionProviders"] = temp;
                                        dt.Rows.Add(row);
                                        iisWebRoot.Close();
                                    }
                                }
                                iisServer.Close();
                            }
                            catch (System.Runtime.InteropServices.COMException) { }
                            catch (Exception x)
                            {
                                Logger.LogError(String.Format("SPDash Timer Job error: {0}", x.Message));
                            }
                            break;

                        case "IIS KernelAuth":
                            if (i_machine == 1)
                            {
                                //schema
                                dt.Columns.Add("Web App Path");
                                dt.Columns.Add("useKernelMode");
                            }
                            try
                            {
                                //gather from remote XML file nodes
                                XmlDocument doc = new XmlDocument();
                                doc.Load("\\\\" + m + "\\C$\\windows\\system32\\inetsrv\\config\\applicationHost.config");
                                XmlNodeList nodeList = doc.SelectNodes("/configuration/location");
                                foreach (XmlNode node in nodeList)
                                {
                                    if (node.Name.ToLower() == "location")
                                    {
                                        //defaults
                                        string useKernelModePath = "";
                                        string useKernelMode     = "";
                                        useKernelModePath = node.Attributes["path"].Value;
                                        XmlNode nodeAuth = node.SelectSingleNode("system.webServer/security/authentication/windowsAuthentication");
                                        if (nodeAuth != null)
                                        {
                                            XmlAttribute attrib = nodeAuth.Attributes["useKernelMode"];
                                            if (attrib != null)
                                            {
                                                useKernelMode = attrib.Value.ToString().Replace("true", "TRUE");
                                            }
                                        }

                                        //only record if we have values
                                        if (!String.IsNullOrEmpty(useKernelModePath) && !String.IsNullOrEmpty(useKernelMode))
                                        {
                                            DataRow row = dt.NewRow();
                                            row["Machine"]       = m;
                                            row["Web App Path"]  = useKernelModePath;
                                            row["useKernelMode"] = useKernelMode;
                                            dt.Rows.Add(row);
                                        }
                                    }
                                }
                            }
                            catch (Exception x)
                            {
                                Logger.LogError(String.Format("SPDash Timer Job error: {0}", x.Message));
                            }
                            break;

                        case "Open TCP Ports":
                            //Schema
                            if (i_machine == 1)
                            {
                                dt.Columns.Clear();
                                dt.Columns.Add("TCP Port");
                                //First column labels
                                foreach (string port in config.TcpPorts.Split(','))
                                {
                                    DataRow row = dt.NewRow();
                                    row["TCP Port"] = port;
                                    dt.Rows.Add(row);
                                }
                            }
                            //Machines horizontally
                            dt.Columns.Add(m);

                            //Navigate to matched cell
                            foreach (string port in config.TcpPorts.Split(','))
                            {
                                foreach (DataRow row in dt.Rows)
                                {
                                    if (row[0].ToString().ToUpper() == port)
                                    {
                                        //Matched cell, execute data gather
                                        TcpClient c = new TcpClient();
                                        c.SendTimeout    = 200;
                                        c.ReceiveTimeout = 200;
                                        try
                                        {
                                            c.Connect(m, Convert.ToInt16(port));
                                            row[dt.Columns.Count - 1] = (c.Connected) ? "Open" : "Closed";
                                        }
                                        catch (System.Net.Sockets.SocketException)
                                        {
                                            row[dt.Columns.Count - 1] = "Closed";
                                        }
                                        catch (Exception x)
                                        {
                                            Logger.LogError(String.Format("SPDash Timer Job error: {0}", x.Message));
                                        }
                                        c.Close();
                                        break;
                                    }
                                }
                            }
                            break;

                        case "Windows Services":
                            //Schema
                            if (i_machine == 1)
                            {
                                dt.Columns.Clear();
                                dt.Columns.Add("Service");
                            }
                            dt.Columns.Add(m);
                            //Ensure 1 row-per-service (dynamic height)
                            opt        = new ConnectionOptions();
                            oQuery     = new ObjectQuery("SELECT * FROM Win32_Service");
                            scope      = new ManagementScope("\\\\" + m + "\\root\\cimv2", opt);
                            moSearcher = new ManagementObjectSearcher(scope, oQuery);
                            collection = moSearcher.Get();
                            foreach (ManagementObject res in collection)
                            {
                                bool rowExists = false;
                                foreach (DataRow row in dt.Rows)
                                {
                                    if (row[0].ToString() == res["Name"].ToString())
                                    {
                                        rowExists = true;
                                    }
                                }
                                if (!rowExists)
                                {
                                    DataRow row = dt.NewRow();
                                    row[0] = res["Name"];
                                    dt.Rows.Add(row);
                                }
                            }

                            //Populate most recent machine column
                            foreach (ManagementObject res in collection)
                            {
                                foreach (DataRow row in dt.Rows)
                                {
                                    if (row[0].ToString().ToUpper().Trim() == res["Name"].ToString().ToUpper().Trim())
                                    {
                                        row[dt.Columns.Count - 1] = res["StartMode"] + "-" + res["State"];
                                    }
                                }
                            }
                            break;

                        case "Kerberos SPN":
                            //Schema
                            if (i_machine == 1)
                            {
                                dt.Columns.Clear();
                            }
                            dt.Columns.Add(m);

                            //loop all Managed user accounts on first pass
                            GatherKerberos(m);
                            if (i_machine == 1)
                            {
                                var managedAccounts = new SPFarmManagedAccountCollection(SPFarm.Local);
                                foreach (SPManagedAccount managedAccount in managedAccounts)
                                {
                                    string username = managedAccount.Username;
                                    if (username.Contains("\\"))
                                    {
                                        username = username.Split('\\')[1];
                                    }
                                    dt.Columns.Add(username);
                                    GatherKerberos(username);
                                }
                            }
                            break;

                        case "Add Remove Programs":
                            //Schema
                            if (i_machine == 1)
                            {
                                dt.Columns.Clear();
                                dt.Columns.Add("App");
                            }
                            dt.Columns.Add(m);

                            //Ensure 1 row-per-service (dynamic height)
                            RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, m).OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
                            foreach (String s in key.GetSubKeyNames())
                            {
                                //Attempt to read DisplayName if it exists
                                object dn = key.OpenSubKey(s).GetValue("DisplayName");
                                if (dn != null)
                                {
                                    if (dn.ToString().Length > 0)
                                    {
                                        bool rowExists = false;
                                        foreach (DataRow row in dt.Rows)
                                        {
                                            if (row[0].ToString() == dn.ToString())
                                            {
                                                rowExists = true;
                                            }
                                        }
                                        if (!rowExists)
                                        {
                                            DataRow row = dt.NewRow();
                                            row[0] = dn;
                                            dt.Rows.Add(row);
                                        }
                                    }
                                }
                            }

                            //Populate most recent machine column
                            foreach (String s in key.GetSubKeyNames())
                            {
                                object dn = key.OpenSubKey(s).GetValue("DisplayName");
                                if (dn != null)
                                {
                                    if (dn.ToString().Length > 0)
                                    {
                                        foreach (DataRow row in dt.Rows)
                                        {
                                            if (row[0].ToString().ToUpper() == dn.ToString().ToUpper())
                                            {
                                                object ver = key.OpenSubKey(s).GetValue("DisplayVersion");
                                                if (ver == null)
                                                {
                                                    row[dt.Columns.Count - 1] = "X";
                                                }
                                                else
                                                {
                                                    if (ver.ToString().Length > 0)
                                                    {
                                                        row[dt.Columns.Count - 1] = ver;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            break;

                        case "SYS files (pagefile,hiberfil)":
                            //Schema
                            string sysFile = "pagefile.sys,hiberfil.sys";
                            if (i_machine == 1)
                            {
                                dt.Columns.Clear();
                                dt.Columns.Add("File");
                                //First column labels
                                foreach (string file in sysFile.Split(','))
                                {
                                    DataRow row = dt.NewRow();
                                    row["File"] = file;
                                    dt.Rows.Add(row);
                                }
                            }
                            //Machines horizontally
                            dt.Columns.Add(m);

                            //Navigate to matched cell
                            foreach (string file in sysFile.Split(','))
                            {
                                foreach (DataRow row in dt.Rows)
                                {
                                    if (row[0].ToString() == file)
                                    {
                                        //Matched cell, execute data gather
                                        string cellValue = "";

                                        //Detect all logical drive letters
                                        ConnectionOptions          sys_opt        = new ConnectionOptions();
                                        ObjectQuery                sys_oQuery     = new ObjectQuery("SELECT Size, FreeSpace, Name, FileSystem FROM Win32_LogicalDisk WHERE DriveType = 3");
                                        ManagementScope            sys_scope      = new ManagementScope("\\\\" + m + "\\root\\cimv2", sys_opt);
                                        ManagementObjectSearcher   sys_moSearcher = new ManagementObjectSearcher(sys_scope, sys_oQuery);
                                        ManagementObjectCollection sys_collection = sys_moSearcher.Get();
                                        foreach (ManagementObject res in sys_collection)
                                        {
                                            try
                                            {
                                                string sys_logicalDrive = res["Name"].ToString().Substring(0, 1);
                                                if (File.Exists(String.Format(@"\\{0}\" + sys_logicalDrive + @"$\" + file, m)))
                                                {
                                                    cellValue += sys_logicalDrive + " ";
                                                }
                                            }
                                            catch (Exception x)
                                            {
                                                Logger.LogError(String.Format("SPDash Timer Job error: {0}", x.Message));
                                            }
                                        }

                                        row[dt.Columns.Count - 1] = cellValue;
                                    }
                                }
                            }

                            ////Add row always
                            //if (true)
                            //{
                            //    DataRow row = dt.NewRow();
                            //    row["Machine"] = m;
                            //    row["Pagefile.sys"] = sys_page;
                            //    row["Hiberfil.sys"] = sys_hiber;
                            //    dt.Rows.Add(row);
                            //}
                            break;

                        case "XPath web.config":
                            //Schema
                            int      maxLength = 20;
                            string[] xpaths    = config.XPathWebConfig;
                            if (i_machine == 1)
                            {
                                dt.Columns.Add("IIS Website");
                                foreach (string xp in xpaths)
                                {
                                    dt.Columns.Add("Exists-" + XPathCleanColumn(xp, maxLength));
                                }
                            }

                            //Gather data
                            string[] wssHomeDirs = Directory.GetDirectories(String.Format(@"\\{0}\" + config.FolderIISRoot, m));
                            foreach (string d in wssHomeDirs)
                            {
                                //Assume none
                                string[] xpathExists = new string[xpaths.Length];
                                int      xi          = 0;
                                foreach (string xp in xpaths)
                                {
                                    //Attempt read
                                    try
                                    {
                                        XmlDocument xpathDoc = new XmlDocument();
                                        xpathDoc.Load(d + @"\web.config");
                                        XmlNode xpathNode = xpathDoc.SelectSingleNode(xp);
                                        if (xpathNode != null)
                                        {
                                            xpathExists[xi] = "True";
                                        }
                                    }
                                    catch (Exception x)
                                    {
                                        Logger.LogError(String.Format("SPDash Timer Job error: {0}", x.Message));
                                    }
                                    xi++;
                                }

                                //Add row
                                DataRow row = dt.NewRow();
                                row["Machine"]     = m;
                                row["IIS Website"] = d;
                                xi = 0;
                                foreach (string xp in xpaths)
                                {
                                    row["Exists-" + XPathCleanColumn(xp, maxLength)] = xpathExists[xi];
                                    xi++;
                                }
                                dt.Rows.Add(row);
                            }
                            break;

                        case "XPath apphost.config":
                            //Schema
                            maxLength = 20;
                            xpaths    = config.XPathAppHostConfig;
                            if (i_machine == 1)
                            {
                                foreach (string xp in xpaths)
                                {
                                    dt.Columns.Add("Exists-" + XPathCleanColumn(xp, maxLength));
                                }
                            }

                            //Assume none
                            string[] ahcXpathExists = new string[xpaths.Length];
                            int      ahcXi          = 0;
                            foreach (string xp in xpaths)
                            {
                                //Attempt read
                                try
                                {
                                    XmlDocument xpathDoc = new XmlDocument();
                                    xpathDoc.Load(String.Format(@"\\{0}\" + config.FolderINETSRV, m) + @"\applicationHost.config");
                                    XmlNode xpathNode = xpathDoc.SelectSingleNode(xp);
                                    if (xpathNode != null)
                                    {
                                        ahcXpathExists[ahcXi] = "True";
                                    }
                                }
                                catch (Exception x)
                                {
                                    Logger.LogError(String.Format("SPDash Timer Job error: {0}", x.Message));
                                }
                                ahcXi++;
                            }

                            //Add row
                            DataRow ahcRow = dt.NewRow();
                            ahcRow["Machine"] = m;
                            ahcXi             = 0;
                            foreach (string xp in xpaths)
                            {
                                ahcRow["Exists-" + XPathCleanColumn(xp, maxLength)] = ahcXpathExists[ahcXi];
                                ahcXi++;
                            }
                            dt.Rows.Add(ahcRow);

                            break;

                        case "WMI":
                            if (i_machine == 1)
                            {
                                //first machine only.  loop each query with machine nested 3rd tier below
                                //(machine 1 > query loop > machine loop)
                                foreach (string wmiConfig in config.WMIQuery)
                                {
                                    //clear memory table
                                    ResetDataTable();

                                    //build query
                                    string[] configs   = wmiConfig.Split(';');
                                    string   wmiFrom   = configs[0];
                                    string   wmiScope  = configs[1];
                                    string   wmiWhere  = configs[2];
                                    string   wmiSelect = configs[3];
                                    string   query     = "SELECT " + ((String.IsNullOrEmpty(wmiSelect)) ? "*" : wmiSelect) + " FROM " + wmiFrom + " " + wmiWhere;

                                    //gather data
                                    foreach (SPServer server in serverColl)
                                    {
                                        if (server.Role != SPServerRole.Invalid)
                                        {
                                            GetWMIDataForServer(server.Address, query, wmiScope, "");
                                        }
                                    }

                                    //write to XML
                                    SaveDataTableToXML(action + "_" + wmiFrom);
                                }
                            }
                            break;

                            //end switch
                        }
                    }
                }
            }

            //sort
            if (action == "Add Remove Programs")
            {
                DataView dvSort = new DataView(dt);
                dvSort.Sort = "App";
                dt          = dvSort.ToTable();
            }

            //write to XML
            if (action != "WMI")
            {
                SaveDataTableToXML(action);
            }
        }