Resource::ReadUserList method
Office 2013 and later
Gets a list of all active and disabled Project Server users. The list includes the resource GUID (RES_UID) and name (RES_NAME).
Namespace: WebSvcResource
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Parameters
- filter
- Type: WebSvcResource.ResourceActiveFilter
ResourceActiveFilter enum filtering to Active, Inactive, or All users.
Return value
Type: WebSvcResource.ResourceDataSetA ResourceDataSet populated with only the resource GUID (RES_UID) and name (RES_NAME) of the selected users.
ReadResources returns more robust resource data and does not require ManageSecurity permissions.
Project Server Permissions
Permission | Description |
|---|---|
Allows a user to manage all enterprise users, resources and groups. Global permission. | |
Allows a user to manage security. Global permission. |
This example retrieves enterprise resources, creating several if they are not present, reads the resources and writes them to the console.
Please see Prerequisites for ASMX-based code samples in Project 2013 for critical information on running this code sample.
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Data; using System.Web.Services.Protocols; using System.Threading; using PSLibrary = Microsoft.Office.Project.Server.Library; namespace Microsoft.SDK.Project.Samples.ReadUserList { class Program { [STAThread] static void Main() { try { const string PROJECT_SERVER_URI = "http://ServerName/ProjectServerName/"; const string RESOURCE_SERVICE_PATH = "_vti_bin/psi/resource.asmx"; // Set up the Web service objects SvcResource.Resource resourceSvc = new SvcResource.Resource(); resourceSvc.Url = PROJECT_SERVER_URI + RESOURCE_SERVICE_PATH; resourceSvc.UseDefaultCredentials = true; // Read any users on the system Console.WriteLine("Reading in the users"); SvcResource.ResourceDataSet resourceDs= resourceSvc.ReadUserList(SvcResource.ResourceActiveFilter.All); // Write the project tables to the console Console.WriteLine("And here it is:"); WriteTablesToConsole(resourceDs.Tables); } catch (SoapException ex) { PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex); PSLibrary.PSErrorInfo[] errors = error.GetAllErrors(); string errMess = "==============================\r\nError: \r\n"; for (int i = 0; i < errors.Length; i++) { errMess += "\n" + ex.Message.ToString() + "\r\n"; errMess += "".PadRight(30, '=') + "\r\nPSCLientError Output:\r\n \r\n"; errMess += errors[i].ErrId.ToString() + "\n"; for (int j = 0; j < errors[i].ErrorAttributes.Length; j++) { errMess += "\r\n\t" + errors[i].ErrorAttributeNames()[j] + ": " + errors[i].ErrorAttributes[j]; } errMess += "\r\n".PadRight(30, '='); } Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(errMess); } catch (WebException ex) { string errMess = ex.Message.ToString() + "\n\nLog on, or check the Project Server Queuing Service"; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error: " + errMess); } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error: " + ex.Message); } finally { Console.ResetColor(); Console.WriteLine("\r\n\r\nPress any key..."); Console.ReadKey(); } } // Write all contents of a table collection to the console private static void WriteTablesToConsole(System.Data.DataTableCollection theTables) { Console.ForegroundColor = ConsoleColor.DarkGreen; foreach (System.Data.DataTable table in theTables) { int[] columnWidths = new int[table.Columns.Count]; int tableWidth = 0; string dataString; Console.WriteLine("Table: " + table.TableName); // Write out the column names and get their spacing StringBuilder tableRow = new StringBuilder(); for (int i = 0; i < table.Columns.Count; i++) { columnWidths[i] = GetColumnWidth(table.Columns[i]); tableRow.Append(table.Columns[i].ColumnName.PadRight(columnWidths[i])); tableWidth += columnWidths[i]; } // add a space so it won't wrap tableWidth += 1; // make the console as wide as the widest table Console.BufferWidth = (Console.BufferWidth > tableWidth ? Console.BufferWidth : tableWidth); tableRow.Append("\r\n"); Console.Write(tableRow.ToString()); // Write out the data foreach (DataRow row in table.Rows) { tableRow = new StringBuilder(); for (int i = 0; i < table.Columns.Count; i++) { dataString = row[i].ToString(); // truncate output if it is wider than // the desired column width if (dataString.Length >= columnWidths[i]) { dataString = dataString.Substring(0, columnWidths[i] - 1); } // add the output to the stringbuilder and pad right to fill // up to the column width. tableRow.Append(dataString.PadRight(columnWidths[i])); } tableRow.Append("\r\n"); Console.Write(tableRow.ToString()); } Console.Write("\r\n".PadLeft(tableWidth, '-')); } Console.ResetColor(); } // Helper function for WriteTablesToConsole private static int GetColumnWidth(DataColumn column) { // Note: may not handle byte[]data types well const int MAX_COL_WIDTH = 40; int dataWidth = 0; //return 12 for numbers, 30 for dates, and string width for strings. switch (column.DataType.UnderlyingSystemType.ToString()) { case "System.Boolean": case "System.Byte": case "System.Byte[]": case "System.Char": case "System.Decimal": case "System.Double": case "System.Int16": case "System.Int32": case "System.Int64": case "System.SByte": case "System.Single": case "System.UInt16": case "System.UInt32": case "System.UInt64": dataWidth = 12; break; case "System.DateTime": case "System.TimeSpan": dataWidth = 30; break; case "System.Guid": dataWidth = 37; break; case "System.String": // If it has a maxlength, use it if (column.MaxLength > 0) { dataWidth = column.MaxLength; } else { // Otherwise use the max col width dataWidth = MAX_COL_WIDTH; } break; default: dataWidth = column.ColumnName.Length; break; } // truncate if over the max length if (dataWidth > MAX_COL_WIDTH) { dataWidth = MAX_COL_WIDTH; } // always be at least as wide as the colum name return (column.ColumnName.Length > (dataWidth) ? column.ColumnName.Length + 1 : dataWidth); } } }
Show: