This script does not report the servers lacking a client schedule. It is really important to know this information. Without a backup, you do not have recovery! I have another method that ensures that all servers that require backup are monitored for that process and if it was successful. If you do not, I would take some time to alter the script record the servers without schedules.
If you are running this script in an environment with both 32 bit and 64 bit Windows Server versions, you need to execute it from a 64 bit version of Windows Server. If you run it from a 32 bit and query the registry of a 64 bit server, the returned registry will be the 32 bit compatibility hive. TSM Backup Client has a native 64 bit version.
param([string]$file) Function Get-TSMInfo($server, $tsmInfo) { $key = "SOFTWARE" $hKey = [Microsoft.Win32.RegistryHive]::LocalMachine $baseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($hKey, $server) foreach($rootKeyValue in ($baseKey.OpenSubKey($key)).GetSubKeyNames()) { if($rootKeyValue -eq "IBM" -and ($baseKey.OpenSubKey("$key\IBM\ADSM\CurrentVersion")).SubKeyCount -gt 2) { $tsmVersion = ($baseKey.OpenSubKey("$key\IBM\ADSM\CurrentVersion\BackupClient")).GetValue("PtfLevel") $tsmPath = ($baseKey.OpenSubKey("$key\IBM\ADSM\CurrentVersion\BackupClient")).GetValue("Path") $key = "SYSTEM\CurrentControlSet\Services" if($tsmVersion -ne "" -and $tsmPath -ne "") { foreach($keyValue in ($baseKey.OpenSubKey($key)).GetSubKeyNames()) { foreach($subKeyValue in ($baseKey.OpenSubKey("$key\$keyValue")).GetSubKeyNames()) { $clientNodeName = "" $errorLog = "" $optionsFile = "" $scheduleLog = "" if(($baseKey.OpenSubKey("$key\$keyValue").GetValue("Start")) -eq "2") { if($subKeyValue -eq "Parameters") { foreach($value in ($baseKey.OpenSubKey("$key\$keyValue\Parameters")).GetValueNames()) { if($value -eq "clientNodeName") { $clientNodeName = ($baseKey.OpenSubKey("$key\$keyValue\Parameters")).GetValue($value) } elseif($value -eq "errorLog") { $errorLog = ($baseKey.OpenSubKey("$key\$keyValue\Parameters")).GetValue($value) } elseif($value -eq "optionsFile") { $optionsFile = ($baseKey.OpenSubKey("$key\$keyValue\Parameters")).GetValue($value) } elseif($value -eq "scheduleLog") { $scheduleLog = ($baseKey.OpenSubKey("$key\$keyValue\Parameters")).GetValue($value) } } } } if($clientNodeName -ne "" -and $errorLog -ne "" -and $optionsFile -ne "" -and $scheduleLog -ne "") { $optionsFileUncPath = ("\\$server\" + ($optionsFile.SubString(0,1) + "$" + $optionsFile.SubString(2))) $tsmServer = "FAILED" $tsmClientPort = "FAILED" if(Test-Path -path $optionsFileUncPath) { foreach($line in (Get-Content -path $optionsFileUncPath)){ if($line -match "TCPSERVERADDRESS") { $tsmServer = ($line -replace "TCPSERVERADDRESS","").Trim() } if($line -match "TCPCLIENTPORT") { $tsmClientPort = ($line -replace "TCPCLIENTPORT","").Trim() } } } $clientNodeInformation = New-Object -typeName PSObject Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "server" -value $server Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "tsmVersion" -value $tsmVersion Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "installPath" -value $tsmPath Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "tsmServer" -value $tsmServer Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "tsmClientPort" -value $tsmClientPort Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "scheduleName" -value $keyValue Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "clientNodeName" -value $clientNodeName Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "optionsFile" -value $optionsFile Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "scheduleLog" -value $scheduleLog Add-Member -inputObject $clientNodeInformation -type NoteProperty -name "errorLog" -value $errorLog $tsmInfo += $clientNodeInformation } } } } } } return $tsmInfo } #--------------------------------------------------------------------------------------------------# if(![bool]$file) { Write-Host "You are missing the `"-file`" command line argument" -foregroundColor Red Write-Host "" Write-Host "This is the file that contains the list of server fully qualified" Write-Host "domain names that you want to audit their TSM Clients" Write-Host "" while((![bool]$file)) { $file = Read-Host -prompt "`tFile" } Write-Host "" } if(!(Test-Path -path $file)) { Write-Host "Unable to locate: $file" -foregroundColor Red Write-Host "" Write-Host "Please review the correct path" Write-Host "" while(!(Test-Path -path $file)) { $file = Read-Host -prompt "`tFile" } Write-Host "" } $answer = $null while($answer -ne "Y" -and $answer -ne "N") { $answer = Read-Host -prompt "Are you sure you want to use $file (Y/N)?" } if($answer -eq "N") { Write-Host "" Write-Host "Quiting..." -foregroundColor Yellow exit } $tsmInfo = @() foreach($server in (Get-Content -path $file)) { Write-Host "Auditing $server" $tsmInfo = @(Get-TSMInfo $server $tsmInfo) Write-Host ("Schedules found: " + $tsmInfo.count) } $tsmInfo | Export-Csv -path "TSM Client Audit.csv" -noTypeInformation
No comments:
Post a Comment