public SPServerCollectionInstance(ObjectInstance prototype, SPServerCollection serverCollection) : this(prototype) { if (serverCollection == null) { throw new ArgumentNullException("serverCollection"); } m_serverCollection = serverCollection; }
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(); } }
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."; } }); }
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); } }