Skip to content

Instantly share code, notes, and snippets.

@darrenjrobinson
Last active November 17, 2018 22:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darrenjrobinson/fe4db452a0c534d61e00 to your computer and use it in GitHub Desktop.
Save darrenjrobinson/fe4db452a0c534d61e00 to your computer and use it in GitHub Desktop.
Microsoft Identity Manager Skype for Business / Lync PowerShell Management Agent Import Script. Supporting blog post is located here https://blog.darrenjrobinson.com/provisioning-users-for-lync-skype-for-business-with-fim-mim-using-the-granfeldt-powershell-management-agent/
param (
$Username,
$Password,
$OperationType,
[bool] $usepagedimport,
$pagesize
)
#Needs reference to .NET assembly used in the script.
Add-Type -AssemblyName System.DirectoryServices.Protocols
$CookieFile = "C:\PROGRA~1\MICROS~4\2010\SYNCHR~1\EXTENS~2\Lync\Lync\lynccookie.bin"
$count = 0
#Getting Cookie from file
If (Test-Path $CookieFile –PathType leaf) {
[byte[]] $Cookie = Get-Content -Encoding byte –Path $CookieFile
} else {
$Cookie = $null
}
#region User
$Properties = @("objectGuid","sAMAccountName","msRTCSIP-UserEnabled","userPrincipalName","msDS-cloudextensionAttribute20","isDeleted")
#Running as FIM MA Account
$Credentials = New-Object System.Net.NetworkCredential($username,$password)
$RootDSE = [ADSI]"LDAP://RootDSE"
$LDAPDirectory = New-Object System.DirectoryServices.Protocols.LdapDirectoryIdentifier($RootDSE.dnsHostName)
$LDAPConnection = New-Object System.DirectoryServices.Protocols.LDAPConnection($LDAPDirectory, $Credentials)
$Request = New-Object System.DirectoryServices.Protocols.SearchRequest($RootDSE.defaultNamingContext, "(&(objectClass=user)(sAMAccountName=U*))", "Subtree", $Properties)
#Defining the object type returned from searches for performance reasons.
[System.DirectoryServices.Protocols.SearchResultEntry]$entry = $null
if ($OperationType -eq "Full")
{
$Cookie = $null
}
else
{
# delta run and we should use the cookie we already found
}
$DirSyncRC = New-Object System.DirectoryServices.Protocols.DirSyncRequestControl($Cookie, [System.DirectoryServices.Protocols.DirectorySynchronizationOptions]::IncrementalValues, [System.Int32]::MaxValue)
$Request.Controls.Add($DirSyncRC) | Out-Null
$MoreData = $true
$Guids = @()
while ($MoreData) {
$Response = $LDAPConnection.SendRequest($Request)
ForEach($entry in $Response.Entries){
#Check if this GUID already been handled to avoid adding duplicate objects
If($Guids -contains ([GUID] $entry.Attributes["objectguid"][0]).ToString()){continue}
# we always add objectGuid and objectClass to all objects
$obj = @{}
$obj.Add("objectGuid", ([GUID] $entry.Attributes["objectguid"][0]).ToString())
$obj.Add("objectClass", "user")
if ( $entry.distinguishedName.Contains("CN=Deleted Objects"))
{
# this is a deleted object, so we return a changeType of 'delete'; default changeType is 'Add'
$obj.Add("changeType", "Delete")
}
else
{
# we need to get the directory entry to get the additional attributes
$DirEntry = New-Object System.DirectoryServices.DirectoryEntry "LDAP://$($entry.distinguishedName)"
# add values to the attributes that have changed
$obj.Add("accountName",$DirEntry.Properties["sAMAccountName"][0])
if ($DirEntry.Properties["userPrincipalName"][0]){$obj.Add("upn",$DirEntry.Properties["userPrincipalName"][0])}
if ($DirEntry.Properties["msRTCSIP-UserEnabled"] ) { [bool] $obj.lyncEnabled = $DirEntry.Properties["msRTCSIP-UserEnabled"][0] }else{[bool] $obj.lyncEnabled = $false }
if ($DirEntry.Properties["msDS-cloudExtensionAttribute20"][0]){$obj.Add("msDScloudextensionAttribute20",$DirEntry.Properties["msDS-cloudExtensionAttribute20"][0])}
if ($DirEntry.Properties["msRTCSIP-PrimaryUserAddress"][0])
{
$sipaddress = $DirEntry.Properties["msRTCSIP-PrimaryUserAddress"][0] -replace '^SIP\:'
$obj.Add("sipAddress",$sipaddress)
}
}
#Add Guid to list of processed guids to avoid duplication
$Guids += ,([GUID] $entry.Attributes["objectguid"][0]).ToString()
#Return the object to the MA
$obj
}
ForEach ($Control in $Response.Controls) {
If ($Control.GetType().Name -eq "DirSyncResponseControl") {
$Cookie = $Control.Cookie
$MoreData = $Control.MoreData
}
}
$DirSyncRC.Cookie = $Cookie
}
#Saving cookie file
Set-Content -Value $Cookie -Encoding byte –Path $CookieFile
$global:RunStepCustomData = [System.Convert]::ToBase64String($Cookie)
#endregion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment