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(); } }
public SPFarmManagedAccountCollectionInstance(ObjectInstance prototype, SPFarmManagedAccountCollection farmManagedAccountCollection) : this(prototype) { if (farmManagedAccountCollection == null) { throw new ArgumentNullException("farmManagedAccountCollection"); } m_farmManagedAccountCollection = farmManagedAccountCollection; }
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; }
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(); }
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 }); } }
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); } }