Windows Server Installed Programs List & Software Inventory Report – PowerShell HTML Script
Aşağıdaki komutu Powershell ile çalıştırmanız gerekmektedir.
# ==========================================
# Installed Software Audit Report (HTML)
# Read-only / Non-destructive
# ==========================================
$OutputDir = "C:\Temp"
$OutputHtml = Join-Path $OutputDir "Installed_Software_Audit.html"
if (!(Test-Path $OutputDir)) {
New-Item -ItemType Directory -Path $OutputDir | Out-Null
}
function Resolve-SIDToUser {
param([System.Security.Principal.SecurityIdentifier]$Sid)
if ($null -eq $Sid) { return $null }
try {
return $Sid.Translate([System.Security.Principal.NTAccount]).Value
}
catch {
try { return $Sid.Value } catch { return $null }
}
}
# Registry uninstall paths
$uninstallPaths = @(
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*",
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
)
# Installed software list
$programs = foreach ($path in $uninstallPaths) {
Get-ItemProperty $path -ErrorAction SilentlyContinue | Where-Object {
$_.DisplayName -and $_.DisplayName.Trim() -ne ""
} | Select-Object `
@{Name='DisplayName';Expression={$_.DisplayName}},
@{Name='DisplayVersion';Expression={$_.DisplayVersion}},
@{Name='Publisher';Expression={$_.Publisher}},
@{Name='InstallDateRaw';Expression={$_.InstallDate}},
@{Name='InstallLocation';Expression={$_.InstallLocation}},
@{Name='UninstallString';Expression={$_.UninstallString}},
@{Name='RegistryPath';Expression={$_.PSPath}}
}
# Normalize InstallDate
$normalizedPrograms = foreach ($p in $programs) {
$installDate = $null
if ($p.InstallDateRaw -match '^\d{8}$') {
try {
$installDate = [datetime]::ParseExact($p.InstallDateRaw, 'yyyyMMdd', $null)
}
catch {
$installDate = $null
}
}
[PSCustomObject]@{
DisplayName = $p.DisplayName
DisplayVersion = $p.DisplayVersion
Publisher = $p.Publisher
InstallDate = $installDate
InstallLocation = $p.InstallLocation
UninstallString = $p.UninstallString
RegistryPath = $p.RegistryPath
}
}
# MSI Installer events (if present in retained logs)
try {
$msiEvents = Get-WinEvent -FilterHashtable @{
LogName = 'Application'
ProviderName = 'MsiInstaller'
Id = 1033, 11707
} -ErrorAction Stop | Select-Object TimeCreated, Id, ProviderName, Message, UserId
}
catch {
$msiEvents = @()
}
# Correlate programs with MSI events
$result = foreach ($prog in ($normalizedPrograms | Sort-Object DisplayName, InstallDate -Unique)) {
$matchedEvent = $null
$matchedUser = $null
if ($prog.InstallDate) {
$dayStart = $prog.InstallDate.Date
$dayEnd = $prog.InstallDate.Date.AddDays(1)
$candidateEvents = $msiEvents | Where-Object {
$_.TimeCreated -ge $dayStart -and $_.TimeCreated -lt $dayEnd -and
$_.Message -like "*$($prog.DisplayName)*"
}
if (-not $candidateEvents -and $prog.DisplayName) {
$firstWord = ($prog.DisplayName -split '\s+')[0]
if ($firstWord) {
$candidateEvents = $msiEvents | Where-Object {
$_.TimeCreated -ge $dayStart -and $_.TimeCreated -lt $dayEnd -and
$_.Message -like "*$firstWord*"
}
}
}
if (-not $candidateEvents -and $prog.Publisher) {
$pubWord = ($prog.Publisher -split '\s+')[0]
if ($pubWord) {
$candidateEvents = $msiEvents | Where-Object {
$_.TimeCreated -ge $dayStart -and $_.TimeCreated -lt $dayEnd -and
$_.Message -like "*$pubWord*"
}
}
}
$matchedEvent = $candidateEvents | Sort-Object TimeCreated | Select-Object -First 1
if ($matchedEvent) {
$matchedUser = Resolve-SIDToUser -Sid $matchedEvent.UserId
}
}
[PSCustomObject]@{
ServerName = $env:COMPUTERNAME
DisplayName = $prog.DisplayName
DisplayVersion = $prog.DisplayVersion
Publisher = $prog.Publisher
InstallDate = if ($prog.InstallDate) { $prog.InstallDate.ToString("yyyy-MM-dd") } else { "" }
InstalledBy = $matchedUser
EventTime = if ($matchedEvent) { $matchedEvent.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss") } else { "" }
EventID = if ($matchedEvent) { $matchedEvent.Id } else { "" }
InstallLocation = $prog.InstallLocation
UninstallString = $prog.UninstallString
RegistryPath = $prog.RegistryPath
}
}
# Deduplicate final list by software/version/publisher/install date
$result = $result |
Sort-Object DisplayName, DisplayVersion, Publisher, InstallDate -Unique
# Summary
$reportDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$totalCount = ($result | Measure-Object).Count
$withUser = ($result | Where-Object { $_.InstalledBy -and $_.InstalledBy.Trim() -ne "" } | Measure-Object).Count
# HTML Style
$style = @"
<style>
body {
font-family: Segoe UI, Arial, sans-serif;
font-size: 12px;
color: #222;
margin: 20px;
}
h1, h2, h3 {
color: #1f4e79;
}
table {
border-collapse: collapse;
width: 100%;
table-layout: auto;
}
th, td {
border: 1px solid #d9d9d9;
padding: 6px 8px;
vertical-align: top;
text-align: left;
word-wrap: break-word;
}
th {
background-color: #1f4e79;
color: white;
position: sticky;
top: 0;
}
tr:nth-child(even) {
background-color: #f7f9fc;
}
.summary {
margin-bottom: 20px;
padding: 12px;
background: #eef4fb;
border: 1px solid #c7d7ea;
}
.note {
margin-top: 15px;
padding: 10px;
background: #fff8e1;
border: 1px solid #f0d58c;
}
.small {
font-size: 11px;
color: #555;
}
</style>
"@
# HTML Header / Summary
$preContent = @"
<h1>Installed Software Audit Report</h1>
<div class='summary'>
<b>Server Name:</b> $env:COMPUTERNAME<br>
<b>Report Date:</b> $reportDate<br>
<b>Total Software Count:</b> $totalCount<br>
<b>Entries with InstalledBy Detected:</b> $withUser
</div>
<div class='note'>
<b>Note:</b> InstalledBy field may be blank for non-MSI installations, software deployed by SCCM/Intune/GPO/service accounts,
or when relevant event logs are no longer retained on the server.
</div>
<br>
"@
# Generate HTML
$result |
Sort-Object InstallDate, DisplayName |
ConvertTo-Html -Head $style -PreContent $preContent -Title "Installed Software Audit Report" |
Out-File -FilePath $OutputHtml -Encoding UTF8
Write-Host "HTML rapor oluşturuldu: $OutputHtml" -ForegroundColor Green



Arif Akyüz
Bilgi Teknolojileri
Sistem Network Yöneticisi
ve Siber Güvenlik Uzmanı
[email protected]
- What is an LLM (Large Language Model)?
- CVE-2026-31431 (Copy Fail) – Ubuntu Security Mitigation Guide
- Windows Active Directory’de AD Kullanıcıları Raporlama – PowerShell ile Adım Adım
- Learn WiFi Password Using CMD (Windows Guide)
- What is RBAC (Role-Based Access Control)?
- PowerShell Get-WinEvent for Windows Event Log Analysis, Security Auditing and Digital Forensics
- Application Security: How to Check if a Software is Safe to Use
- How to Check Windows Server Restart History Using PowerShell
- GENAI and the Growing Cyber Threat: Raising Awareness for a Safer Digital Future
- PowerShell RDP Log Analysis Guide
- Windows 11 Recovery Bölümünü Silerek Disk Genişletme
- Windows Server Installed Programs List & Software Inventory Report – PowerShell HTML Script
- Microsoft 365 Copilot Agents: Microsoft-Developed Agents
- Top Professional Titles for Experts in AI Agent Management
- Quick File Finder with Powershell
- Let’s Encrypt SSL Certificate Setup for Wazuh Dashboard
- Automatically Connecting Windows 11 Devices to a Hidden SSID Without Sharing the Password
- Ubuntu Server Initial Setup and Configuration Guide
- Intel Core i5 Processor Generations (2009–2025)
- WAZUH ile pfSense Logları ile Trafik Analizi ve Filtreleme
- Intel Core i7 Processor Generations (2008–2025)
- pfSense Log Filtering Guide for Wazuh Discover
- Intel Core i9 Processor Generations (2017–2025)
- Opening a Port and Testing TCP Connections with PowerShell
- Testing Your Antivirus with PowerShell (Safe EICAR Script)
- Python Virtual Environment (venv) Setup: Windows, Linux & macOS
- test-antivirus-powershell
- Listing Unique IP Addresses in a File with PowerShell
- Adding Entries to Windows 11 Hosts File Using CMD
- .bak the process of opening and importing a SQL file
- .NET Framework 3.5 installation fails
- 1. Change user password with CMD
- 2. Create users with CMD
- 3. Delete a user with CMD
- 4. Open Port Inquiry CMD
- 5. Learning external IP with CMD
- 6. Domaine Alma with CMD
- 8. Creating a Folder with CMD
- 9. Shut Down a Remote Computer with CMD
- Account keeps locking
- Active Directory Security
- Active Directory Unlock Account Permission
- Add a Program to the Right-Click Menu
- Add Google Ads conversion tracking code to WordPress
- Add Opencart Google Ads conversion tracking code (add snippets)
- Add Whatsapp order button
- Adobe Illustrator Convert Type to Vector
- ALL ARTICLES
- Allow a standard user to run an application as an administrator in Windows
- ARİF AKYÜZ – SITE CONTENT
- Articles
- Backup Policy
- BC Search for Files and Folders with CMD
- Bitlocker Commissioned
- C# XML File Data Pull, Add, Delete, Update Operations
- Centos 7 IP Switching
- Change MAC Address
- Change the ADD to WooCommerce cart post
- Cisco Router Configuration
- Cisco Switch Model Learning Command
- Cisco Switch Setup
- CMD commands
- Combine columns one after the other in Excel
- Convert Picture to Text Converting Picture to Word
- Create a table of contents in Word
- Critical Files on Linux
- Cryptolocker Extension List
- CSS icon Package
- Cyber Security Certifications
- Cybersecurity Courses Passive Information Collection
- Data recovery via formatted disk
- Define the same proxy address for all users on Terminal Servers
- Delete Files and Folders with Task Scheduler Delete a File and Folder with PowerShell
- Deleting User Profile Files with Powershell
- DHCP Fail-over on Windows Server 2019
- Directory Structure on Linux
- Diskpart
- DNS Cache Clearing
- DOWNLOAD
- Exchange version information learning command
- Exchange: Bypass Malware Filtering
- File commands on Linux
- File Permissions on Linux
- Find out which port the app is using in Windows
- Forti Firewall IP Export
- Forti IP Export
- Google Advertising
- Google Advertising with ADS
- Google DNS
- Google Tag Manager Click Tracking
- Google Tag Manager Installation Turkish Lecture
- Group policy see command CMD applied to the computer
- How to Build an E-Commerce Site
- How to configure Proton VPN on pfSense using WireGuard
- How to Create a Shortcut to a Hyper-V Virtual Machine
- How to Create Trusted Self-Signed SSL Certificates and Local Domains for Testing
- How to Find Out the Motherboard Model?
- How to Get Facebook Pixel Code
- How to install FortiGate FortiOS 7.0
- How to Make a Vector Logo with Adobe Illustrator
- How to Put Password on Word Document
- How to Stay Safe From Stealer Attacks
- How to write IPv6 as a URL
- How to: Create CSR Code Through IIS
- HPE StoreOnce Systems
- IE Prevent running First Run Wizard
- Import Google Chrome passwords
- Instagram ad account closed
- INSTAGRAM ADVERTISING TRAINING
- Internal Network Attacks
- IPv6 Proxy
- Kali Linux Installation
- LAPS Installation and Configuration
- Learning Exchange CU Info command
- Learning MAC address with IP
- List files in an Excel folder
- Log4j scan for Linux
- Log4j Scan for Windows
- Mbps to kbps Converter
- Microsoft Endpoint Manager
- Microsoft Intune EDR import Server
- Microsoft Security Compliance Toolkit 1.0
- Most used ports
- My Instagram Ad Account Has Been Closed, How Can I Open?
- Network Settings for Viritual Box Virtual Machines
- NMAP Commands
- Open the UBUNTU SSH Port
- Opencart social media icon pack
- Package Management on Linux
- Password Expiration Date AD User
- Password Policy
- Paste into Excel Filtered Cells
- PDF Encryption and PDF file encryption
- Persistent user account lockout
- Ping IPv6
- Process Management on Linux
- Pull List of Domain Admin Group Members
- Pull local admin accounts of devices in the domain with Powershell
- Pulling a List of Applications Installed on the Computer with CMD
- Random MAC Address Generation
- Random password generator
- Random Password Generator
- RDP Event Viewer ID
- Real-Time Cyber Threat Map
- Reliable and fast DNS Server List 2022
- Remove additional information, product description, and product review from the WooCommerce product page
- Remove vmware workstation encryption
- RVTools
- Samsung phone throwing rom
- Samsung tablet rom throwing
- See the open and closed ports on the Cisco switch
- Send Outlook future mail
- Server room Checklist
- Server Sustainability
- Showing the Lowest Price on Products with WooCommerce Options
- SMB Signing Disabled
- Social Engineering Attacks
- Speed test
- SQL Injection Attack
- SQL Server 2019 setup
- Switch commands
- This computer can't run windows 11 error solution
- Turn off Insecure TLS Versions
- User management on Linux
- What is a bot?
- What is Biometric Photography?
- What is EternalBlue?
- What is GRC?
- What is IPv6?
- WHAT IS NBTSTAT
- What is Penetration Testing? What is vulnerability scanning?
- What is Split Tunnel? What is Full Tunnel?
- Who reset the User's Password on AD
- Whoami commands
- Windows 10 Password Cracking Programless
- Windows 10 release history
- Windows 11 theme appearance customization
- Windows 2016 Startup Folder
- Woocommerce Closing to Shopping
- WordPress Search button removal hiding
- WordPress Whatsapp button add