Users receive the error "Unable to load user preferences" when attempting to open EV Search.

Article: 100042943
Last Published: 2018-05-04
Ratings: 2 0
Product(s): Enterprise Vault

Problem

After upgrading to Enterprise Vault (EV) 12.3.0, some users attempting to open EV Search receive the error "Unable to load user preferences".  Clicking on the "Click here to login" link only refreshes the page to display the same error.

 

Error Message

 

In the EV Search page:

Error loading user preferences.  If the problem persists, contact your Enterprise Vault Administrator.


     
In the Enterprise Vault Event Log:

Log Name:      Veritas Enterprise Vault
Source:        Enterprise Vault
Event ID:      41519
Task Category: Enterprise Vault Search
Level:         Error
Keywords:      Classic
Description:
Unable to load user preferences. Check whether Enterprise Vault Directory Service is running.

For more information, see Help and Support Center at http://telemetry.community.veritas.com/entt?product=ev&language=english&version=12.3.0.0&build=12.3.0.1365&error=V-437-41519



In a Dtrace of the w3wp process on the EV server (formatted for easier reading):

(w3wp) <17320>               EV-H      {EVS}
Exception: Length cannot be less than zero.|
Parameter name: length
Info:Failed to load User preferences. ||
User: EVLab\user1 ||  
Diag:
Type:System.ArgumentOutOfRangeException
ST:
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)|   
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)|   
   at System.Reflection.RuntimeAssembly.LoadWithPartialNameInternal(AssemblyName an, Evidence securityEvidence, StackCrawlMark& stackMark)|   
   at System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type)|   
   at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)|   
   at System.Runtime.Serialization.FormatterServices.GetTypeFromAssembly(Assembly assem, String name)|   
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetSimplyNamedTypeFromAssembly(Assembly assm, String typeName, Type& type)|   
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.FastBindToType(String assemblyName, String typeName)|   
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Bind(String assemblyString, String typeString)|   
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)|   
   at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)|   
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)|   
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)|   
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()|   
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)|   
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)|   
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)|   
   at Symantec.EV.Search.Server.Common.Utility.BinarySerializer.DeSerialize[T](Byte[] byteData)|   
   at Symantec.EV.Search.Server.Business.PreferenceConfigurator`1.Get(String authUser, CustomImpersonation impersonation, String& userPolicyXmlString, Boolean isFromMobile)|   
   at Symantec.EV.Search.Server.Service.ContentManagementService.GetUserSettings()|   
   at Symantec.EV.Search.Client.Presentation.Model.SearchModel.GetUserSettings()|   
   at Symantec.EV.Search.Client.Host.PageBaseView.ConstructMemberVariables()
Inner:None


 

Cause

A change in the parameters used for new features in EV Search for the 12.3.0 release caused a change in the data needed to load user preferences to be missing, causing a parameter to be returned with a less than 0 value which is not allowed.

The possible workarounds to this issue are:

1. Clear the OWS_UserPreferences table in the EnterpriseVaultDirectory database to remove all user preferences set in EV versions prior to 12.3.0.
2. Remove the row for the affected user from the OWS_UserPreferences table in the EnterpriseVaultDirectory database.
3. Rebuild the index volume(s) of the affected user's archive.  Note that this workaround has not been found to be as reliable as workarounds 1 and 2.

Workaround 1:
     To clear the OWS_UserPreferences table, ensure a current backup of the EnterpriseVaultDirectory database exists to allow for quick recovery if needed.  Then -
     1. Log onto any workstation or server that has SQL Server Management Studio (SSMS) installed, logging in with an account that has permissions to change the contents of the EnterpriseVaultDirectory database tables, such as the Vault Service Account.
     2. Launch SSMS.
     3. Open a New Query window.
     4. Copy and paste the following SQL script into the New Query window:

USE EnterpriseVaultDirectory;
GO
TRUNCATE TABLE OWS_UserPreferences;

     5. Execute the contents of the New Query window.
     6. Have the users attempt to access EV Search after closing any current access attempts.  When successful, a new entry in the OWS_UserPreferences table will be created for each user.

Workaround 2:
     To remove the row for the affected user from the OWS_UserPreferences table, ensure a current backup of the EnterpriseVaultDirectory database exists. Then -
     1. Log onto any workstation or server that has SQL Server Management Studio (SSMS) installed, logging in with an account that has permissions to change the contents of the EnterpriseVaultDirectory database tables, such as the Vault Service Account.
     2. Launch SSMS.
     3. Open a New Query window.
     4. Copy and paste the following SQL query into the New Query window:

USE EnterpriseVaultDirectory;
GO
SELECT eme.MbxDisplayName AS 'User mailbox display name'
    , eme.MbxNTDomain AS 'User login domain'
    , eme.MbxNTUser AS 'User login ID'
    , eme.ObjectSidIdentity  AS 'Internal SID reference'
    , t.SID AS 'User AD SID'
FROM ExchangeMailboxEntry AS eme
LEFT JOIN Trustee AS t ON eme.objectSidIdentity = t.TrusteeIdentity
WHERE eme.MbxNTUser like '%UserID%';

     5. Replace UserID in the WHERE line with the login ID of the affected user.  For example, if the user's Login ID is user1, the WHERE statement would be
                    WHERE eme.MbxNTUser like '%user1%';

     6. Execute the contents of the New Query window.  The output of this query will provide the data needed to identify the row to be removed from the OWS_UserPreferences table.
     7. In the output of the SQL query, note the 'User AD SID' column entry.
     8. Open another New Query window.
     9. In the new, New Query window, copy and paste the following SQL script:

USE EnterpriseVaultDirectory;
GO
DELETE FROM OWS_UserPreferences
WHERE UserSID = 'User AD SID';

     10. Replace User AD SID in the WHERE line with the User AD SID value from the SQL query in the other New Query window.  Be sure this value is surrounded by single quotes.  For example, if the user's SID is S-1-5-21-3109810036-2610429583-3314573450-7611, the WHERE line would be
                    WHERE UserSID = 'S-1-5-21-3109810036-2610429583-3314573450-7611';

     11. Execute the contents of the new New Query window.  The output of this SQL script should be "(1 row(s) affected)"
At this point, the affected user should be able to launch EV Search successfully.

Solution

This issue has been addressed in the following release(s):
Enterprise Vault 12.3.2
Article 100043310

References

JIRA : CFT-1149

Was this content helpful?