Good afternoon scripting experts!
I am a new DBA for SQL and one of my first projects is getting a hand on the inventory of all the servers/instances that we administer. I have a script that I run that is a hodgepodge of a few different scripts I have found here and it works great with one exception. (I am about to show my inexperience with the next part, please forgive me)
If I go into management studio and type in connect to "GLDBA03102" it connects fine I have been calling that the "Server" If I go to a server that has "Servername\Instancename" (I hope thats correct) my program is not able to connect and it just gives me the generic error message that it is unable to connect - Is there a Way I can roll through all "Instances" on a specfiic server? Currently I'm using a serverlist.txt file that just shows all server names.... The problem is some of these servers are "virtual" and contain many instances, and I dont trust another DBA will provide me with all the instances, which is why I would prefer to scan them instead of "hardcoding" them into my serverlist.txt....
I hope this makes sense, I'm sorry for the incorrect verbage.. Include are a few samples to hopefully help!
My main Script (I am sorry for not having the original authors name, I have hacked this thing a bit and did not retain it!)
#region Variables
$TextFileLocation = "C:\serverlist.txt"
$intRow = 1
$BackgroundColor = 36
$FontColor = 25
#endregion
#Region Open Excel
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $True
$Excel = $Excel.Workbooks.Add()
$Sheet = $Excel.Worksheets.Item(1)
#endregion
#Go through text file one at a time
foreach($instance in Get-Content $TextFileLocation)
{
$Sheet.Cells.Item($intRow,1) = "INSTANCE NAME:"
$Sheet.Cells.Item($intRow,2) = $instance
$Sheet.Cells.Item($intRow,1).Font.Bold = $True
$Sheet.Cells.Item($intRow,2).Font.Bold = $True
for ($column =1; $column -le 2; $column++)
{
$Sheet.Cells.Item($intRow, $column).Interior.Colorindex = 44
$Sheet.Cells.Item($intRow, $column).Font.ColorIndex = $FontColor
}
#Increase Row count by 1
$intRow++
#Create sub-headers
$Sheet.Cells.Item($intRow,1) = "Name"
$Sheet.Cells.Item($intRow,2) = "LAST FULL BACKUP"
$Sheet.Cells.Item($intRow,3) = "LAST LOG BACKUP"
#Format the column headers
for ($col = 1; $col -le 3; $col++)
{
$Sheet.Cells.Item($intRow,$col).Font.Bold = $True
$Sheet.Cells.Item($intRow,$col).Interior.ColorIndex = $BackgroundColor
$Sheet.Cells.Item($intRow,$col).Font.ColorIndex = $FontColor
}
#Finished with Headers, now move to the data
$intRow++
################################################
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
# Create an SMO connection to the instance in servers.txt
$s = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $instance
$dbs = $s.Databases
foreach ($db in $dbs)
{
if (($db.Name -ne "tempdb") -and ($db.Name -ne "model") -and ($db.Name -ne "msdb") -and ($db.Name -ne "master"))
{
if($db.LastBackupDate -eq "1/1/0001 12:00 AM")
{
$fullbackupdate = "Never Backed Up"
$fgColor = "red"
}
else
{
#$fullBackupDate= "{0:g2}" -f $db.LastBackupDate
$fullBackupDate = $db.LastBackupDate
}
$Sheet.Cells.Item($intRow, 1) = $db.Name
$Sheet.Cells.Item($intRow, 2) = $db.LastBackupDate #$fullBackupDate
if ($db.RecoveryModel.Tostring() -eq "SIMPLE")
{
$logBackupDate="Simple"
}
else
{
#See Date Above..-eq is same as =
if($db.LastLogBackupDate -eq "1/1/0001 12:00 AM")
{
$logBackupDate="Never"
}
else
{
#$logBackupDate= "{0:g2}" -f $db.LastLogBackupDate
$logBackupDate = $db.LastLogBackupDate
}
}
$Sheet.Cells.Item($intRow, 3) = $logBackupdate
$intRow ++
}
}
$intRow ++
}
$Sheet.UsedRange.EntireColumn.AutoFit()
clsin my example on the excel spreadsheet it will not list any details for "Poly1", even though there are multiple instances on that server name