- 7 Ways To Generate a List of Installed Programs in Windows
- Using The Windows PowerShell (Get-RemoteProgram)
- Using The Windows PowerShell (WMIC)
- Using Print Screen (Apps & Features)
- Using NirSoft UninstallView
- Using Belarc Advisor
- Using Geek Uninstaller
- CCleaner (Last Resort Option)
- Removing Or Updating Windows Software
- Use PowerShell to Quickly Find Installed Software
7 Ways To Generate a List of Installed Programs in Windows
Handy if you want to know what to reinstall
If you own a Windows PC, you’ll likely have a list of go-to software that you use all the time, whether it’s Chrome, Outlook, or Steam. Outside of these favorites, there’ll be other programs you’ve forgotten about or have never even used. That can be problematic—forgotten software takes up disk space and can be a security risk.
We absolutely recommend you properly uninstall programs on Windows that you don’t use, but that doesn’t help you if you don’t know what software you have installed, especially if you’re managing multiple PCs at once. Here are several ways to generate a list of installed programs in Windows 10.
Using The Windows PowerShell (Get-RemoteProgram)
If you want a list of installed programs in Windows 10 that you can export, the best solution is to use a built-in tool to create it. Few tools exist to do this, but one option is to use the Windows PowerShell (or command prompt, if you’re feeling old school).
For those who don’t know, the PowerShell has largely replaced the command prompt as the default terminal on Windows PCs. A script exists for PowerShell users to automatically list all installed programs called Get-RemoteProgram. This queries the Windows registry for a full and complete list of installed software on your PC.
- You’ll need to download the Get-RemoteProgram script for the PowerShell from the Microsoft TechNet website first. Download this, then place the file in your C:\Windows\System32 folder.
- Next, you’ll need to open a PowerShell window. You can do that by right-clicking the Windows Start menu and pressing Windows PowerShell (Admin) to open a new PowerShell window.
- You’ll need to make sure that Windows can run scripts like this—type Set-ExecutionPolicy Unrestricted to ensure that you can, hit enter, then press A to confirm.
- If that is successful, type Get-RemoteProgram to run the script, then hit enter. If you want to export the list to a file, type Get-RemoteProgram > list.txt instead.
Using The Windows PowerShell (WMIC)
You can use either the PowerShell or cmd to run the Windows Management Instrumentation Command-Line Utility (WMIC) to generate a list of installed programs in Windows 10. As the PowerShell is the default command-line tool for Windows 10 users, we’ll be using that here.
Using the WMIC tool to view or export a list of your installed Windows software will create a similar list to the Get-RemoteProgram script.
- In an open PowerShell window or command line terminal with administrative privileges, type wmic. Once the WMIC prompt opens, type /output:C:\list.txt product get name, version then hit enter. You can replace C:\list.txt with another file name or output directory.
- Type exit to close the WMIC tool once you’re done. A list of your installed software should be available in the text file at the location you provided for the output file.
Using Print Screen (Apps & Features)
If you want a visual list of your installed software, you could use the print screen key to take a screenshot in Windows of the Apps & Features menu in Windows Settings, where Windows displays a list of your installed software for you to modify or remove.
- To access this menu, right-click the Windows Start menu and press Settings. From here, press Apps > Apps & features. A list of your installed software will be visible in a scrollable list.
It’s unlikely that your installed PC software will fit in just one screenshot. You’ll need to press the PrtScrn button on your keyboard (or use third-party screenshot tools like Snagit), then paste your screenshots into a third-party image editor to save (or into a Word document).
You’ll need to scroll through the list and repeat this step to make sure you save the full and complete list of installed software on your PC.
Using NirSoft UninstallView
NirSoft UninstallView is a quick, third-party alternative that can help you generate a list of installed programs in Windows 10. Like the Get-RemoteProgram script, it will query the Windows registry for a complete list of installed software.
- To start, download NirSoft UninstallView and extract the ZIP file (the 64-bit version is recommended). Once that’s done, run the extracted UninstallView.exe file.
- UninstallView will scan your PC for installed software. Once that process has completed, the full list of software will be available in the UninstallView window. To export the list, press View > HTML Report – All Items.
- A file called report.html will be created in the same folder as the UninstallView.exe file, showing a formatted list of your installed software. Pressing HTML Report – All Items will open this file in your default web browser.
Using Belarc Advisor
Belarc Advisor has been a must-have tool in the arsenal of local PC repair shops for years, and it remains a useful tool for Windows 10 users. It generates a breakdown of your PC software, hardware, settings, installed updates, and more to allow you to fully audit your Windows installation.
Like UninstallView, this will be visible in a formatted HTML file that you can export elsewhere.
- To start, download Belarc Advisor and install it. Once it’s installed, Belarc Advisor will begin an immediate audit of your PC—this will take a few moments to complete.
- Your default web browser will open once Belarc has finished its audit of your PC. To view a list of your installed software, press the Software Versions and Usage link in the side menu, or scroll to that section manually. This file will be available in the C:\Program Files (x86)\Belarc\BelarcAdvisor\System\tmp folder, should you wish to export it.
Using Geek Uninstaller
Geek Uninstaller is a third-party tool for uninstalling software. Like UninstallView, however, it also allows you to view and export a list of your installed programs in Windows 10.
- Download Geek Uninstaller to begin—you can choose the free version or the paid, Pro version. It comes as a ZIP file, so unzip the contents, then run the geek.exe file to launch the tool.
- The Geek Uninstaller window will show your installed software in an alphabetical list. To export the list, press File > Export to HTML or press Ctrl + S on your keyboard.
- Geek Uninstaller will ask you where to save the file—choose a location and a filename, then press Save to save the file.
- The generated list of your installed software will be saved, with the file automatically opened in your default web browser for you to view.
CCleaner (Last Resort Option)
There are plenty of reasons why you shouldn’t download CCleaner anymore. Once a go-to and essential piece of maintenance software for Windows users, many of its core features have been rendered useless or ineffective due to Windows changes, or have been incorporated into Windows itself (or into other, better third-party apps).
CCleaner also suffered a rather unfortunate incident back in 2017, when a malware-injected version of the CCleaner installer was uploaded and installed by millions of users. For most users, the trust is gone and the message is clear—avoid CCleaner.
However, CCleaner can export a list of installed programs, but we’re not going to recommend downloading it to do so. This is a last resort option, but if you already have CCleaner installed, you could use it to generate and export a list of your installed programs. That is, of course, before you rush to remove it.
- To do that, open CCleaner and press the Tools tab on the left, then click Uninstall. At the bottom of the window, press the Save to text file button. This will allow you to export a list of your installed software.
- Choose a location and filename for your exported list, then press Save to save it.
This will export your installed files as a file formatted using tab delimiters. Opening the file using Microsoft Excel will allow you to view the list in a more manageable way.
Removing Or Updating Windows Software
If you prefer to stay organized, or if you have too many PCs to maintain, generating a list of installed programs in Windows 10 can help you find the software you need to remove or update to give you more disk space and improve your security.
If you don’t need to remove it, make sure you find ways to keep your software updated automatically to get the latest security patches and bug fixes. You may end up with software that you just don’t want on your PC, however. If that’s the case, be sure to remove unwanted software from your PC as soon as you find it.
Ben Stockton is a freelance technology writer based in the United Kingdom. In a past life, Ben was a college lecturer in the UK, training teens and adults. Since leaving the classroom, Ben has taken his teaching experience and applied it to writing tech how-to guides and tutorials, specialising in Linux, Windows, and Android. He has a degree in History and a postgraduate qualification in Computing. Read Ben’s Full Bio
Use PowerShell to Quickly Find Installed Software
November 13th, 2011
Summary: Learn how to use Windows PowerShell to quickly find installed software on local and remote computers.
Microsoft Scripting Guy Ed Wilson here. Guest Blogger Weekend concludes with Marc Carter. The Scripting Wife and I were lucky enough to attend the first PowerShell User Group meeting in Corpus Christi, Texas. It was way cool, and both Marc and his wife Pam are terrific hosts. Here is what Marc has to say about himself.
I am currently a senior systems administrator with the Department of the Army. I started in the IT industry in 1996 with DOS and various flavors of *NIX. I was introduced to VBScript in 2000, and scripting became a regular obsession sometime in 2005. In 2008, I made the move to Windows PowerShell and have never looked back. My daily responsibilities keep me involved with Active Directory, supporting Microsoft Exchange, SharePoint, and various ASP.NET applications. In 2011, I founded the Corpus Christi PowerShell User Group and try to help bring others up to speed on Windows PowerShell.
Take it away, Marc!
One of the life lessons I have learned over the years working in the IT field as a server administrator is that there are often several different valid responses to a situation. It’s one of the things that makes work interesting. Finding the “best” solution to a problem is one of the goals that I think drives many people who are successful at what they do. Occasionally, the best solution is the path of least resistance.
This is one things I love most about working with Windows PowerShell (and scripting in general) is that most problems have more than one solution. Sometimes the “right” way to do something comes down to a matter of opinion or preference. However, sometimes the best solution is dictated by the environment or requirements you are working with.
For instance, let us talk about the task of determining which applications are installed on a system. If you’re familiar with the Windows Management Instrumentation (WMI) classes and the wealth of information that can be gathered by utilizing the Get-WmiObject cmdlet, an obvious choice might be referencing the Win32_product class . The Win32_Product represents products as they are installed by Windows Installer. It is a prime example of many of the benefits of WMI. It contains several useful methods and a variety of properties. At first glance, Win32_Product would appear to be one of those best solutions in the path of least resistance scenario. A simple command to query Win32_Product with the associated output is shown in the following image.
The benefits of this approach are:
- This is a simple and straightforward query: Get-WmiObject -Class Win32_Product.
- It has a high level of detail (for example, Caption, InstallDate, InstallSource, PackageName, Vendor, Version, and so on).
However, because we are talking about alternative routes, let us look at another way to get us to arrive at the same location before we burst the bubble on Win32_Product. Remember, we are simply looking for what has been installed on our systems, and because we have been dealing with WMI, let’s stay with Get-WmiObject, but look at a nonstandard class, Win32Reg_AddRemovePrograms.
What is great about Win32Reg_AddRemovePrograms is that it contains similar properties and returns results noticeably quicker than Win32_Product. The command to use this class is shown in the following figure.
Unfortunately, as seen in the preceding figure, Win32Reg_AddRemovePrograms is not a standard Windows class. This WMI class is only loaded during the installation of an SMS/SCCM client. In the example above, running this on my home laptop, you will see the “Invalid class” error if you try querying against it without an SMS/SCCM client installation. It is possible (as Windows PowerShell MVP Marc van Orsouw points out) to add additional keys to WMI using the Registry Provider, and mimic what SMS/SCCM does behind the scenes. Nevertheless, let us save that for another discussion.
One other possibly less obvious and slightly more complicated option is diving into the registry. Obviously, monkeying with the registry is not always an IT pro’s first choice because it is sometimes associated with global warming. However, we are just going to query for values and enumerate subkeys. So let’s spend a few moments looking at a method of determining which applications are installed courtesy of another Windows PowerShell MVP and Honorary Scripting Guy Sean Kearney (EnergizedTech). In a script that Sean uploaded to the Microsoft TechNet Script Center Repository , Sean references a technique to enumerate through the registry where the “Currently installed programs” list from the Add or Remove Programs tool stores all of the Windows-compatible programs that have an uninstall program. The key referred to is HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. The script and associated output are shown in the following figure.
Here are the various registry keys:
#Define the variable to hold the location of Currently Installed Programs
$UninstallKey=”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall”
#Create an instance of the Registry Object and open the HKLM base key
$reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey(‘LocalMachine’,$computername)
#Drill down into the Uninstall key using the OpenSubKey Method
$regkey=$reg.OpenSubKey($UninstallKey)
#Retrieve an array of string that contain all the subkey names
$subkeys=$regkey.GetSubKeyNames()
#Open each Subkey and use the GetValue Method to return the string value for DisplayName for each
At this point, if you are anything like me, you are probably thinking, “I’ll stick with a one-liner and use Win32_Product.” But this brings us back to why we started looking at alternatives in the first place. As it turns out, the action of querying Win32_Product has the potential to cause some havoc on your systems . Here is the essence of KB974524.
The Win32_product class is not query optimized. Queries such as “select * from Win32_Product where (name like ‘Sniffer%’)” require WMI to use the MSI provider to enumerate all of the installed products and then parse the full list sequentially to handle the “where” clause:,
- This process initiates a consistency check of packages installed, and then verifying and repairing the installations.
- If you have an application that makes use of the Win32_Product class, you should contact the vendor to get an updated version that does not use this class.
On Windows Server 2003, Windows Vista, and newer operating systems, querying Win32_Product will trigger Windows Installer to perform a consistency check to verify the health of the application. This consistency check could cause a repair installation to occur. You can confirm this by checking the Windows Application Event log. You will see the following events each time the class is queried and for each product installed:
Event ID: 1035
Description: Windows Installer reconfigured the product. Product Name:
. Product Version: . Product Language: . Reconfiguration success or error status: 0.
Event ID: 7035/7036
Description: The Windows Installer service entered the running state.
Windows Installer iterates through each of the installed applications, checks for changes, and takes action accordingly. This would not a terrible thing to do in your dev or test environment. However, I would not recommend querying Win32_Product in your production environment unless you are in a maintenance window.
So what is the best solution to determine installed applications? For me, it is reading from the registry as it involves less risk of invoking changes to our production environment. In addition, because I prefer working with the ISE environment, I have a modified version of Sean’s script that I store in a central location and refer back to whenever I need an updated list of installed applications on our servers. The script points to a CSV file that I keep up to date with a list of servers from our domain.
$computers = Import-Csv “D:\PowerShell\computerlist.csv”
foreach($pc in $computers)<
#Define the variable to hold the location of Currently Installed Programs
#Create an instance of the Registry Object and open the HKLM base key
#Drill down into the Uninstall key using the OpenSubKey Method
#Retrieve an array of string that contain all the subkey names
#Open each Subkey and use GetValue Method to return the required values for each
foreach($key in $subkeys)<
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name “ComputerName” -Value $computername
$obj | Add-Member -MemberType NoteProperty -Name “DisplayName” -Value $($thisSubKey.GetValue(“DisplayName”))
$obj | Add-Member -MemberType NoteProperty -Name “DisplayVersion” -Value $($thisSubKey.GetValue(“DisplayVersion”))
$obj | Add-Member -MemberType NoteProperty -Name “InstallLocation” -Value $($thisSubKey.GetValue(“InstallLocation”))
$obj | Add-Member -MemberType NoteProperty -Name “Publisher” -Value $($thisSubKey.GetValue(“Publisher”))
$array | Where-Object < $_.DisplayName >| select ComputerName, DisplayName, DisplayVersion, Publisher | ft -auto
My modified version of Sean’s script creates a PSObject to hold the properties I am returning from each registry query, which then get dumped into an array for later use. When I am done, I simply output the array and pass it through a Where-Object to display only those entries with something in the DisplayName. This is handy because I can then refer back to just the array if I need to supply different output. Say I want to only report on a specific server. I’d change Where-Object to something like this:
In conclusion, if you have added Windows PowerShell to your IT tool belt, you have plenty of go-to options when someone asks you, “What’s the best solution to a problem?”
Thank you, Marc, for writing this post and sharing with our readers