Sample audit report

What an audit report looks like.

An excerpt of a modernization audit, in the same seven sections as the real report, so you can see what you’d be handed and who it’s written for.

Example Example — a fictional system, not client work. The company, findings and plan are made up to show the format. The support dates are real.

Modernization audit · ExcerptExample · fictional

Order and inventory system

Prepared for a regional distributor: the operations director, the IT lead and finance.

System
Internal order entry, stock and dispatch, plus a customer portal
Stack
ASP.NET Web Forms on .NET Framework 4.6.2 · SQL Server 2012 · PHP 5.6 · IIS on Windows Server 2012 R2
Reviewed
Code, dependencies, data, hosting and the release process; interviews with the people who use and support it
Out of scope
The accounting system itself, beyond the file it receives

The system as it runs today

Two applications share one database on one virtual machine. A nightly job feeds the accounting system.

Highlight a component

Choose a box to mark its risks, support status and plan stage below.

Jump to the risks for the server: R1 Jump to the risks for the order and inventory app: R4, R6 Jump to the risks for the customer portal: R2 Jump to the risks for the database: R1, R3 Jump to the risks for the export job: R7

How it fits together

  1. Staff use the order and inventory app on the office network. Customers use the portal over the public internet.
  2. Both run under IIS 8.5 on one Windows Server 2012 R2 virtual machine.
  3. Both read and write the same SQL Server 2012 database on that machine; the portal with full rights.
  4. A nightly SSIS job exports invoices as a file to the accounting system.
  5. Releases reach the server as files copied over FTP by hand.
Figure 1. Components, data and hosting as found. Tags such as R1 mark the risks ranked in section 6.

Support status

Every runtime, framework and major dependency, and whether it still gets security updates.

ComponentUsed forStatusSecurity updatesRisk
Windows Server 2012 R2The one virtual machine everything runs onEndedExtended support ended 10 October 2023. Paid Extended Security Updates, where bought, ran to 13 October 2026.R1
IIS 8.5Web server for the app and the portalEndedPart of Windows Server 2012 R2, so it shares the same dates.R1
SQL Server 2012, with SSISOrders, stock and customers; the nightly exportEndedExtended support ended 12 July 2022, and the paid Extended Security Updates ended in July 2025.R1
PHP 5.6The customer portalEndedEnd of life 31 December 2018. No security fixes since.R2
.NET Framework 4.6.2Runtime for the order and inventory appEndingSupport ends 12 January 2027. Version 4.8.1 is supported for as long as the Windows version it runs on.R6
ASP.NET Web FormsEvery screen of the order and inventory appNo way forwardRuns only on .NET Framework. Modern .NET doesn’t include it, so screens must be rebuilt to move on.R6
Two reporting librariesPick lists and invoices as PDFUnmaintainedNo release from either in years; one has a published vulnerability.R6

Dates from the vendors’ published lifecycles: Microsoft for Windows Server, SQL Server and .NET Framework; php.net for PHP.

Changing it

How releases happen, what tests exist, and where a small change tends to break something else.

Releases
One developer copies changed files to the server over FTP, after hours. There’s no record of what went out when. Going back means finding the previous files in a folder on the same server. Readiness check: releases by hand
Tests
None automated. The operations team clicks through order entry the morning after a release. Readiness check: few or no tests
Fragile areas
Pricing rules sit in the code behind one large page, OrderEntry.aspx. Stored procedures are shared by the app and the portal, so a change for one breaks the other. The export reads columns by position. Readiness check: slow, risky changes

Access and recovery

Who can reach what, where secrets live, and whether a backup has ever been restored.

Who can reach what
Three staff and a former contractor share one Windows administrator account. Remote Desktop answers from the internet. The portal signs in to the database with full rights.
Secrets
Database passwords sit in plain text in web.config and the portal’s config file. The FTP password is in a shared spreadsheet.
Backups
The database is backed up nightly to a second disk on the same server, and copied weekly to a storage box in the office. Application files and server settings aren’t backed up. No backup has ever been restored. Readiness check: untested backups

Knowledge

What is written down, and what currently lives in one person’s head.

Written down

  • A network diagram, several years out of date
  • Setup notes for the nightly export
  • The server’s address and the FTP login

In one person’s head

  • Which customers get which price exceptions, and why
  • How to re-run the export after it fails
  • How the portal is deployed (the contractor who built it)
  • Which stored procedures the portal depends on

Readiness check: no current documentation; knowledge gone

Example · fictional

Risks, ranked

Each in plain language, with what it would cost the business if it happened. Ranked by likelihood and impact together.

IDRiskLikelihoodImpact on the businessRecommended action
R1The server and the database get no security fixes, and Remote Desktop is open to the internet.Readiness check: hosting nobody could rebuildHighSevere A known, unpatched hole is the easiest way in. A cyber-insurance renewal or a customer’s security questionnaire would flag it.Close Remote Desktop to the internet this month. Move to supported Windows Server and SQL Server in stage 1.
R2The customer portal runs on PHP 5.6 and signs in to the database with full rights.Readiness check: unsupported runtimeHighSevere A break-in through the portal would reach every customer, price and order, not only the portal’s own pages.Give the portal its own login, limited to what it shows and the orders it places. Replace the portal in stage 2.
R3Backups have never been restored, and every copy but a weekly one sits on the same server.Readiness check: untested backupsMediumSevere A failed disk or ransomware could lose up to a week of orders and stock counts, and stop shipping until the server is rebuilt from memory.Restore last night’s backup to a separate machine now. Copy backups off the server daily, and write down the restore.
R4Releases are files copied over FTP by hand, with no automated tests and no record of what changed.Readiness check: releases by hand; few or no testsHighHigh A bad release can stop order entry during business hours, with no quick way back to the version that worked.Put the code in version control, script the release with a one-step rollback, and add tests around pricing and order totals first.
R5Pricing exceptions and the SSIS recovery steps live in one person’s head.Readiness check: no current documentationMediumHigh If that person is away at month end, invoices can’t be fixed or re-sent, and price changes wait for their return.Record the pricing rules and a runbook for the nightly export, checked by someone else following them.
R6.NET Framework 4.6.2 support ends 12 January 2027, Web Forms can’t move to modern .NET as it is, and two libraries are unmaintained.Readiness check: unmaintained dependenciesCertainModerate After that date the app’s runtime gets no security fixes. Each new Web Forms screen adds to what must be rebuilt later.Retarget the app to .NET Framework 4.8.1 in stage 1, a contained change. Decide on moving off Web Forms after stage 2.
R7The nightly export to accounting fails without telling anyone.MediumModerate Missing invoices surface at month-end close, when they hold up the books and take the longest to trace.Alert on failure, and add a morning check that totals match on both sides.

Example · fictional

The staged plan

What to keep, upgrade or replace, in order of risk and value. The first stage is scoped; later stages are scoped before they start.

  1. Stage 1 · Scoped

    Make it recoverable and supported

    In scope

    • A tested restore, timed, on a separate machine; daily copies off the server R3
    • Remote Desktop closed to the internet; named accounts; secrets out of config files R1
    • A new virtual machine on supported Windows Server and SQL Server, with the export moved across and alerting added R1 R7
    • Code in version control, a scripted release with rollback, and tests around pricing and order totals R4
    • The app retargeted to .NET Framework 4.8.1 R6
    • Runbooks for the export and the restore; the pricing rules written down R5

    Not in this stage

    • Changes to how orders are entered
    • The customer portal, beyond its database login
    • Moving off Web Forms

    Done when

    • Someone other than the author has restored the system from the runbook
    • A release can be rolled back in one step
  2. Stage 2 · Scoped before it starts

    Replace the customer portal

    Rebuilt on a supported stack, reading through its own narrow interface instead of the shared stored procedures. R2

  3. Decision point

    Order entry: keep on 4.8.1, or move off Web Forms

    With tests in place, decide whether to rebuild order entry on modern .NET screen by screen, or keep it on .NET Framework 4.8.1 for now. Either way is a decision you can make between stages. R6

End of excerpt · The real report also holds the evidence behind each finding

Take the readiness check for your system How a modernization runs

Start a project

Want this for your system?

Tell us what it runs on and what worries you about it. We reply within one business day, with questions or a time to talk.

Pittsburgh, PA · Since 2015 · First step: a 30-minute call