Autodesk Monitor is a console application that reads the current status of Flexible License Manager (FlexLM) for the license usage analysis.

FlexLM software is a prominent license management solution that enables software vendors to impose restrictions on the number of software seats available to their customers.

This tool is developed specifically for L-IT GmbH.

How does it work? Autodesk Monitor runs every 15 minutes (from the windows task scheduler), program execution results store into the MSSQL database. On the day end this tool generates a Microsoft Excel report, which contains information about:

  • Used license file
  • Product names
  • Bundles
  • Features
  • Existing / used seats (licenses)
  • Expiry date
  • Min / Max / Avg usage
  • Errors (if occurred on the status check)

Also, this software may:

  • Detect license overuse
  • Display usage by locations / hostnames / usernames

The main problem that I run into is how to parse status from the Flexible License Manager. I used lmutil.exe, it works great, but it has one small issue and this is the output:

lmutil - Copyright (c) 1989-2018 Flexera. All Rights Reserved.
Flexible License Manager status on Mon 11/2/2020 14:34

[Detecting lmgrd processes...]
License server status: [email protected]
    License file(s) on 10.206.12.112: C:\Autodesk\Network License Manager\lic\de-iph-emeaalic005056BA114A.lic:

10.206.12.112: license server UP (MASTER) v11.16.2

Vendor daemon status (on 10.206.12.112):

  adskflex: UP v11.16.2
Feature usage info:


Users of 86829PDCOLL_T_F:  (Total of 50 licenses issued;  Total of 6 licenses in use)

  "86829PDCOLL_T_F" v1.000, vendor: adskflex, expiry: 28-feb-2023
  vendor_string: commercial:extendable
  floating license

    USERNAME PCNAME PCNAME (v1.000) (10.206.12.112/27000 8835), start Mon 9/28 12:58  (linger: 4008249 / 7041600)
    USERNAME PCNAME PCNAME (v1.000) (10.206.12.112/27000 7130), start Mon 11/2 12:36
    USERNAME PCNAME PCNAME (v1.000) (10.206.12.112/27000 6374), start Mon 11/2 8:31
    USERNAME PCNAME PCNAME (v1.000) (10.206.12.112/27000 1993), start Mon 11/2 8:45
    USERNAME PCNAME PCNAME (v1.000) (10.206.12.112/27000 4047), start Mon 11/2 11:30
    USERNAME PCNAME PCNAME (v1.000) (10.206.12.112/27000 1603), start Mon 11/2 12:10

Users of 72400VLTM_T_F:  (Total of 28 licenses issued;  Total of 0 licenses in use)

Users of 87391VLTM_2021_0F:  (Total of 28 licenses issued;  Total of 0 licenses in use)

So I have written a lot of regular extensions for all found cases 🥶.

// Examples:
//   48 RESERVATIONs for GROUP GROUP1 (host3.domain.net / 27002)
//   8 RESERVATIONs for GROUP GROUP2 (host3.domain.net / 27002)
//   8 RESERVATIONs for GROUP GROUP3 (host3.domain.net / 27002)
var groupExpr = new Regex(@"^(\s+|)\d+\s+\w+\s+for\s+.*$", RegexOptions.Multiline);

Used Technologies