Skip to main content

Project Server to Sharepoint Email sync program

Today I got a support case where alerts in SharePoint was not triggered, I quickly realized the problem was that the email address on the users was wrong in SharePoint and the admins only updated the emails in Project Server. Why the emails were not correct i do not know and did not look further into it.
To solve the difference between SharePoint and Project Server I created this small C# script/program which synchronize user emails from Project Server into SharePoint.
You will typically need a tool like this when you are creating your users manually in Project Server and the emails are synchronized from a inconsistent Active Directory.

The program can be found here:
Project Server -> SharePoint Emails sync
The code for the program/script is as follows:
 static void Main(string[] args)  
 {  
   string pwa = "";  
   string webApp = "";  
   if (args.Length <= 0)  
   {  
     WriteLine("WRONG ARGS, PWA");  
     return;  
   }  
   pwa = args[0];  
   PS.Resource r = new PS.Resource();  
   r.Url = pwa + "/_vti_bin/psi/resource.asmx";  
   r.UseDefaultCredentials = true;  
   PS.ResourceDataSet resDS = r.ReadResources("", false);  
   Dictionary<string, string> resourcesEmail = new Dictionary<string, string>();  
   foreach (PS.ResourceDataSet.ResourcesRow resrow in resDS.Resources)  
   {  
     try  
     {  
       if (!resrow.IsWRES_EMAILNull())  
       {  
         resourcesEmail.Add(resrow.WRES_ACCOUNT, resrow.WRES_EMAIL);  
         WriteLine("Adding account: " + resrow.WRES_ACCOUNT + " - Email: " + resrow.WRES_EMAIL + "(Name: " + resrow.RES_NAME + ")");  
       }  
       else  
       {  
         WriteLine("Account email is null: (Name: " + resrow.RES_NAME + ")");  
       }  
     }  
     catch (Exception ex)  
     { }  
   }  
   using (SPSite siteCol = new SPSite(pwa))  
     {  
       using (SPWeb web = siteCol.OpenWeb())  
       {  
         foreach (SPUser user in web.SiteUsers)  
         {  
           try  
           {  
             WriteLine("Processing User: " + user.LoginName + " - " + user.Email);  
             if (resourcesEmail.ContainsKey(user.LoginName))  
             {  
               string email = resourcesEmail[user.LoginName];  
               if (email != user.Email)  
               {  
                 string oldemail = user.Email;  
                 user.Email = email;  
                 user.Update();  
                 WriteLine("Updating email for: " + user.Name + " (old: " + oldemail + ", new: " + email + ")");  
               }  
             } else  
             {  
               WriteLine("Account not found: " + user.LoginName);  
             }  
           }   
           catch (Exception ex)  
           {  
             WriteLine("Could not update: " + user.LoginName + ". Error: " + ex.Message + " at " + ex.StackTrace);  
           }  
         }  
       }  
     }  
 }  

Comments

Popular posts from this blog

Azure DevOps - Gantt Chart

It's been a while since my last post - in the past couple of weeks I have played around with some videos of topics I find interesting. One of these topics are a very cool way of displaying a Gantt Chart upon your Azure DevOps board's. Check it out here!

Sharepoint/Project Server App with javascript and Web Part

Getting Project Server code to run in a AppPart Today I tried to get project server CSOM/javascript code to run within an app part. This caused a lot of troubleshooting and guessing to get it to work. By simply adding the ps.js library to the app part page I kept getting an error. Library: <script type="text/javascript" src="/_layouts/15/ps.js"></script> Error: "executeordelayuntilscriptloaded is undefined" Then I tried to use ScriptLink to load the library but got the same error. <SharePoint:ScriptLink runat="server" Name="ps.js" Localizable="false" OnDemand="False" LoadAfterUI="True"></SharePoint:ScriptLink> The code I was trying to run was very simpel and worked fine if I added it to a normal aspx page.  $(document).ready(function () {     var projContext = PS.ProjectContext.get_current();       var projects = projContext.get_projects();     projContext.load(projects...

PowerShell results size unlimited/truncated - $FormatEnumerationLimit/Width

Ever experienced the problem where you run a Powershell command and you cannot see the whole result because the result is truncated. Problem: If you for example run the Test-SPsite command you might see something like the following: Site : SPSite Url=http://atlas/pwa Results : { SPSiteHealthResult Status=Passed RuleName="Conflicting Content Types" RuleId=befe203b-a8c0-48c2-b5f0-27c10f9e1622, SPSiteHealthResult Status=FailedWarning RuleName="Customized Files" RuleId=cd839b0d-9707-4950-8fac-f306cb920f6c, SPSiteHealthResult Status=Passed RuleName="Missing Galleries" RuleId=ee967197-ccbe-4c00-88e4-e6fab81145e1, SPSiteHealthResult Status=Passed RuleName="Missing Parent Content Types" RuleId=a9a6769f-7289-4b9f-ae7f-5db4b997d284, SPSiteHealthResult Status=FailedError RuleName="Missing Site Templates" RuleId=5258ccf5-e7d6-4df7-b8ae-12fcc0513ebd, ...