SharePoint: This Profile Import error is (usually) normal

Update: There was a fix for this behavior in the SharePoint 2016 August 2020 Public Update (build 16.0.5044.1001), so if you’re past that build and seeing the “batch abort exception”, it’s more likely that it indicates a real problem.

 

Here’s an example of an error that often occurs during Active Directory Import (aka: ADI, AD Import):

 

ScanDirSyncChanges: Batch-abort Exception in processing response for page ‘7’, exception ‘System.DirectoryServices.Protocols.DirectoryOperationException: An operation error occurred.

 

Under what conditions might this occur?

You have an Active Directory group that has over 5,000 members.

You may see multiple errors like that if that group also contains nested AD groups that also contain over 5,000 users.

 

Here are some details around what you’d see in the ULS logs:

11/21/2018 14:45:58.83    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    aei5p    Verbose    QueueItemChange: Incoming change for item <GUID=9b78f038-7735-49a6-81b7-928fca6d8542>;<SID=S-1-5-21-1700552430-3460358242-3531541990-2775>;CN=LGTopLevel,OU=LargeGroup,OU=Test Users,DC=contoso,DC=local of type 2.    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

11/21/2018 14:45:58.84    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    af9b7    Medium    RangeQuery: Retrieving attribute ‘member’ of item ‘CN=LGTopLevel,OU=LargeGroup,OU=Test Users,DC=contoso,DC=local’ using Range Query.    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

11/21/2018 14:45:58.94    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    aei44    Unexpected    ScanDirSyncChanges: Batch-abort Exception in processing response for page ‘7’, exception ‘System.DirectoryServices.Protocols.DirectoryOperationException: An operation error occurred. at System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32 messageId, LdapOperation operation, ResultAll resultType, TimeSpan requestTimeOut, Boolean exceptionOnTimeOut) at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout) at Microsoft.Office.Server.UserProfiles.ADImport.ProfileDispatcher.RangeQuery(List`1 valuesList, LdapConnection ldapConnection, Int64 uSNChanged, String dn, String attribute, Type valueType) at Microsoft.Office.Server.UserProfiles.ADImport.ProfileDispatcher.FillAllProperties(ServerConfiguration serverConfig, LdapConnection ldapConnection, UserProfileADImportPropertyMappingCollection propertyMapping, ItemInfo item, ProfileChangeData newProfile, ProfileTypePropertyManager propManager, IDictionary`2 propertyChanges) at Microsoft.Office.Server.UserProfiles.ADImport.ProfileDispatcher.GetProfileChangeData(ServerConfiguration serverConfig, LdapConnection ldapConnection, UserProfileADImportPropertyMappingCollection propertyMapping, ItemInfo item, ProfileTypePropertyManager propManager) at Microsoft.Office.Server.UserProfiles.ADImport.ProfileDispatcher.QueueItemChange(Provisioner item, UserProfileADImportMapping adMapping, Boolean isDeleted, List`1& itemIdSuccesses, Dictionary`2& itemIdFailures, Stopwatch externalTimeSpent, Int32 loopCount, ProfileTypePropertyManager propManager, Int32& countAdds, Int32& countDeletes, Int32& countUpdates) at Microsoft.Office.Server.UserProfiles.ADImport.ProfileConfiguration.QueueSearchResultEntry(ProfileConfiguration profileConfig, LdapConnection ldapConnection, String rootDn, SearchResultEntry entry, List`1& itemIdSuccesses, Dictionary`2& itemIdFailures, List`1& itemIdOUFiltered, Stopwatch externalTimeSpent, Int32 loopCount, Int32& countAdds, Int32& countDeletes, Int32& countUpdates) at Microsoft.Office.Server.UserProfiles.ADImport.DirSyncWrapper.ProcessChanges(ProfileConfiguration profileConfig, LdapConnection ldapConnection, UserProfileADImportMapping adMapping, String rootDn, Stopwatch externalTimeSpentInProfile, Stopwatch externalTimeSpentInDirectory, SPUserProfileADImportUsageEntry usage, Int32 loopCount, Boolean& fEventLogged, SearchRequest request, DirectoryControl pagingControl, List`1 itemsLeft)’: assuming all successes if any are failures, and stopping further dirSync requests for this batch!    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

11/21/2018 14:45:58.95    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Server    General    7202    Critical    ActiveDirectory Import: DirSync import failed: ScanDirSyncChanges: Batch-abort Exception in processing response for page ‘7’, exception ‘System.DirectoryServices.Protocols.DirectoryOperationException: An operation error occurred. at System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32 messageId, LdapOperation operation, ResultAll resultType, TimeSpan requestTimeOut, Boolean exceptionOnTimeOut) at <same stack as above>

11/21/2018 14:45:58.95    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    aihvo    Unexpected     ScanDirSyncChanges: Critical failure to process entry with objectGuid=’7d1c6e4f-b819-4aef-81b7-b61e63320bc5′, DN=’CN=TestyUser5336,OU=LargeGroup,OU=Test Users,DC=contoso,DC=local’: must ForceImportItem.    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

 

That looks bad. Why should I not be concerned?

Because in SharePoint 2016 builds prior to 16.0.5044.1001, its normal for groups with large memberships. The first run at importing the group is unable to enumerate all the memberships. It fails with the above error, but it also places the group in a queue for a retry. This “Retry Import” is generally able to import all group memberships successfully.

For example, here’s the sequence from my ULS log during the same run of the profile import timer job, just a bit farther down:

11/21/2018 14:46:01.22    OWSTIMER.EXE (0x1C40)    0x09D4    Document Management Server    Reporting    awggm    Medium    UserProfileADImportJob_RetrySyncFailures Start: My Scenario Start    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

11/21/2018 14:46:01.45    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    aei5g    Verbose    ScanDirSyncChanges: SearchResponse Entry #1, DistinguishedName ‘<GUID=9b78f038-7735-49a6-81b7-928fca6d8542>;<SID=S-1-5-21-1700552430-3460358242-3531541990-2775>;CN=LGTopLevel,OU=LargeGroup,OU=Test Users,DC=contoso,DC=local’.    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

11/21/2018 14:46:01.45    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    af9b7    Medium    RangeQuery: Retrieving attribute ‘member’ of item ‘CN=LGTopLevel,OU=LargeGroup,OU=Test Users,DC=contoso,DC=local’ using Range Query.    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

11/21/2018 14:46:01.52    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    af9cb    Medium    RangeQuery: Retrieved 5502 values of attribute ‘member’ of item ‘CN=LGTopLevel,OU=LargeGroup,OU=Test Users,DC=contoso,DC=local’ using Range Query.    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

11/21/2018 14:46:01.52    OWSTIMER.EXE (0x1C40)    0x09D4    SharePoint Portal Server    User Profiles    aei5l    Verbose    QueueSearchResultEntry: Finished Queuing DistinguishedName ‘<GUID=9b78f038-7735-49a6-81b7-928fca6d8542>;<SID=S-1-5-21-1700552430-3460358242-3531541990-2775>;CN=LGTopLevel,OU=LargeGroup,OU=Test Users,DC=contoso,DC=local’.    17a3a49e-10a0-e088-a10e-ea3cd3720a8d

How can I tell if the group memberships were actually imported?

You can do this a few different ways after the import is finished.

PowerShell:

#List group memberships according to the UPA

$user = “contoso\user1” #specify the user

Add-PSSnapin *sharePoint*

$profileManager = [Microsoft.Office.Server.UserProfiles.UserProfileManager]([Microsoft.Office.Server.ServerContext]::Default)

$up = $profileManager.GetUserProfile($user)

Write-Host “Account: ” $up.AccountName

Write-Host “Name: ” $up.DisplayName

Write-Host “Groups:”

$groups = $up.Memberships.GetItems()

$groups | select id, title, group | sort title | ft -AutoSize

 

SQL (run against the Profile database):

— Return group members (all members of a specific group) – SharePoint 2016 query

select mg.displayname as GroupName, mg.Id as GroupID, mg.SourceReference as GroupDN, upf.ntname as UserName, upf.PreferredName, upf.RecordID as UserID from upa.userprofile_full upf (nolock)

join upa.usermemberships um (nolock) on upf.recordid = um.recordid

join upa.membergroup mg (nolock) on um.membergroupid = mg.id

where mg.displayname like ‘%ADGroup1%’

order by mg.displayname, upf.ntname

 

— Return user memberships (all groups a certain user belongs to) – SharePoint 2016 query

select upf.ntname as UserName, upf.PreferredName, upf.RecordID as UserID, mg.displayname as GroupName, mg.Id as GroupID, mg.SourceReference as GroupDN from upa.userprofile_full upf (nolock)

join upa.usermemberships um (nolock) on upf.recordid = um.recordid

join upa.membergroup mg (nolock) on um.membergroupid = mg.id

where upf.ntname like ‘%testyuser1%’

order by upf.ntname, mg.displayname

 

For example, here’s the output of the above SQL query, run for my user “testuser1”, who is a member of the “LGTopLevel” group that we saw throw the “Batch-abort Exception”
error on the initial import, but then succeed on the “Retry Import”. As you can see, it shows the user as a member of “LGTopLevel”.

 

Add a Comment