Automatically Uninstall Unused Applications with SCCM

Nicolas PilonApplication, Asset Intelligence, SCCM, SOFTWARE METERING27 Comments

Do organizations pay too much for your software licensing? Paying more licences than you use doesn’t make your company really effective, especially when we talk about IT Cost Transparency. Do you know how much money your company spends on software licensing versus their utilization?

Using inventory, SCCM detects if an application is installed, it also monitors usage using Software Metering and uninstalls the application using deployment mechanisms. Combining all, you can deliver a great solution to minimize licences cost to your organization.

Software metering is a great feature that is not always well known by the business. The company must take the advantage of monitoring the usage and automatically uninstalling applications that are unused. For more details about Software Metering, read this TechNet post.

This post shows how to automatically uninstall unused applications with SCCM witch is also part 5 of the Asset Intelligence Blog Series.

Pre-Requisites

The first thing you must do is enable and configure the software metering based on Asset IntelligenceSoftware metering is a feature used in SCCM to monitor and collect software usage data. The data collected from all the devices must be present in the SCCM database, otherwise, it won’t work.

You also need to decide what will be the grace period in days, before you consider an unused application. If you’re too aggressive, users will need to reinstall the applications more frequently and lose productivity time. On the other side, being too loose, you will overpay your licence usage. We will use a 120 days value.

Collections

Create all the device collections assigned to an application. You create collections that will :

  1. Installed: Target devices where the application is installed
  2. Last Usage in last 120 Days: Target devices that use the application in the last 120 days
  3. Warning Zone: Create a warning zone to make sure the uninstaller will be executed on a device that has at least run the application one time
  4. Last Usage over 120 Days: Target devices that use the application over 120 days

SCCM Automatically uninstall application

Installed

This collection lists all devices that have the application installed. You have the possibility to use data from Add Remove Programs or Asset Intelligence, we suggest using Asset Intelligence. Using only software metering data to target the number of installation results to not relevant information. The Query Rule for the collection is:

[su_note note_color=”#d2d2d2″ radius=”8″]SELECT SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_INSTALLED_SOFTWARE on SMS_G_System_INSTALLED_SOFTWARE.ResourceId = SMS_R_System.ResourceId where SMS_G_System_INSTALLED_SOFTWARE.ProductName = “Application Name“[/su_note]

** Change the application name in the query with your selected application.

Last Usage in last 120 days

This collection lists all devices that use the application properly in the last 120 days and will not be uninstalled. The Query Rule for the collection is:

[su_note note_color=”#d2d2d2″ radius=”8″]select SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup,  SMS_R_SYSTEM.Client from SMS_R_SYSTEM  inner join SMS_MonthlyUsageSummary on SMS_R_SYSTEM.ResourceID = SMS_MonthlyUsageSummary.ResourceID    INNER JOIN SMS_MeteredFiles ON SMS_MonthlyUsageSummary.FileID = SMS_MeteredFile.MeteredFileID WHERE SMS_MeteredFiles.ProductName = ‘Application Name‘  AND DateDiff(day, SMS_MonthlyUsageSummary.LastUsage, GetDate()) < 120[/su_note]

** Change the application name in the query with your selected application and the number 120 days  with your grace period time.

Warning Zone

Warning Zone shows devices that have the software installed without being used for 120 days. The Membership Rules are :

SCCM Automatically uninstall application

  • Include the Installed collection
  • Exclude devices from the Last Usage in the last 120 days collection

Last Usage over 120 days

The collection Last Usage over 120 days contains devices that used at least one time the software over 90 days.

By limiting the collection membership to the Warning Zone, it targets devices that have at least run the software. You make sure to not uninstall the application on devices mostly new or devices that newly received the software or simply never use it.

[su_note note_color=”#d2d2d2″ radius=”8″]select SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client from SMS_R_SYSTEM  inner join SMS_MonthlyUsageSummary on SMS_R_SYSTEM.ResourceID = SMS_MonthlyUsageSummary.ResourceID    INNER JOIN SMS_MeteredFiles ON SMS_MonthlyUsageSummary.FileID = SMS_MeteredFile.MeteredFileID WHERE SMS_MeteredFiles.ProductName = ‘Application Name‘  AND SMS_MonthlyUsageSummary.LastUsage IS NOT NULL[/su_note]

** Change the application name in the query with your selected application

Uninstall Deployment

Prepare your uninstaller command and once approved, deploy to the Last Usage over 90 days collection. Make sure the deployment is quiet or has a minimum of warning. If your company uses System Center Orchestrator, we suggest taking a look at this blog series by Neil Peterson. He wrote a couple of posts on Software Metering Deep Dive and Automation, The Basics, The Collections and Orchestrator Integration. The integration with Orchestrator ensures that users are warned before getting their application uninstalled. 

Verification

There’s not many things for verification since the mechanism is based on installed software. As soon the device is completely uninstalled the software does a hardware inventory scan, the devices will be excluded from the Installed collection. You can also use our inventory software report that monitors software’s last usage based on installation.

sccm 2012 software metering custom reports

If you are interested to configure software metrics and monitor usage with SCCM, take time to read our Asset Intelligence Blog Series:

SCCM Automatically uninstall application

27 Comments on “Automatically Uninstall Unused Applications with SCCM”

  1. Actually looks like the article is riddled with quite a few problems. There is confusion over collection names and meanings for example towards the end its talking about 90 day collection over 120 days mentioned in the article. But then the next question of course is why is this collection being targeted and not the warning zone collection?

    Then there is this statement:
    Warning Zone: Create a warning zone to make sure the uninstaller will be executed on a device that has at least run the application one time

    If the author had some time to update the article it could be extremely useful. And thanks of course for taking the time to create it 🙂

  2. The article may be out of date unfortunately. Last usage in 120 days query as an example does not work due to a syntax error.

  3. Is there a way to bring back for a user on a machine just the software we have tagged that we are interested in
    We are using the v_R_User joined to v_R_System joined to v_GS_INSTALLEDSOFTWARE_CATEGORISED and are trying to JOIN TO v_LU_SOFTWARELIST to filted by Tag1ID.

    The query below brings back a lot of duplication

    SELECT dbo.v_R_User.Full_User_Name0, dbo.v_R_User.title0, dbo.v_R_User.department0, dbo.v_R_System.Name0, dbo.v_GS_INSTALLED_SOFTWARE_CATEGORIZED.Publisher0,
    dbo.v_GS_INSTALLED_SOFTWARE_CATEGORIZED.ProductName0
    FROM dbo.v_LU_SoftwareList INNER JOIN
    dbo.v_GS_INSTALLED_SOFTWARE_CATEGORIZED ON dbo.v_LU_SoftwareList.Tag1ID = dbo.v_GS_INSTALLED_SOFTWARE_CATEGORIZED.Tag1ID
    INNER JOIN
    dbo.v_R_User INNER JOIN
    dbo.v_R_System ON dbo.v_R_User.User_Name0 = dbo.v_R_System.User_Name0 ON dbo.v_GS_INSTALLED_SOFTWARE_CATEGORIZED.ResourceID = dbo.v_R_System.ResourceID
    WHERE Tag1Name = ‘CCC Allow’ AND department0 LIKE ‘CSTS A%’
    ORDER BY department0, Full_User_Name0, Publisher0, ProductName0

  4. It’s a old post but I have error of syntax WQL with this portion of SQL

    select SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client from SMS_R_SYSTEM inner join SMS_MonthlyUsageSummary on SMS_R_SYSTEM.ResourceID = SMS_MonthlyUsageSummary.ResourceID

  5. Pingback: Удаление неиспользуемого ПО через SCCM | Ozzy's Blog

  6. HI,

    We are dealing with 180 days , but there also its been mention “deploy to the Last Usage over 90 days collection”, do we need to create a different collection ?

  7. i tried to create collection for 120 days but I can’t find SMS_MonthlyUsageSummary on attribute class when i’m building the query because I did copy-paste it gave me error.

    Can anyone guide me on this?

    Thanks.

  8. SHould I set the deployment to always rerun or run once. Im finding that it is uninstalling the software, the user calls to get it put back on, & it uninstalls again. Do I set it to never rerun? If so if it falls in the collection in the next 90 days it will not be removed. – Thanks

  9. Pingback: SQL Report: Unused Applications SCCM | Ami Casto

    1. The No Last Usage is configure to include Warning Zone and exclude Last Usage over 120 Days. However, is not a mandatory collection.

  10. When I copy/paste the code to my collection and wnat to save it errors out with syntax error. Is it possible to for you to review the code so it’s ready for copy/paste?

        1. Hello Jens,

          I would like to know what was the syntax error and what you changed to resolve it. Sometimes, copy paste from web is not copying perfectly.

          Thanks for your time

          1. I’m using this one for the “Installed Application”, which works:

            select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_INSTALLED_SOFTWARE on SMS_G_System_INSTALLED_SOFTWARE.ResourceID = SMS_R_System.ResourceId where SMS_G_System_INSTALLED_SOFTWARE.ProductName like “Adobe Reader%”

          2. Hello Kees,

            Thanks for you query.

            I compared both and the difference is how want to target your application.

            In your case, it’s Like with ‘%%’.

            I our case, it’s = with ‘Application Name’

            If you are targeting all version, you’re ok. If you want a specific software and version, you can choose the equal.

            Finally, it depends the situation!
            Thanks

    1. Hello Krishna,

      Yes exactly. You can also configure the collection membership refresh rate, once each 7 days.

      Let us know the results.

  11. Where is the No Last Usage Collection used, I see it is limited to Warning Zone, But I am not sure on the query to use for it and how it applies to Over 120 Days.
    Thanks

    1. Hello TT,

      The No Last Usage collection is not mandatory. However, the collection membership is configure to include Warning Zone and exclude Last Usage over 120 Days.

      The Warning Zone is the devices that have the application installed and exclude devices that used the application.

      Thanks

Leave a Reply