MIM Event Broker Forum

Welcome to the community forum for MIM Event Broker.

Browse the knowledge base, ask questions directly to the product group, or leverage the community to get answers. Leave ideas for new features and vote for the features or bug fixes you want most.

0
Completed

Identity Broker PowerShell Connector begin/process/end sections

Bob Bradley 10 years ago updated by anonymous 9 years ago 3

Further to an email thread with Adam van Vliet 2 days ago, and the linked issue MCS-30, the following is an idea on how export performance for the PowerShell connector might be improved.

FYI only - the script below is the O365 update connector script from QBE hosted by Soren’s PowerShell MA. The 3 outer section headings correspond to the FIM MA SDK methods (BEGIN=Initialize, PROCESS=Export, END=Terminate).

I am thinking that the IdB PowerShell connector could be substantially improved if it were to adopt the same approach for exports, whereby the overhead of setting up/tearing down a single export each time (establishing connections, loading libraries, etc.) can be done once per export batch instead.

param 
(
                $Username = "",
                $Password = "",
    $AccountSkuId = "qbetest:ENTERPRISEPACK",
    $LogFilePath = "E:\Packages\FIM.Synchronisation\SvN\FIM2\Operations\Scripts\Logs",
    $LogFileName = ""
)

BEGIN
{
                Import-Module MSOnline -Force

    $ErrHandle = "" 

    $SecurePassword = ConvertTo-SecureString $Password -AsPlainText -Force
    $Creds = New-Object System.Management.Automation.PSCredential $Username, $SecurePassword

                Connect-MsolService -Credential $Creds

    if ($ErrHandle -ne "")
    { 
        # handle any logon errors 
        $message = 'Could not log on O365 with ' + $($Username) + ' to update licenses. ' + $ErrHandle 
        exit 
    } 

    #List of Service Plans

    #ServicePlan                             ProvisioningStatus
    #-----------                             ------------------
    #YAMMER_ENTERPRISE                       Success
    #RMS_S_ENTERPRISE                        Success
    #OFFICESUBSCRIPTION                      Success
    #MCOSTANDARD                             Success
    #SHAREPOINTWAC                           Success
    #SHAREPOINTENTERPRISE                    Success
    #EXCHANGE_S_ENTERPRISE                   Success
                    
    # Create MsolLicenseOptions only for OFFICESUBSCRIPTION
    #$O365Licences = New-MsolLicenseOptions $AccountSkuId -DisabledPlans SHAREPOINTWAC, SHAREPOINTENTERPRISE

    $MAName = "PowerShell Connector"
    $FIMRegKey = "hklm:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FIMSynchronizationService\Parameters"
    $FIMParameters = Get-ItemProperty $FIMRegKey
    $cacheFileName = "cachedExports.xml"
    $office365MappingFile = "office365LicenseProfileGroupMapping.xml"

    # Set up hash table of cached exports for loading exported MemberOf property (to obsolete export)
    $cachePath = [System.IO.Path]::Combine($FIMParameters.Path, "MaData", $MAName, $cacheFileName)
    $office365MappingPath = [System.IO.Path]::Combine($FIMParameters.Path, "Extensions", $office365MappingFile)
    [xml]$office365Mapping = Get-Content -Path $office365MappingPath

    $cachedExports = @{}
    if (Test-Path $cachePath)
    {
        $cachedExports = Import-Clixml -Path $cachePath
    }

}

PROCESS
{

    function log( $message )
    {
                    if ( $LogFileName -and $message )
                    {
                                    $message | out-file ([System.IO.Path]::Combine($LogFilePath, $LogFileName)) -append
                    }
    }
        
    #Initialise values
                $Errorstatus = "success"
    $ErrorDetail = $null
    $IsLicensed = $null
    $IsLicensedChg = $null

    #Get UPN of the user
    $Anchor = $_."[Anchor]"

    #Get Identifier
    $Identifier = $_."[Identifier]"
    
    #Get Group Membership
    $MemberOf = $_.MemberOf

    
    #Get Object Modification Type
    $Action = $_."[ObjectModificationType]"

    $IsLicensedChg = $_.IsLicensed
    #$IsLicensedChg = $false

    #log $_

    $error.clear()

    try
                {
           $msoluser = Get-MsolUser -userprincipalname $Anchor -ErrorAction SilentlyContinue
           $IsLicensed = $msoluser.IsLicensed
           # Loop through each of the registered DNs in the hash table at the top of this script to find a match
           $profileToAssign = "none"
           # Loop through each configured profile to find a match in the MemberOf dn collection
           foreach ($group in $office365Mapping.o365LicenseProfiles.profiles.profile.group) {
                if ($MemberOf.Contains($group.dn)) {
                    #$IsLicensedChg = $true
                    $_.IsLicensed = $true
                    $profileToAssign = $group.parentNode.name
                    break;
                }
           }
           #foreach ($dn in $defaultProfileGroupDNs.Keys) {
           #     if ($MemberOf.Contains($dn)) {
           #         $IsLicensedChg = $true
           #         break;
           #     }
           #}
           log ("IsLicensed:" + $IsLicensed)
           log ("IsLicensedChg:" + $IsLicensedChg)
                      
           #region unsupported operations
                                   if ($Action -eq 'Add')
                                   {
                                                    throw "Add is not supported. Will be processed when Active Directory user is added/joined."
                                   }
                                   if ($Action -eq 'Delete')
                                   {
                                                    throw "Delete is not supported. Will be processed when Active Directory user is removed."
                                   }
                                   #endregion

           if ($Action -eq 'Replace')
                                   {               
               if($IsLicensedChg)
               {
                    if(!$IsLicensed)
                    {
                        ## Execute to get the list of SKU's for the client environment
                        $Skus = Get-MsolAccountSku

                        switch ($profileToAssign) {
                            "default" {
                                $O365Licences = New-MsolLicenseOptions -AccountSkuId $Skus[0].AccountSkuId -DisabledPlans $Skus[0].ServiceStatus[4].ServicePlan.ServiceName, `
                                                                                                    $Skus[0].ServiceStatus[5].ServicePlan.ServiceName
               
                                Set-MsolUserLicense -UserPrincipalName $Anchor -AddLicenses $AccountSkuId -LicenseOptions $O365Licences  
                                #Assigned new license
                                log "Assigned new license"
                            }
                            "TBA" {
                                # TODO: Copy the "default" section above and adjust according to the name configured in the xml mapping file
                            }
                            "none" {
                                # Do nothing
                            }
                            default { 
                                throw "undefined Office 365 License Profile configured: $profileToAssign"
                            }
                        }
                    }
                    else
                    {
                        #Already licensed
                        log "Already assigned license"
                    }                    
               }
               else
               {
                    log "No change ..."
                    if($IsLicensed)
                    {
                        #Remove any Previous Licenses
                        Set-MsolUserLicense -UserPrincipalName $Anchor -RemoveLicenses $msoluser.Licenses.AccountSkuId
                        log "Removed any Previous Licenses"
                    }
               }                
                # Cache export
                if (-not $cachedExports.ContainsKey($Anchor)) {
                    log ("Caching new export" + $Anchor)
                    $cachedExports.Add($Anchor, @{})
                    $cachedExports.($Anchor).Add("MemberOf", $MemberOf)
                    $cachedExports.($Anchor).Add("PendingDelta", $true)
                } else {
                    log ("Caching existing export " + $Anchor)
                    $cachedExports.($Anchor).("MemberOf") = $MemberOf
                    $cachedExports.($Anchor).("PendingDelta") = $true
                }
            }
    }
    catch
                {
                                $Errorstatus = "powershell-script-error"
                                $ErrorDetail =  $error[0] 
                }

   

    # return status about export operation
                $status = @{}
    $status."[Anchor]" = $Anchor
                $status."[Identifier]" = $Identifier
                $status."[ErrorDetail]" = $ErrorDetail
}


END
{
    $cachedExports | Export-Clixml -Path $cachePath
}
0
Fixed

Event Broker 3.2 Logon as a service not being added

Phil Whipps 10 years ago updated by anonymous 9 years ago 1

After selecting "Add log on as a service rights" tick box on the service account install page the service would not start with error "Error 1069: The Service did not start due to a logon failure"

0
Fixed

Generic LDAP Listener configuration

Monash 10 years ago updated by anonymous 9 years ago 4

The Monash Directory Service is an Oracle LDAP Directory.
We are creating a Generic LDAP Listener as part of the Event Broker implementation to detect changes and trigger operation lists on our MDS MA.

We are unable to complete the creation of the LDAP Directory Agent as it states that 'Domain' is a mandatory field if left blank and returns an error, regardless of the helper test stating that it is not.

Please advise


EvB - LDAP Listener.jpg
Unify.EventBroker.Agents.Web.dll
0
Fixed

Typo for FIM Event Broker Confgure MA wizard

Bob Bradley 10 years ago updated by anonymous 9 years ago 2

Operation lists are now being generated with the text <MA> Agemt <xxx>

0
Answered

Handle case changes for Modify Anchor

Adam van Vliet 14 years ago updated by anonymous 10 years ago 5

QDET-49 & QDET-87

Consider using the logging engine to catch and report errors, or simply do not perform the modify anchor in these cases.


Migration Failure Message.png
0
Answered

Step-by-step sample for creating and configuring Event Broker v3.0.0 Agent, Operations List, Schedule, Check Operation, Operations and Group

Shane Lim 14 years ago updated by anonymous 9 years ago 7

I find it a bit hard getting start with Event Broker v3.0.0.1, dispite of the Getting Started

I believe a step-by-step sample for creating and configuring Event Broker v3.0.0 Agent, Operations List, Schedule, Check Operation, Operations and Group would make this much easier. It also took me a fair bit of effort to find where each different components are located or can be configured.

I believe something along the line of would help

1 - Create and configure Agent in the Agents tab
2 - Create an Operation List in the Operations tab
3 - Configure an Operation List in the Operations tab by click on that particular Operation List. Note: Ensure that Operation List is "disabled" as only disabled Operation List can be configured.
4 - If required, click on the icon next to the Schedule to add the schedule for this operation list
5 - If required, click on the icon next to the Check Operation to add Check Operation to the operation list
6 - Click on the icon next to the Operations to add Operation to the operation list. Repeat this step if addition Operation is required.
7 - If required, create Group in the Groups tab
8 - Add the Operation List to the Group as required.

0
Fixed

When editing an Operation List's schedule through the Edit Schedule, the submission button says "Create" rather than "Update"

Shane Lim 14 years ago updated by anonymous 9 years ago 5

When editing an Operation List's schedule through the Edit Schedule, the submission button says "Create" rather than "Update".

This is a bit confusing and inconstent with other Editing functionality.

0
Completed

Outgoing provisioning detection could be made more efficient

Matthew Clark 14 years ago updated by anonymous 9 years ago 10

The outgoing provisioning pending detection should be made more efficient, as it can easily blow out in larger systems. You really only need to check to see if even one record exists as a pending export in an MA - there is an attribute (mms_connectorspace.export_operation) that flags a particular record as needing an export, and this can be queried quite quickly. Worth investigating for next EB version - there may be an even faster way to find exports

Also on this, this query times out after 30 seconds, and no exports will fire if execution exceeds this timeout.

The query execution time can be improved by adding a custom index to the ILM database, but this

0
Fixed

Listen operation lost when operation list updated.

Tony Sheehy 12 years ago updated by anonymous 9 years ago 2

Listen operation lost when operation list updated.

0
Answered

With EB 3, how do you run a powershell script with parameters?

Carol Wapshere 14 years ago updated by anonymous 9 years ago 5

I am attempting to run a powershell script with parameters. If I was running it from the powershell command line I would do this:

E:\scripts\truncate-table.ps1 -server "localhost" -database "FIMData" -table "View500ADReporting_Delta"

I have tried to use the Powershell Function Operation.

First I am confused by "Module path" which sounds like might mean a PSSnapin. I assume this is supposed to mean script and enter "E:\scripts\truncate-table.ps1"

Next I am confused by "Function name". In the documentation there is a picture where the word "Execute" has been entered here. I tried that but wasn't too surprised when I got an error. I also cannot leave it blank.

Finally I enter this for the parameters:
server:"localhost";database:"FIMData";table:"View500ADReporting_Delta"

So the question is: how am I supposed to fill in the fields so it calls the script with the parameters?

I think the documentation may need clarity. Also the form should be redesigned so someone who knows about powershell scripts, but not about "modules", can figure it out.

Thanks