Admin.ReadDepartments Method

Reads the list of departments that are defined in a Project Web App instance.

Namespace:  [Admin Web service]
Service reference: http://ServerName:32843/[Project Service Application GUID]/PSI/Admin.svc
Web service reference: http://ServerName/ProjectServerName/_vti_bin/PSI/Admin.asmx?wsdl


<SoapDocumentMethodAttribute("", RequestNamespace := "",  _
    ResponseNamespace := "",  _
    Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Function ReadDepartments ( _
    language As Integer _
) As DepartmentsDataSet
Dim instance As Admin
Dim language As Integer
Dim returnValue As DepartmentsDataSet

returnValue = instance.ReadDepartments(language)
[SoapDocumentMethodAttribute("", RequestNamespace = "", 
    ResponseNamespace = "", 
    Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public DepartmentsDataSet ReadDepartments(
    int language


  • language
    Type: System.Int32
    Specifies the primary language identifier (LCID) that indicates the language of a country or region.

Return Value

Type: [Admin Web service].DepartmentsDataSet


You can define departments in the Department lookup table, on the Enterprise custom Fields and Lookup Tables page in Project Web App (http://ServerName/ProjectServerName/_layouts/pwa/Admin/CustomizeFields.aspx).

Project Server Permissions




Allows a user to load the enterprise global template. Global permission.


Allows a user to add, modify, or delete users and manage Project Server security groups. Global permission.


Allows a user to access the Project Center. Global permission.


Allows a user to access the Resource Center. Global permission.


Allows a user to modify the definitions of enterprise custom fields and lookup table values. Global permission.


Allows a user to add a new project to the Project Server database. Global permission.


The following example shows the use of the ReadDepartments method. The example uses the SvcAdmin namespace in the ProjectServerServices.dll proxy assembly. Code that uses ReadDepartments returns a DepartmentsDataSet; the application writes the results to an XML file.


The ConfigClientEndpoints method uses an app.config file for setting the WCF binding, behavior, and endpoint. For information about creating a PSI proxy assembly and an app.config file, see Prerequisites for WCF-Based Code Samples.

using System;
using System.Text;
using System.ServiceModel;
using System.Xml;
using PSLibrary = Microsoft.Office.Project.Server.Library;

namespace Microsoft.SDK.Project.Samples.TestAdmin
    class Program
        private const string ENDPOINT_ADMIN = "basicHttp_Admin";
        // Change the output directory to match the output directory of your computer.
        private const string OUTPUT_FILES = @"E:\Project\Samples\Output\";

        private static SvcAdmin.AdminClient adminClient;

        private static string outFilePath;
        static void Main(string[] args)

            outFilePath = OUTPUT_FILES + "DepartmentsDataSet.xml";

            int lcid = 1033;  // The Department lookup table is in English.
                // Here is the thing that we are trying to do.
                SvcAdmin.DepartmentsDataSet deptDS = adminClient.ReadDepartments(lcid);

            catch(FaultException fault)
                // Use the WCF FaultException, because the ASMX SoapException does not 
                // exist in a WCF-based application.
            Console.Write("\nPress any key to exit... ");

        // Extract a PSClientError object from the WCF FaultException object, and
        // then display the exception details and each error in the PSClientError stack.
        private static void WriteFaultOutput(FaultException fault)
            string errAttributeName;
            string errAttribute;
            string errOut;
            string errMess = "".PadRight(30, '=') + "\r\n"
                + "Error details: " + "\r\n";

            PSLibrary.PSClientError error = Helpers.GetPSClientError(fault, out errOut);
            errMess += errOut;

            PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
            PSLibrary.PSErrorInfo thisError;

            for (int i = 0; i < errors.Length; i++)
                thisError = errors[i];
                errMess += "\r\n".PadRight(30, '=') + "\r\nPSClientError output:\r\n";
                errMess += thisError.ErrId.ToString() + "\n";

                for (int j = 0; j < thisError.ErrorAttributes.Length; j++)
                    errAttributeName = thisError.ErrorAttributeNames()[j];
                    errAttribute = thisError.ErrorAttributes[j];
                    errMess += "\r\n\t" + errAttributeName
                        + ": " + errAttribute;
            Console.ForegroundColor = ConsoleColor.Red;

        // Use the endpoints that are defined in app.config to configure the client.
        public static void ConfigClientEndpoints(string endpt)
            if (endpt == ENDPOINT_ADMIN)
                adminClient = new SvcAdmin.AdminClient(ENDPOINT_ADMIN);

    // Helper method: GetPSClientError.
    class Helpers
        /// <summary>
        /// Extract a PSClientError object from the ServiceModel.FaultException,
        /// for use in output of the GetPSClientError stack of errors.
        /// </summary>
        /// <param name="e"></param>
        /// <param name="errOut">Shows that FaultException has more information 
        /// about the errors than PSClientError has. FaultException can also contain 
        /// other types of errors, such as failure to connect to the server.</param>
        /// <returns>PSClientError object, for enumerating errors.</returns>
        public static PSLibrary.PSClientError GetPSClientError(FaultException e,
                                                               out string errOut)
            const string PREFIX = "GetPSClientError() returns null: ";
            errOut = string.Empty;
            PSLibrary.PSClientError psClientError = null;

            if (e == null)
                errOut = PREFIX + "Null parameter (FaultException e) passed in.";
                psClientError = null;
                // Get a ServiceModel.MessageFault object.
                var messageFault = e.CreateMessageFault();

                if (messageFault.HasDetail)
                    using (var xmlReader = messageFault.GetReaderAtDetailContents())
                        var xml = new XmlDocument();

                        var serverExecutionFault = xml["ServerExecutionFault"];
                        if (serverExecutionFault != null)
                            var exceptionDetails = serverExecutionFault["ExceptionDetails"];
                            if (exceptionDetails != null)
                                    errOut = exceptionDetails.InnerXml + "\r\n";
                                    psClientError =
                                        new PSLibrary.PSClientError(exceptionDetails.InnerXml);
                                catch (InvalidOperationException ex)
                                    errOut = PREFIX + "Unable to convert fault exception info ";
                                    errOut += "a valid Project Server error message. Message: \n\t";
                                    errOut += ex.Message;
                                    psClientError = null;
                                errOut = PREFIX + "The FaultException e is a ServerExecutionFault, "
                                    + "but does not have ExceptionDetails.";
                            errOut = PREFIX + "The FaultException e is not a ServerExecutionFault.";
                else // No detail in the MessageFault.
                    errOut = PREFIX + "The FaultException e does not have any detail.";
            errOut += "\r\n" + e.ToString() + "\r\n";
            return psClientError;

The following is an example of the DepartmentsDataSet.xml output file that the sample application saves.


The department names that are returned in the example are specific to departments that are defined in the Project Web App instance.

<?xml version="1.0" standalone="yes"?>
<DepartmentsDataSet xmlns="">

See Also


Admin Class

Admin Members

Admin Web Service