private void DeployManagedAccount(object modelHost, SPFarm farm, ManagedAccountDefinition managedAccountDefinition)
        {
            var currentAccount = GetManagedAccount(farm, managedAccountDefinition);

            var loginName = managedAccountDefinition.LoginName;
            var accounts = new SPFarmManagedAccountCollection(farm);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = currentAccount,
                ObjectType = typeof(SPManagedAccount),
                ObjectDefinition = managedAccountDefinition,
                ModelHost = modelHost
            });


            if (currentAccount == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new managed account");

                currentAccount = accounts.FindOrCreateAccount(loginName);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = currentAccount,
                    ObjectType = typeof(SPManagedAccount),
                    ObjectDefinition = managedAccountDefinition,
                    ModelHost = modelHost
                });

                currentAccount.Update();
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing managed account");

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = currentAccount,
                    ObjectType = typeof(SPManagedAccount),
                    ObjectDefinition = managedAccountDefinition,
                    ModelHost = modelHost
                });

                currentAccount.Update();
            }
        }
Beispiel #2
0
        private void DeployManagedAccount(object modelHost, SPFarm farm, ManagedAccountDefinition managedAccountDefinition)
        {
            var currentAccount = GetManagedAccount(farm, managedAccountDefinition);

            var loginName = managedAccountDefinition.LoginName;
            var accounts  = new SPFarmManagedAccountCollection(farm);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = currentAccount,
                ObjectType       = typeof(SPManagedAccount),
                ObjectDefinition = managedAccountDefinition,
                ModelHost        = modelHost
            });


            if (currentAccount == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing new managed account");

                currentAccount = accounts.FindOrCreateAccount(loginName);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentAccount,
                    ObjectType       = typeof(SPManagedAccount),
                    ObjectDefinition = managedAccountDefinition,
                    ModelHost        = modelHost
                });

                currentAccount.Update();
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing managed account");

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = currentAccount,
                    ObjectType       = typeof(SPManagedAccount),
                    ObjectDefinition = managedAccountDefinition,
                    ModelHost        = modelHost
                });

                currentAccount.Update();
            }
        }
Beispiel #3
0
        public SPFarmManagedAccountCollectionInstance(ObjectInstance prototype, SPFarmManagedAccountCollection farmManagedAccountCollection)
            : this(prototype)
        {
            if (farmManagedAccountCollection == null)
            {
                throw new ArgumentNullException("farmManagedAccountCollection");
            }

            m_farmManagedAccountCollection = farmManagedAccountCollection;
        }
Beispiel #4
0
        protected SPManagedAccount GetManagedAccount(SPFarm farm, ManagedAccountDefinition managedAccountDefinition)
        {
            var loginName = managedAccountDefinition.LoginName;
            var accounts  = new SPFarmManagedAccountCollection(farm);

            SPManagedAccount currentAccount = null;

            try
            {
                currentAccount = accounts[loginName];
            }
            catch (Exception)
            { }

            return(currentAccount);
        }
        protected SPManagedAccount GetManagedAccount(SPFarm farm, ManagedAccountDefinition managedAccountDefinition)
        {
            var loginName = managedAccountDefinition.LoginName;
            var accounts = new SPFarmManagedAccountCollection(farm);

            SPManagedAccount currentAccount = null;

            try
            {
                currentAccount = accounts[loginName];
            }
            catch (Exception)
            { }

            return currentAccount;
        }
Beispiel #6
0
        private void DeployWebApplication(FarmModelHost farmModelHost, SPFarm farm, WebApplicationDefinition webApplicationDefinition)
        {
            var webApps = SPWebService.ContentService.WebApplications;

            var webAppBuilder = new SPWebApplicationBuilder(farm);

            webAppBuilder.Port = webApplicationDefinition.Port;
            webAppBuilder.ApplicationPoolId = webApplicationDefinition.ApplicationPoolId;

            if (!string.IsNullOrEmpty(webApplicationDefinition.ManagedAccount))
            {
                webAppBuilder.IdentityType = IdentityType.SpecificUser;

                var managedAccounts = new SPFarmManagedAccountCollection(SPFarm.Local);
                var maccount        = managedAccounts.FindOrCreateAccount(webApplicationDefinition.ManagedAccount);

                webAppBuilder.ManagedAccount = maccount;
            }
            else
            {
                webAppBuilder.ApplicationPoolUsername = webApplicationDefinition.ApplicationPoolUsername;

                var password = new SecureString();

                foreach (char c in webApplicationDefinition.ApplicationPoolPassword.ToCharArray())
                {
                    password.AppendChar(c);
                }

                webAppBuilder.ApplicationPoolPassword = password;
            }

            webAppBuilder.CreateNewDatabase = webApplicationDefinition.CreateNewDatabase;

            webAppBuilder.DatabaseName   = webApplicationDefinition.DatabaseName;
            webAppBuilder.DatabaseServer = webApplicationDefinition.DatabaseServer;

            webAppBuilder.UseNTLMExclusively = webApplicationDefinition.UseNTLMExclusively;

            webAppBuilder.HostHeader            = webApplicationDefinition.HostHeader;
            webAppBuilder.AllowAnonymousAccess  = webApplicationDefinition.AllowAnonymousAccess;
            webAppBuilder.UseSecureSocketsLayer = webApplicationDefinition.UseSecureSocketsLayer;

            var webApp = webAppBuilder.Create();

            webApp.Provision();
        }
        private void DeployWebApplication(FarmModelHost farmModelHost, SPFarm farm, WebApplicationDefinition webApplicationDefinition)
        {
            var webApps = SPWebService.ContentService.WebApplications;

            var webAppBuilder = new SPWebApplicationBuilder(farm);

            webAppBuilder.Port = webApplicationDefinition.Port;
            webAppBuilder.ApplicationPoolId = webApplicationDefinition.ApplicationPoolId;

            if (!string.IsNullOrEmpty(webApplicationDefinition.ManagedAccount))
            {
                webAppBuilder.IdentityType = IdentityType.SpecificUser;

                var managedAccounts = new SPFarmManagedAccountCollection(SPFarm.Local);
                var maccount = managedAccounts.FindOrCreateAccount(webApplicationDefinition.ManagedAccount);

                webAppBuilder.ManagedAccount = maccount;
            }
            else
            {
                webAppBuilder.ApplicationPoolUsername = webApplicationDefinition.ApplicationPoolUsername;

                var password = new SecureString();

                foreach (char c in webApplicationDefinition.ApplicationPoolPassword.ToCharArray())
                    password.AppendChar(c);

                webAppBuilder.ApplicationPoolPassword = password;
            }

            webAppBuilder.CreateNewDatabase = webApplicationDefinition.CreateNewDatabase;

            webAppBuilder.DatabaseName = webApplicationDefinition.DatabaseName;
            webAppBuilder.DatabaseServer = webApplicationDefinition.DatabaseServer;

            webAppBuilder.UseNTLMExclusively = webApplicationDefinition.UseNTLMExclusively;

            webAppBuilder.HostHeader = webApplicationDefinition.HostHeader;
            webAppBuilder.AllowAnonymousAccess = webApplicationDefinition.AllowAnonymousAccess;
            webAppBuilder.UseSecureSocketsLayer = webApplicationDefinition.UseSecureSocketsLayer;

            var webApp = webAppBuilder.Create();
            webApp.Provision();
        }
Beispiel #8
0
        private void DeployWebApplication(FarmModelHost farmModelHost,
                                          SPFarm farm,
                                          WebApplicationDefinition definition)
        {
            var webApps        = SPWebService.ContentService.WebApplications;
            var existingWebApp = FindWebApplication(definition, webApps);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model            = null,
                EventType        = ModelEventType.OnProvisioning,
                Object           = existingWebApp,
                ObjectType       = typeof(SPWebApplication),
                ObjectDefinition = definition,
                ModelHost        = farmModelHost
            });

            if (existingWebApp == null)
            {
                var webAppBuilder = new SPWebApplicationBuilder(farm);

                webAppBuilder.Port = definition.Port;
                webAppBuilder.ApplicationPoolId = definition.ApplicationPoolId;

                if (!string.IsNullOrEmpty(definition.ManagedAccount))
                {
                    webAppBuilder.IdentityType = IdentityType.SpecificUser;

                    var managedAccounts = new SPFarmManagedAccountCollection(SPFarm.Local);
                    var maccount        = managedAccounts.FindOrCreateAccount(definition.ManagedAccount);

                    webAppBuilder.ManagedAccount = maccount;
                }
                else
                {
                    webAppBuilder.ApplicationPoolUsername = definition.ApplicationPoolUsername;

                    var password = new SecureString();

                    foreach (char c in definition.ApplicationPoolPassword.ToCharArray())
                    {
                        password.AppendChar(c);
                    }

                    webAppBuilder.ApplicationPoolPassword = password;
                }

                webAppBuilder.CreateNewDatabase = definition.CreateNewDatabase;

                webAppBuilder.DatabaseName   = definition.DatabaseName;
                webAppBuilder.DatabaseServer = definition.DatabaseServer;

                webAppBuilder.UseNTLMExclusively = definition.UseNTLMExclusively;

                webAppBuilder.HostHeader            = definition.HostHeader;
                webAppBuilder.AllowAnonymousAccess  = definition.AllowAnonymousAccess;
                webAppBuilder.UseSecureSocketsLayer = definition.UseSecureSocketsLayer;

                var webApp = webAppBuilder.Create();
                webApp.Provision();

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = webApp,
                    ObjectType       = typeof(SPWebApplication),
                    ObjectDefinition = definition,
                    ModelHost        = farmModelHost
                });
            }
            else
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model            = null,
                    EventType        = ModelEventType.OnProvisioned,
                    Object           = existingWebApp,
                    ObjectType       = typeof(SPWebApplication),
                    ObjectDefinition = definition,
                    ModelHost        = farmModelHost
                });
            }
        }
Beispiel #9
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);
            }
        }