I would go with Sitecore PowerShell Extensions. It supports your version as well.
My idea is to run query and process all items you want to check.
In the past I used something like this to compare revisions between master and web database:
function RevisionsMatch($itemToCheck){
if($(Test-Path "web:$($itemToCheck.Paths.Path)")){
$webItem = Get-Item "web:$($itemToCheck.Paths.Path)" -lang $itemToCheck.Language
if($webItem -ne $null)
{
if($webItem.Fields["__Revision"].Value -eq $itemToCheck.Fields["__Revision"].Value){
$true
}
}
}
$false
}
How to use it
$items = Get-ChildItem -Path "/sitecore/content/Playground" |
Where-Object { (RevisionsMatch $_) -eq $false }
As a output you get filtered items that have different revision number in master and web database
If you want to create a fancy report, here some blog post about creating one:
http://blog.najmanowicz.com/2014/10/25/creating-beautiful-sitecore-reports-easily-with-powershell-extensions/
If you are not able to install any additional module on your instance, you can always output report on some aspx page using the same strategy with comparing revisions.
EDIT:
If you want to exclude items with publishing restriction from your results you could write filtering function (it takes an item as input and returns it without any modification if condition are meet, otherwise nothing will be returned)
function ValidatePublishingRestrictions($itemToCheck){
if($itemToCheck.'__Never publish' -eq 1){
Write-Host "Skipping item [$($itemToCheck.ID)] because of publishing restrictions"
}else{
$itemToCheck
}
}
And do something like this:
$items = Get-ChildItem -Path "/sitecore/content/Playground" |
Where-Object { (RevisionsMatch $_) -eq $false } |
ForEach-Object { ValidatePublishingRestrictions $_ }
That way you will get only items that can be published.
Notice, I added logging there so you can read which items were excluded:
Skipping item [{F0A490C2-9DF8-47F6-8E94-85713FCAA4CA}] because of publishing restrictions