# POST method: $req
$requestBody = Get-Content $req -Raw | ConvertFrom-Json
$projID = $requestBody.projID
# GET method: each querystring parameter is its own variable
if ($req_query_name)
{
$projID = $req_query_name
}
#add SharePoint Online DLL - update the location if required
Import-Module "D:\Home\site\wwwroot\HttpTriggerPowerShell1\Microsoft.SharePoint.Client.dll"
Import-Module "D:\Home\site\wwwroot\HttpTriggerPowerShell1\Microsoft.SharePoint.Client.Runtime.dll"
#set the environment details
$PWAInstanceURL = " https://brismithpjo.sharepoint.com/sites/pwa"
$username = "brismith@brismithpjo.onmicrosoft.com"
$password = "<password>"
$securePass = ConvertTo-SecureString $password -AsPlainText -Force
#set the Odata URL to get the Workspace Url
$url = $PWAInstanceURL + "/_api/ProjectData/Projects()?`$Filter=ProjectId eq GUID'$projID'&`$Select=ProjectName, ProjectWorkspaceInternalUrl"
#get all of the data from the OData URL
while ($url){
[Microsoft.SharePoint.Client.SharePointOnlineCredentials]$spocreds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePass);
$webrequest = [System.Net.WebRequest]::Create($url)
$webrequest.Credentials = $spocreds
$webrequest.Accept = "application/json;odata=verbose"
$webrequest.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f")
$response = $webrequest.GetResponse()
$reader = New-Object System.IO.StreamReader $response.GetResponseStream()
$data = $reader.ReadToEnd()
$results = ConvertFrom-Json -InputObject $data
$results1 += $results.d.results
if ($results.d.__next){
$url=$results.d.__next.ToString()
}
else {
$url=$null
}
}
#for each project, create the list item - update the newitem with the correct list columns and project data
foreach ($projectrow in $results1)
{
$projectSiteURL = $projectrow.ProjectWorkspaceInternalUrl
$groupName = $projectrow.ProjectName + " Members"
}
#Filter only for projects that are external - if $projectSiteURL contains pwasites
if ($projectSiteURL -like '*pwasites*'){
#get all of the team members - will include resources that are not users too.
$team = @()
#set the REST URL project
$url = $PWAInstanceURL + "/_api/ProjectServer/Projects('$projID')/ProjectResources()?`$Select=Id"
#get all of the data from the REST URL for the Project Team
while ($url){
[Microsoft.SharePoint.Client.SharePointOnlineCredentials]$spocreds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePass);
$webrequest = [System.Net.WebRequest]::Create($url)
$webrequest.Credentials = $spocreds
$webrequest.Accept = "application/json;odata=verbose"
$webrequest.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f")
$response = $webrequest.GetResponse()
$reader = New-Object System.IO.StreamReader $response.GetResponseStream()
$data = $reader.ReadToEnd()
$results = ConvertFrom-Json -InputObject $data
$team += $results.d.results
if ($results.d.__next){
$url=$results.d.__next.ToString()
}
else {
$url=$null
}
}
#get all of the team members login accounts and remove resources that are not users in PWA.
$teamusers = @()
Foreach ($teammember in $team)
{
#set the resource ID
$teammemberID = $teammember.Id
#set up the Odata URL
#$url = $PWAInstanceURL + "/_api/ProjectServer/EnterpriseResources('$teammemberID')/User?`$Select=LoginName,Id" #alternative to OData
$url = $PWAInstanceURL + "/_api/ProjectData/Resources()?`$Select=ResourceNTAccount,ResourceName&`$Filter=ResourceId eq guid'$teammemberID' and ResourceNTAccount ne null"
#get all of the data from the OData URL for the project team members that are users in PWA
[Microsoft.SharePoint.Client.SharePointOnlineCredentials]$spocreds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePass);
$webrequest = [System.Net.WebRequest]::Create($url)
$webrequest.Credentials = $spocreds
$webrequest.Accept = "application/json;odata=verbose"
$webrequest.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f")
$response = $webrequest.GetResponse()
$reader = New-Object System.IO.StreamReader $response.GetResponseStream()
$data = $reader.ReadToEnd()
$results = ConvertFrom-Json -InputObject $data
$teamusers += $results.d.results
}
#add the user to the project site
Foreach ($teamuser in $teamusers)
{
$teamuserLogin = $teamuser.ResourceNTAccount
$teamusername = $teamuser.ResourceName
#get SP site client context
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($projectSiteURL)
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePass)
$ctx.Credentials = $credentials
#get all the site groups on the Project Site
$projSiteGroups = $ctx.Web.SiteGroups
$ctx.Load.($projSiteGroups)
#get the correct group to add the user into
$projSiteGroup = $projSiteGroups.GetByName($groupName)
$ctx.Load($projSiteGroup)
#add the user to the group on the Project Site
$projSiteUser = $ctx.Web.EnsureUser($teamuserLogin)
$ctx.Load($projSiteUser)
$teamMemberToAdd = $projSiteGroup.Users.AddUser($projSiteUser)
$ctx.Load($teamMemberToAdd)
$ctx.ExecuteQuery()
}
}
{
"projID": "77c4992f-562f-e711-80d3-00155de84000"
}
https://pwmather.wordpress.com/2017/07/07/projectonline-project-user-sync-to-project-sites-ppm-...
https://pwmather.wordpress.com/2017/07/28/running-projectonline-powershell-in-azure-using-azure...
https://pwmather.wordpress.com/2017/08/01/running-projectonline-powershell-in-azure-using-azure...
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.