Table of Contents

Lime CRM Desktop Client 11.3: technical details for administrators and support

Product
Lime CRM Desktop Client
Applies to
upgrade from 11.2.3960 to 11.3.4747
Audience
administrators, support, consultants

This page is a reference. It lists settings, paths, logs and installer facts as of 11.3.4747. For a description of the new features, see the release notes of 11.3.4747.

Placeholders in this page:

New and changed settings

How the client finds a setting

All client settings are registry values under Software\Lundalogik\Lime\Settings. A setting has a path, for example Application\UnsentDocumentsScanDelay. The client reads the value in this order and uses the first value it finds:

  1. HKCU\Software\Lundalogik\Lime\Settings\Custom\<path>. These are the values the user saves, for example in the Options dialog.
  2. HKCU\Software\Lundalogik\Lime\Settings\Default\<path>. These are the published settings. An administrator publishes them with the button Publish settings on the Settings page of the Options dialog. The client copies them from the server to this key at every login.
  3. HKLM\Software\Lundalogik\Lime\Settings\Default\<path>. These are machine defaults, for example from a group policy.
  4. The default value in the code.

There are two scopes:

Some settings are inherited. The client then reads Application\<name> at application scope, then at database scope, then in the settings of the list or card, and then uses the code default. AllowWebClient and PreferWebClient skip the application scope. When no database is open, the database scope has no value and the lookup continues. Earlier 11.3 builds raised an error in this case.

Settings table

Scope “Application” and “Database” use the lookup order above. “Machine” means HKLM only. Values are DWORD unless the table says otherwise.

Setting Scope Type and values Default What it does Status in 11.3
Application\UnsentDocumentsScanDelay Application Seconds, 1 to 86400. A value below 1 counts as 1. A value above 86400, or a value that is not a number, gives the default. 20 Delay after login before the first check for unsent documents. A second check always runs 5 minutes after login. New
Application\FileExtensions\*.*\NoLock Application 0 or 1 0 1: the client takes no edit lock when a user opens a document for editing. Applies to all file types. Exists in 11.2. It has an effect again because edit locks are active again in 11.3.
Application\FileExtensions\<extension>\NoLock Application 0 or 1 Value of *.* Same as above for one file type, for example docx. This value has priority over the *.* value. As above
Application\Options\HiddenSettings\<name> Application 1: hidden. 0 or no value: visible. 0 Hides one control in the Options dialog. Administrators always see all controls. The value names are listed below this table. New
Application\IntegrateWebClient Application 0 or 1 1 0 disables all web client features: menu items, Ctrl+click, the VBA API, and the options AllowWebClient and PreferWebClient. New
Application\AllowWebClient Database. The application scope is not read. 0 or 1 The class tag allowWebClient. Without a tag: 0. 1 allows “Open in web client” for records. Options > Misc. New. Since 11.3.4474 the scope is database. Values that earlier 11.3 builds wrote at application scope are ignored.
Application\PreferWebClient Database. The application scope is not read. 0 or 1 0 1 opens records in the web client instead of a card. The class also needs the tag preferWebClient = true. In the menu of a relation field drop-down list, a missing tag counts as true. Has no effect when IntegrateWebClient is 0. New
UrlEncoding\UseLegacyCodePage Application. The path does not start with Application\. 0 or 1 0 1: the client decodes limecrm: link URLs with the code page of the user's locale. 0: the client detects the encoding (UTF-8 first). New
Application\EnableInspectorFullTextSearch Database 0 or 1 0 Shows the search bar on cards. Needs full-text search on the server and DisableFullTextSearch = 0. Options > Misc, “Show super search on cards”. Exists in 11.2. The 11.2 behaviour is restored. Changes apply to open cards without a restart.
Application\DisableFullTextSearch Database 0 or 1 0 1 disables global search, also when the web client is integrated. Exists in 11.2. Now also controls global search through the web client.
Application\UseRelevanceScoring Database (per user and database) 0 or 1 0 Sorts relation search results by relevance. Options > Misc, “Use relevance scoring for searching relations”. New
Application\DimFieldsIfNULL Application 0 or 1 0 Dims fields that have no value. Options > Misc. A value that a user saved earlier is kept. Default changed from 1 to 0
Application\IncludeClassFilters Database 0 or 1 1 0: a card does not include the filters of the record type. Applies after the next start. Options > Misc. New
Application\IncludeClassViews Database 0 or 1 1 0: a card does not include the views of the record type. Applies after the next start. Options > Misc. New
Application\Dialogs\ModifyData\RefreshAfterUpdate Application 0 or 1 1 Checkbox “Reload list after update” in the Mass update dialog. New
Dialogs\SearchRecords\<class GUID>\SearchSortField Database String: a field name Empty: the order of the search view Sort field for the search in relation fields. Search settings dialog, “Ascending by” or “Descending by”. New
Dialogs\SearchRecords\<class GUID>\SearchSortAscending Database true or false true Sort direction for SearchSortField. New
HKLM\Software\Lundalogik\Lime\Security\ShellGateHardBlock Machine. The client also reads HKLM\Software\Wow6432Node\Lundalogik\Lime\Security. It never reads HKCU. 0 or not 0 Not set Not 0: a risky launch is blocked without a prompt. See “File-security prompts” in the section about document handling. New
HKLM\…\Lime\Security\ShellSchemeAllowList Machine, as above REG_MULTI_SZ, one URL scheme per line Empty A listed scheme is allowed without the handler check. It cannot allow the schemes that are always blocked. New
HKLM\…\Lime\Security\ShellSchemeBlockList Machine, as above REG_MULTI_SZ Empty A listed scheme is always blocked, without a prompt. Has priority over the allow list. New
HKLM\…\Lime\Security\ShellVerbAllowList Machine, as above REG_MULTI_SZ Empty Allows more ShellExecute verbs. New
HKLM\…\Lime\Security\ShellVerbBlockList Machine, as above REG_MULTI_SZ Empty A listed verb is always blocked. runas and runasuser are always blocked. New
Filter property QueryTimeout Filter Seconds. 0: use the database value. 0 Total time for a list query, including the wait in the client queue. Changed: the time now includes the client queue. A sub-filter cannot extend the time.
features.databaseTimeout Server configuration Seconds 60 Query time when the filter has no QueryTimeout. Now also limits the wait in the client queue
features.maximumFileSize Server configuration MiB. A value below 1 is ignored. 50,000,000 bytes (client default) A larger document opens read-only. At check-in the client only warns; the server decides. Changed: the value is validated. A text value no longer blocks all check-ins.
features.recommendedDesktopVersion Server configuration Version None Highest version that “Check for updates” offers. Now also limits the manual check of the publicly released build
ForceClose Installer command line 0 or 1 0 1: ends a running Lime that does not close when asked, also in a full UI installation. New
LaunchLime Installer command line 0 or 1 0 1: starts Lime as the logged-on user after a passive or quiet installation. Changed: Lime now starts after all packages, through TinyLauncher.exe
DisableAutoUpdate Installer command line 0 or 1 0 1: the Lime Maintenance Service is not installed and the update add-in is not loaded. Unchanged

Value names for Application\Options\HiddenSettings:

Example: disable edit locks for all file types for one user.

reg add "HKCU\Software\Lundalogik\Lime\Settings\Custom\Application\FileExtensions\*.*" /v NoLock /t REG_DWORD /d 1 /f

Filter diagnostics

Tool How to open What it shows
Filter validation report Filter dialog > Advanced > Validate filter… An HTML report in a dialog. The client combines the filter with the current source of the list, as Preview hit count does.
Copy filter as XML Hold Shift and right-click the filter bar of a list (the menu with Reset filter, Ctrl+0) > Copy Filter (XML). Or right-click a filter in the filter list dialog > Copy Filter (XML). The raw filter, the evaluated filter and the query, as XML.
IFilter.BuildDescription(Class, Flags) VBA or COM A text that depends on Flags, see the table below.
DebugView Sysinternals DebugView, same user as Lime A line for each filter condition that the client drops because the field does not exist: Filter compatibility: dropping inaccessible field, condition replaced with dummy., followed by the class, field, operator and value type.

Values for Flags (FilterDescriptionEnum):

Name Value Result
lkFilterDescriptionRaw 0x01 Raw filter XML
lkFilterDescriptionEvaluated 0x02 Evaluated filter XML
lkFilterDescriptionQuery 0x04 Query XML
lkFilterDescriptionAllXml 0x07 All three XML parts
lkFilterDescriptionReadable 0x10 Text summary
lkFilterDescriptionAll 0x17 Text summary and all XML. Does not include the report.
lkFilterDescriptionBreakdown 0x20 The validation report as one HTML document

Parts of the validation report:

Part Content
Header Status, and the record count for each stage: Backend (optimised), Backend (un-optimised), Client composed. A stage that did not run shows “(not run)”.
Filter structure Two trees: Filter as you wrote it and Filter after the system rewrote it. Fields and options have their names. Each top-level sub-filter shows its own count.
Eliminated conditions A condition that the optimiser removes has a dashed amber frame and the badge “(eliminated by optimiser)”. The tooltip names the rule. Typical cases: two “not in” conditions joined with OR, two “in” conditions joined with AND over different values, or an empty value list.
Differences Differences between the stages
Technical details Step timings, notes, and the origin of merged sub-filters
Diagnostics The log of decisions during sub-filter merge and SQL generation. For the OR/AND case the log adds a hint, for example “If the intent was to exclude both values, the surrounding group should be ALL OF (AND), not ANY OF (OR)”. In a merged sub-filter the same case is logged as Info, not Warning. A “not in” condition is also checked by a second route. When the excluded and kept records do not cover the record type exactly, the report says so and lists the record ids.
Values of persons A value that points to a person or coworker shows the id and the type only, for example “60201 (Coworker - hidden for privacy)”.
XML The filter XML before and after the rewrite
Buttons Copy report, Copy HTML, Copy JSON

Query time limit (QueryTimeout):

Document handling

Edit locks

Item Fact
Lock at check-out The client takes an edit lock when a user opens a document for editing. A colleague then gets the document read-only. NoLock disables this, see the settings table.
Lock refresh A background thread in lime.exe confirms the lock to the server every 20 minutes while the user holds locks. Without locks it runs every 60 minutes.
Release of old own locks Shortly after login (first background pass) and at exit. The client releases a lock only when all of these are true: the server says the active user holds it, this process does not use it, the document folder has a .local.json file, and the document file is no longer in the folder. A lock that another computer holds is not released. Needs the server file API.
Lock after save of the record The client takes the lock again directly after a record with an open document is saved.
Predefined filters Built in memory for each record type with a document field. They are not saved on the server. [Locked - mine]: all users. [Locked - all], [Locked - stale] and the view [Lock details]: administrators only. “Stale” means a lock time before the start of yesterday.
Release command Right-click a record > Document > Force unlock. The same command is in the Document toolbar menu and in the menu of the document field.
Rights A user can release an own lock. An administrator can also release the lock of another user. The client always asks for confirmation and shows the owner and the age of the lock. The server makes the final decision.

Unsent documents

Item Path or fact
Documents folder <WorkingFolder>\Documents\<user>. This is not the Windows Documents folder.
Check-out folder <WorkingFolder>\Documents\<user>\<document id>, when the server has the file API
Record of a failed save .local.json in the check-out folder. A JSON object with keys such as lde.push.status, lde.push.class, lde.push.hresult, lde.push.http, lde.push.attempts, lde.push.first.utc, lde.push.last.utc.
Failure classes retryable, permanent, blocked, unknown. The dialog shows “Not sent yet” for a checked-out document that was not sent.
Preservation folder <WorkingFolder>\Documents\<user>\_failed\<document id>. When the name exists, the client adds -yyyymmdd-hhmmss.
When a folder moves to _failed At the next login. The client first tries to send the document again. It moves the whole check-out folder. It does not move a document that is open in another program. A permanent failure is not sent again unless the file changed. An unknown failure is not sent again after 5 attempts.
Notification After login (see Application\UnsentDocumentsScanDelay), 5 minutes after login, and at exit.
Dialog Tools > Unsent documents… Commands: Open, Open folder, Save a copy, Copy path, Copy details, Retry, Discard (always asks), Replace in CRM (administrators only).
API Database.GetUnsentDocuments() returns XML. Paths are relative and contain no user name.
Cleanup at close The client removes empty check-out folders and folders that contain only Office owner files (~$…). This also applies inside _failed.
Favorites cache <WorkingFolder>\Caches\favorites.<database id>.<user id>.cache. The client deletes the old file <WorkingFolder>\favorites.<database id>.<user id>.cache at login.

Read-only because of size

File-security prompts

All launches through Application.Shell, action pads, field links, content links and the phone dialer use one check. The order of the rules:

Target Result
Verb runas or runasuser, or a verb in ShellVerbBlockList Always blocked
Verb that is not open, openinprivate, openas, edit, print, printto, explore, find, properties or empty, and not in ShellVerbAllowList Risky
File path with a program or script extension (30 extensions, for example .exe, .cmd, .ps1, .vbs, .msi, .lnk, .url), or a command name without a path Risky
Folder, or a path that cannot be resolved now (for example a share that is not reachable) Allowed without a check. Windows handles it as before.
Document file that Windows attachment policy would warn about (IAttachmentExecute::CheckPolicy returns S_FALSE) Risky
Document file that Windows attachment policy blocks Always blocked
Scheme in ShellSchemeBlockList Always blocked
Scheme ms-msdt, search, search-ms, ms-officecmd, ms-cxh, ms-cxh-full, ms-appinstaller, hcp, res, vbscript, javascript or shell Always blocked. The allow list cannot change this.
Scheme in ShellSchemeAllowList Allowed
Scheme whose registered handler is a system tool such as powershell.exe, cmd.exe, mshta.exe or rundll32.exe (16 programs) Risky
Any other scheme (http, https, mailto, tel, Teams, Slack and others) Allowed

A risky target gives a prompt in the user's language. With ShellGateHardBlock set, or when the client has no visible window (for example unattended automation), a risky target is blocked and no prompt is shown.

Save as… and opening a document from a document field use their own check: IAttachmentExecute::CheckPolicy and AssocIsDangerous. When the file is unsafe, the client shows the same kind of prompt. These two paths do not read the HKLM\…\Lime\Security values.

Support and debugging

Debug output (DebugView)

Use Sysinternals DebugView as the same Windows user as Lime. Each line starts with a fixed prefix:

Prefix Area
Login: AllowSingleSignOnUsingOSPrimaryAccount= The setting “use primary Windows login” in the login dialog
WebView2.Environment: WebView2 runtime version, fixed version, SSO option, browser data folder
WebView2.Profile: Browser profile name
WebView2.DeviceJoin: Once per process: domain join, Entra join type, Entra device ID and tenant ID. No user name or e-mail address. Compare with dsregcmd /status and the Entra sign-in log.
[DdeCommand] Parse and dispatch of limecrm: links and DDE commands
[UrlDecoder] Link URL before and after decoding, and the decode mode
LinkClick: Link clicks in text fields
Application.Shell gate: Each launch decision: scheme, and “allowed” or the reason for a block
Filter compatibility: Filter conditions that the client drops
Shutdown: Steps at exit: “Close accepted”, “Background threads signalled”, “Logged out”, “VBA shut down”, “Frame closed”, “ExitInstance”. The same lines are Sentry breadcrumbs.
WorkDlg: Background operations with a progress dialog: “Job started”, “Jobs finished”, “Job failed”. The same lines are Sentry breadcrumbs.
CLockMonitor::, CDocumentEx::Heartbeat: Edit-lock refresh
FavoritesCache.Load: Problems with the favorites cache file

Sentry reports from the client

Event When
“Document content did not reach the server.” A document could not be sent. Level error for a permanent failure, otherwise warning. Sent once for each change of the failure class. The data contains the file name, extension and size.
“Unsent document content could not be preserved.” The move to _failed failed
Summary of the login sweep Unsent documents were found at login
“Application.Shell blocked a launch in a non-interactive context.” A risky launch was blocked because no prompt could be shown
Errors in limecrm: links The event contains the link URL, also when another Lime instance forwarded the link

Setup and service logs

Program Log location
VBA setup (setupVBA.exe, always elevated) %WINDIR%\Logs\Lime\setupVBA\<yyyymmdd-hhnnss>\. Files: setupVBA-run.log, last-run.txt, one log per MSI, install-vcredist2010_x86.html. When the folder cannot be created: the temporary folder.
TinyLauncher.exe (starts setupVBA and Lime after an update) Elevated: %WINDIR%\Logs\Lime\TinyLauncher.log. Not elevated: %ProgramData%\Lime\Setup\TinyLauncher.log.
Service update package (setupMaintenanceService.exe) Elevated: %WINDIR%\Logs\Lime\MaintenanceServiceUpdate\<yyyymmdd-hhnnss>\. Not elevated: %ProgramData%\Lime\Setup\MaintenanceServiceUpdate\<yyyymmdd-hhnnss>\. Files: run.log, LimeMaintenanceService.msi.log.
Installer (Burn bundle) %TEMP% by default. Use /log <file> for a fixed path.
Installer failure report %WINDIR%\Logs\Lime\SetupDiagnostics\SetupDiagnostics-<utc>.log or the folder of the bundle log, only when the report could not be sent
Lime Maintenance Service Windows Application event log, source LimeMaintenanceService

Event log of the Lime Maintenance Service

Id Level Meaning
1000 Information Request received: command, client, arguments
1001 Information Installer started as LocalSystem: session, process, requested file, started copy, SHA-256, signer, Burn engine version, arguments
1002 Warning Request refused: unknown command, failed validation, or failed process start
1003 Warning Requested arguments that the service did not pass on

Installer failure report

When an installation fails, the bundle package diagnostics.exe sends a report to Sentry. It runs on rollback, not on uninstall.

Commands for support

Task Command
Read the service events See the PowerShell command below this table
Run the installer with a log <installer>.exe /passive /norestart /log “C:\Temp\LimeSetup.log”
Same, and end a Lime that does not close <installer>.exe /passive /norestart ForceClose=1 /log “C:\Temp\LimeSetup.log”
List the setup logs Get-ChildItem “$env:WINDIR\Logs\Lime”, “$env:ProgramData\Lime\Setup” -Recurse
Check the service Get-Service LimeMaintenanceService and sc.exe qc LimeMaintenanceService
Check the service update record reg query “HKLM\SOFTWARE\WOW6432Node\Lime\MaintenanceServiceUpdate”
Check the WebView2 runtime version reg query “HKLM\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}” /v pv
Check the device join state dsregcmd /status
Show client settings of a user reg query “HKCU\Software\Lundalogik\Lime\Settings” /s

Read the events of the Lime Maintenance Service (PowerShell):

Get-WinEvent -FilterHashtable @{ LogName = 'Application'; ProviderName = 'LimeMaintenanceService' } -MaxEvents 50 |
    Format-List TimeCreated, Id, LevelDisplayName, Message

Installation and update

Requirements

Component Fact
Windows The bundle condition is VersionNT >= v6.1 (Windows 7 or later).
.NET Framework 4.7.2 The bundle contains the WiX package group NetFx472Redist. It installs .NET Framework 4.7.2 when it is missing.
WebView2 Runtime Detected through HKLM\SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}, value pv, 32-bit registry view. The runtime counts as installed when pv has a value that is not 0.0.0.0. A per-user runtime does not count. Otherwise the bundle runs MicrosoftEdgeWebview2Setup.exe /silent /install (per machine). In 11.2 the bundle checked only that the key existed.
VBA 7.1 setupVBA.exe (Inno Setup) installs Vba71.msi and Vba71_1033.MSI with msiexec /quiet /norestart. The bundle starts it after the main package through TinyLauncher.exe with /verysilent (/verysilent /repair for a repair).
Visual C++ 2010 runtime (x86) setupVBA.exe runs vcredist2010_x86.exe (10.0.40219.325) with /q /norestart at every run. Setup fails when msvcr100.dll in SysWOW64 is older than 10.0.40219.325 afterwards.
Other Visual C++ runtimes None. 11.2 installed the Visual C++ 2015-2022 x86 redistributable (14.38.33130) and the VC++ 2010 merge module. 11.3 installs neither.

Signing

Running applications during installation

Case Behaviour
Full UI The client MSI uses the Windows Restart Manager. The installer lists the running applications and asks the user to close them.
Passive or quiet (automatic update, or /passive or /quiet by hand) Running applications are closed without a question. A Lime that does not close when asked is ended (MSI property MSIRMSHUTDOWN = 1).
ForceClose=1 Same as passive also in a full UI installation: a Lime that does not close is ended.
Client MSI run alone, without the bundle MSIRMSHUTDOWN is set only when FORCECLOSE=1 is passed.
Windows logoff or shutdown that is cancelled Lime keeps running. Lime closes only when the session really ends.

Restart

Component Fact
Client MSI and service MSI REBOOT=Suppress
Lime Maintenance Service Always adds /norestart to the installer arguments
Update add-in Starts the installer with /passive /norestart (before: /promptrestart /passive)
Product repair from Lime /repair /passive /norestart LaunchLime=1
setupVBA.exe Passes /norestart to msiexec and to the VC++ 2010 setup. Result 3010 counts as success and is written to the log.

Installer command-line variables

Syntax: <installer>.exe Name=Value.

Variable Type Default What it does Status
InstallFolder String [ProgramFilesFolder]Lundalogik Base folder. The client goes to <InstallFolder>\Lime CRM, the service to <InstallFolder>\Lime Maintenance Service. Unchanged
LIMELANGUAGE String windows Written to HKLM\SOFTWARE\Lundalogik\Lime\DefaultLanguage Unchanged
LIMESERVER String Empty Default server Unchanged
LIMEDATABASE String Empty Default database Unchanged
LIMEAUTOLOGIN Number 0 Default for automatic login Unchanged
LIMEHTTPSPORT Number 443 Default HTTPS port Unchanged
HOSTING Number 0 Hosted installation Unchanged
LaunchLime Number 0 1: start Lime as the logged-on user after a passive or quiet installation, after all packages Changed: started by LaunchLime.exe (TinyLauncher) as the last package
DisableAutoUpdate Number 0 1: the Lime Maintenance Service is not installed and the update add-in does not load Unchanged
DisableUsageReport Number 0 Written to HKLM\Software\Lundalogik\Lime\UsageFeedback\Disable Unchanged
ForceClose Number 0 1: end a Lime that does not close when asked, also with full UI New

Lime Maintenance Service

Item Fact
Service name LimeMaintenanceService. Version line 12.0.<build>, with the build number of the 11.3 release.
Accepted arguments /passive, /quiet, /silent, /verysilent, /repair, /suppressmsgboxes, /norestart, LaunchLime=0 or LaunchLime=1. Other arguments are dropped (event 1003). A request without an unattended switch is refused. /norestart is always added.
Checks before start The file exists. The service copies it to <service folder>\Run\<guid>, where only LocalSystem and Administrators have access. The copy must have a valid signature from Lime Technologies Sweden AB, Lund, SE. The original file name must start with “setup”. A Burn bundle must use Burn engine 3.14.1 or later.
Run As LocalSystem in the user's session, with TEMP and TMP set to <service folder>\Temp. Run folders older than 1 day are removed.
Disable for tests HKLM\SOFTWARE\WOW6432Node\Lundalogik\Lime Maintenance Service, DWORD Disabled not 0. Or set the service start type to Disabled.

Service update package

Item Fact
File setupMaintenanceService.exe
Purpose Updates an installed Lime Maintenance Service to the version of this release. It never installs, removes or downgrades the service.
Without administrator rights It asks the installed service to run it. When that does not work within 120 seconds, it asks for elevation (UAC).
Old vulnerable service A service older than 12.0.4710.0 that cannot be updated is stopped and disabled.
Record HKLM\SOFTWARE\WOW6432Node\Lime\MaintenanceServiceUpdate: PatchedVersion, PatchedFromVersion, PatchedAt. After a disable also DisabledAt and DisabledReason.
Exit codes 0: updated, passed to the service or elevated instance, or already current. 1: service not installed, UAC cancelled, or installation failed. 2: the service could not be updated and was disabled.