Allot of our connection string information is stored in our web.config files. For a project I am working on I was asked to create a list of all of these. This will help us determine what third parties we interface with so a new firewall can be setup accurately. Below is the PowerShell script I came up with the help of others posts on the web. I haven't gotten the syntax highlighter working yet on my blog but hopefully soon (I will come back and edit this post).
###########################################################
# AUTHOR : Mark Rainey
# DATE : 2013-03-13
# COMMENT : Reads in a list of servers and searches
# the E:\Live folder for config files. When it finds
# them it searches for anything starting with 3 or more
# letters (tcp or http) followed by a colon and \\
###########################################################
#ERROR REPORTING ALL
Set-StrictMode -Version latest
$scriptpath = Split-Path -parent $MyInvocation.MyCommand.Definition
# A friend at work helped me get this to output to Excel
$outputFile = $scriptpath + "\output.xls"
# This is a file with a FQDN of each server on a new line
$serverList = $scriptpath + "\serverlist.txt"
# Load server list
$servers = Get-Content $serverList
# Hash of all results from all files
$Results=@{}
# Find the string and save it to a file
Function getStringMatch
{
Try {
# Loop through all servers
Foreach ($server In $servers) {
# Set UNC Path to files for this server
#The path can be anywhere on your servers you want to search
$path = "\\$server\c$\temp\test\"
#Get list of files
$files = Get-Childitem $path *.config -Recurse | Where-Object { !($_.psiscontainer) }
# Loop through the server and search all config files under E:\Live
$matches = New-Object System.Collections.ArrayList
$matches.clear()
Foreach ($file In $files)
{
$fullFileName = $file.FullName
# regular expression for a URL format
$regex = '([a-zA-Z]{3,})://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)*?'
# Find all matches in current file and add the Value for each one to an array
select-string -Path $fullFileName -Pattern $regex -AllMatches | % { $_.Matches } | % {
$matches.add($_.Value)
}
}
# Remove duplicates
$matches = $matches | select -Unique
# Add the array for this server to the Results hash
$Results.Add($server,$matches)
}
#export to Excel workbook
$excel = New-Object -comobject Excel.Application
$excel.Visible = $True
$workbook = $excel.Workbooks.Add()
$ws = $workbook.Worksheets.Item(1)
$column = 1
foreach ($Result in $Results.GetEnumerator()){
$row = 1
$ws.Cells.Item($row,$column) = $Result.Key;
$row++
if ($Result.Value -ne $null){
if ($Result.Value.Count -gt 1){
for ($i=0; $i -le $Result.Value.Count; $i++ ) {
$ws.Cells.Item($row,$column) = $Result.Value[$i]
$row++
}
}
else {
$ws.Cells.Item($row,$column) = $Result.Value
}
}
$column++
}
$workbook.SaveAs($outputFile)
Release-Ref $ws
Release-Ref $workbook
$excel.Quit()
Release-Ref $excel
}
Catch [System.Management.Automation.ActionPreferenceStopException]{
Write-host "$output is locked see error:`n $_"
}
Catch {
Write-host "Something failed $_"
}
Finally {
"Finished"
}
}
# Release Reference used in Office coms
Function Release-Ref ($ref) {
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($ref)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
getStringMatch
No comments:
Post a Comment