Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save darrenjrobinson/b9a7a26d0e3ffe1ed98685b474ff339b to your computer and use it in GitHub Desktop.
Save darrenjrobinson/b9a7a26d0e3ffe1ed98685b474ff339b to your computer and use it in GitHub Desktop.
Update Email Addresses in SuccessFactors including the isPrimary Flag. Associated blogpost https://blog.darrenjrobinson.com/updating-and-setting-primary-attributes-in-successfactors-with-powershell/
$Global:headers = $null
$Global:SSFBaseURI = "https://api10preview.sapsf.com/odata/v2/"
$Global:SSFBusinessEmailType = "159139"
$Global:SSFPersonalEmailType = "159140"
Function Connect-SSF {
[cmdletbinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$SSFBaseURI
)
$creds = Get-Credential -Message "Provide the SuccessFactors loginID 'USER@Tenant' and Password for an account with SuccessFactors OData API access."
if ($creds) {
$Bytes = [System.Text.Encoding]::utf8.GetBytes("$($creds.UserName):$($creds.GetNetworkCredential().Password)")
$EncodedAuth = [Convert]::ToBase64String($Bytes)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Tls11
$Global:headers = @{Authorization = "Basic $($EncodedAuth)"; 'content-type' = 'application/json' }
# Test Connection
try {
$ssfQuery = "$($SSFBaseURI)User?`$top=5"
$ssfResult = $null
$ssfResult = Invoke-RestMethod -Uri $ssfQuery -Method Get -Headers $headers
if ($ssfResult.d.results.count -gt 0) {
return Write-Host "Successfully connected to SuccessFactors."
}
}
catch {
Write-host $_
}
}
}
Function Get-SSFUser {
[cmdletbinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$employeeID,
[string]$SSFBaseURI,
[object]$headers
)
try {
$ssfUserURI = "format=JSON`&`$orderby=personIdExternal asc`&`$expand=emailNav`&`$filter=startswith(personIdExternal,`'$($employeeID)`')"
$ssfUserQuery = ($SSFBaseURI + "PerPerson?`$" + $ssfUserURI )
$ssfResult = $null
$ssfResult = Invoke-RestMethod -Uri $ssfUserQuery -Method Get -Headers $headers
if ($ssfResult.d.results.count -gt 0) {
return $ssfResult.d.results
}
else {
Write-Host "User Record with employeeID '$($employeeID)' not found."
}
}
catch {
Write-host $_
}
}
Function Update-SSFEmail {
[cmdletbinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$employeeID,
[string]$SSFBaseURI,
[string]$SSFBusinessEmailType,
[string]$businessEmailAddress,
[string]$SSFPersonalEmailType,
[object]$headers,
[Parameter(Mandatory = $false, ValueFromPipeline = $true)]
[string]$personalEmailAddress
)
try {
if ($personalEmailAddress) {
$ssfEmailUpdate = "[{`"__metadata`": {`"uri`":`"$($SSFBaseURI)PerEmail`(personIdExternal='" + $employeeID + "'`,emailType='$SSFBusinessEmailType'`)`"},`"emailType`":`"" + $SSFBusinessEmailType + "`",`"emailAddress`":`"" + $businessEmailAddress + "`",`"isPrimary`":true},{`"__metadata`": {`"uri`":`"$($SSFBaseURI)/PerEmail`(personIdExternal='" + $employeeID + "'`,emailType='$SSFPersonalEmailType'`)`"},`"emailType`":`"" + $SSFPersonalEmailType + "`",`"emailAddress`":`"" + $personalEmailAddress + "`",`"isPrimary`":false}]"
$ssfUpdateResult = Invoke-RestMethod -Uri "$($SSFBaseURI)upsert?`$format=JSON`&purgeType=Full" -Method Post -Headers $headers -Body $ssfEmailUpdate
}
else {
$ssfEmailUpdate = "{`"__metadata`": {`"uri`":`"$($SSFBaseURI)PerEmail`(personIdExternal='" + $employeeID + "'`,emailType='$SSFBusinessEmailType'`)`"},`"emailType`":`"" + $SSFBusinessEmailType + "`",`"emailAddress`":`"" + $businessEmailAddress + "`",`"isPrimary`":true}"
$ssfUpdateResult = Invoke-RestMethod -Uri "$($SSFBaseURI)upsert?`$format=JSON`&purgeType=Full" -Method Post -Headers $headers -Body $ssfEmailUpdate
}
return $ssfUpdateResult.d
}
catch {
Write-host "SSF update failed" ($_.Exception.Response.GetResponseStream())
}
}
Connect-SSF -SSFBaseURI $SSFBaseURI
$userDetails = Get-SSFUser -employeeID 10020618 -SSFBaseURI $SSFBaseURI -headers $headers
# New Business Address
$businessEmail = "darren@identirati.com"
# Get personal email address from result (if exist)
# Update SSF with Personal and Business email addresses and Business as the Primary
if ($null -ne ($userDetails.emailNav.results | Where-Object { $_.EmailType -eq $SSFPersonalEmailType })) {
$personalEmail = ($userDetails.emailNav.results | Where-Object { $_.EmailType -eq $SSFPersonalEmailType }).emailAddress
Update-SSFEmail -employeeID 10020618 -SSFBaseURI $SSFBaseURI -SSFBusinessEmailType $SSFBusinessEmailType -businessEmailAddress $businessEmail -SSFPersonalEmailType $SSFPersonalEmailType -personalEmailAddress $personalEmail -headers $headers
}
else {
Update-SSFEmail -employeeID 10020618 -SSFBaseURI $SSFBaseURI -SSFBusinessEmailType $SSFBusinessEmailType -businessEmailAddress $businessEmail -headers $headers
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment