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

Install DLL in GAC - Windows 2008/2012 (Using Powershell, No GacUtil.exe)

If you want to install a DLL in the GAC and do not have the GACUtil.exe available. Powershell is properly the easiest way to procede.

Before Powershell you would properly just drag the DLL file into the C:\Windows\Assembly but this option is usually not available anymore.

Powershell - Add DLL to GAC So to install a DLL file in the GAC simply execute the below Powershell script. Remember you migth want to run the Powershell prompt as an administrator.
[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")$publish=New-ObjectSystem.EnterpriseServices.Internal.Publish$publish.GacInstall("c:\temp\MyDllFile.dll")iisreset
The first line adds a reference to the assembly we need to be able to mange the GAC.
The second and third lines retrives the GAC object and publish a new DLL file to it.
The last line resets the Internet Information Services. This is only needed if your DLL file is used in a websi…

Error occurred in deployment step 'Add Solution': Attempted to perform an unauthorized operation.

Received this error today when trying to create a SharePoint solution against a newly created site.


My first problem was the site was configured to use a port which was already used by another web site. Therefore the site could not start at all.

In my case both Default Web Site and SharePoint - 2000 was both using port 2000. Changing the port of Default Web Site and I was able to start the site.

However now I still received the same error message. When browsing the site I realized I did not have access to the site.

Giving access to my user and I was able to deploy the solution.

To sum up this post:
 - Check the site can start
 - Check the site can be browsed
 - Check your user have access to the site

SharePoint 2013 : Cannot connect to the targeted site.

On my Contoso environment I was trying to create a sandboxed solution. I have already configured my app domain and app management services. But when I tried to validate the site I got the following error message.
Error

Cannot connect to the targeted site. This error can occur if the specified site is not hosted on the local system. SharePoint solutions work only with locally-installed versions of SharePoint Foundation or SharePoint Server. Remote development is supported only for apps for SharePoint 2013.
If you search around the internet you will find many people suggesting to change your host file from 127.0.0.1 to the actual IP.

Solution However the solution, at least on a Contoso environment, is to type in the actual IP address in the host file.
(the IP 192.168.150.1 is the special IP for Contoso, I have 2 network adapters)
And do not forget to clear/flush the DNS cache. Now the solution can be created and validates.