public/Test-VPASSQLConnectionDetails.ps1

<#
.Synopsis
   CHECK SQL CONNECTION DETAILS
   CREATED BY: Vadim Melamed, EMAIL: vmelamed5@gmail.com
.DESCRIPTION
   USE THIS FUNCTION TO CHECK THE DATABASE CONNECTION DETAILS
.EXAMPLE
   $CheckSQLConnectionDetails = Test-VPASSQLConnectionDetails -SQLServer {SQLSERVER VALUE} -SQLDatabase {SQLDATABASE VALUE} -SQLUsername {SQLUSERNAME VALUE} -AAM {AAM VALUE} -AppID {APPID VALUE} -Folder {FOLDER VALUE} -SafeID {SAFEID VALUE} -ObjectName {OBJECTNAME VALUE} -AIMServer {AIMSERVER VALUE}
.EXAMPLE
   $CheckSQLConnectionDetails = Test-VPASSQLConnectionDetails
.OUTPUTS
   $true if successful
   $false if failed
#>

function Test-VPASSQLConnectionDetails{
    [OutputType([bool])]
    [CmdletBinding()]
    Param(

        [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=0)]
        [Switch]$NoSSL

    )

    Begin{

    }
    Process{

        $curUser = $env:UserName
        $ConfigFilePath = "C:\Users\$curUser\AppData\Local\VPASModuleOutputs\SQL"
        $ConfigFile = "C:\Users\$curUser\AppData\Local\VPASModuleOutputs\SQL\SQLConfigFile.txt"

        Write-Verbose "SEARCHING FILEPATHS FOR SQLConfigFile"

        #LOCATE FILE
        try{
            if(Test-Path -Path $ConfigFilePath){
                #DO NOTHING
                Write-Verbose "SQLConfigFile DIRECTORY EXISTS"
            }
            else{
                Write-Verbose "SQLConfigFile DIRECTORY DOES NOT EXIST...RERUN VSetSQLConnectionDetails"
                Write-VPASOutput -str "SQLConfigFile DIRECTORY DOES NOT EXIST...RERUN VSetSQLConnectionDetails" -type E
                return $false
            }

            if(Test-Path -Path $ConfigFile){
                #DO NOTHING
                Write-Verbose "SQLConfigFile FILE EXISTS"
            }
            else{
                Write-Verbose "SQLConfigFile FILE DOES NOT EXIST...RERUN VSetSQLConnectionDetails"
                Write-VPASOutput -str "SQLConfigFile FILE DOES NOT EXIST...RERUN VSetSQLConnectionDetails" -type E
                return $false
            }
        }catch{
            Write-VPASOutput -str "ERROR FINDING SQLConfigFile FILE OR DIRECTORY" -type E
            Write-VPASOutput -str $_ -type E
            return $false
        }

        #PARSE FILE
        try{
            Write-Verbose "READING CONTENTS OF $ConfigFile"
            $AllLines = Get-Content $ConfigFile

            write-verbose "INITIALIZING VARIABLES"
            $SQLServer = ""
            $SQLDatabase = ""
            $SQLUsername = ""
            $AAM = ""
            $AppID = ""
            $Folder = ""
            $SafeID = ""
            $ObjectName = ""
            $AIMServer = ""
            $PasswordSDKPath = ""
            $EncryptedPass = ""
            $CertificateTP = ""

            foreach($line in $AllLines){
                if($line -match "SQLServer="){
                    $SQLServer = $line -replace "SQLServer=",""
                }
                if($line -match "SQLDatabase="){
                    $SQLDatabase = $line -replace "SQLDatabase=",""
                }
                if($line -match "SQLUsername="){
                    $SQLUsername = $line -replace "SQLUsername=",""
                }
                if($line -match "AAM="){
                    $AAM = $line -replace "AAM=",""
                }
                if($line -match "AppID="){
                    $AppID = $line -replace "AppID=",""
                }
                if($line -match "Folder="){
                    $Folder = $line -replace "Folder=",""
                }
                if($line -match "SafeID="){
                    $SafeID = $line -replace "SafeID=",""
                }
                if($line -match "ObjectName="){
                    $ObjectName = $line -replace "ObjectName=",""
                }
                if($line -match "AIMServer="){
                    $AIMServer = $line -replace "AIMServer=",""
                }
                if($line -match "PasswordSDK="){
                    $PasswordSDK = $line -replace "PasswordSDK=",""
                }
                if($line -match "CERTIFICATETP="){
                    $CertificateTP = $line -replace "CERTIFICATETP=",""
                }
                if($line -match "SQLPassword="){
                    $EncryptedPass = $line -replace "SQLPassword=",""
                    $SecureString = ConvertTo-SecureString -String $EncryptedPass
                    $Pointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString)
                    $SQLPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto($Pointer)
                }
            }
        }catch{
            Write-VPASOutput -str "ERROR PARSING SQLConfigFile...RERUN VSetSQLConnectionDetails" -type E
            Write-VPASOutput -str $_ -type E
            return $false
        }

        #TESTING AAM CONNECTION
        if($AAM -eq "CCP"){
            try{
                if($NoSSL){
                    $uri = "http://$AIMServer/AIMWebService/api/accounts?AppID=$AppID&Safe=$SafeID&Folder=$Folder&Object=$ObjectName"
                    Write-Verbose "NO SSL ENABLED, USING HTTP INSTEAD OF HTTPS"
                }
                else{
                    $uri = "https://$AIMServer/AIMWebService/api/accounts?AppID=$AppID&Safe=$SafeID&Folder=$Folder&Object=$ObjectName"
                    Write-Verbose "SSL ENABLED BY DEFAULT, USING HTTPS"
                }

                if([String]::IsNullOrEmpty($CertificateTP)){
                    $CCPResult = Invoke-RestMethod -Uri $uri
                }
                else{
                    $CCPResult = Invoke-RestMethod -Uri $uri -CertificateThumbprint $CertificateTP
                }

                $Secret = $CCPResult.Content
                if($Secret){
                    Write-VPASOutput -str "CCP TEST SUCCESSFULL" -type C
                }
                else{
                    Write-VPASOutput -str "FAILED TO RETRIEVE SQL SECRET...PLEASE CONFIRM CCP FUNCTIONALITY AND RERUN VSetSQLConnectionDetails" -type E
                    return $false
                }
            }catch{
                Write-VPASOutput -str "FAILED TO RETRIEVE SQL SECRET...PLEASE CONFIRM CCP FUNCTIONALITY AND RERUN VSetSQLConnectionDetails" -type E
                Write-VPASOutput -str $_ -type E
                return $false
            }
        }
        if($AAM -eq "CP"){
            try{
                $Secret = & $PasswordSDKPath GetPassword /p AppDescs.AppID=$AppID /p Query="Safe=$SafeID;Folder=$Folder;Object=$ObjectName" /o Password
                if($Secret){
                    Write-VPASOutput -str "CP TEST SUCCESSFULL" -type C
                }
                else{
                    Write-VPASOutput -str "FAILED TO RETRIEVE SQL SECRET...PLEASE CONFIRM CP FUNCTIONALITY AND RERUN VSetSQLConnectionDetails" -type E
                    return $false
                }
            }catch{
                Write-VPASOutput -str "FAILED TO RETRIEVE SQL SECRET...PLEASE CONFIRM CP FUNCTIONALITY AND RERUN VSetSQLConnectionDetails" -type E
                Write-VPASOutput -str $_ -type E
                return $false
            }
        }
        if($AAM -eq "NONE"){
            $Secret = $SQLPassword
        }

        #TESTING SQL MODULE
        try{
            import-module sqlserver -ErrorAction Stop
        }catch{
            Write-VPASOutput -str "FAILED TO LOAD SQLServer MODULE..." -type E
            Write-VPASOutput -str $_ -type E
            Write-VPASOutput -str "FAILED TO FIND SQLServer MODULE IN THE FOLLOWING DIRECTORIES:" -type E

            $str = $env:PSModulePath -split ";"
            foreach($strsplit in $str){
                Write-VPASOutput -str $strsplit -type E
            }

            Write-VPASOutput -str "DOWNLOAD THE MODULE BY TYPING IN 'Install-Module -Name SqlServer' THEN RERUN VSetSQLConnectionDetails" -type E
            Write-VPASOutput -str "YOU CAN ALSO VIEW THIS LINK FOR MORE INFORMATION: 'https://www.powershellgallery.com/packages/SqlServer/21.1.18256'" -type E
            Write-VPASOutput -str "PROCESS TERMINATED" -type E
            return $false
        }

        #TESTING SQL CONNECTIVITY
        try{
            $output = @()
            $result = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $SQLDatabase -Query "SELECT DB_NAME()" -Username $SQLUsername -Password $Secret

            if($result.Column1 -eq $SQLDatabase){
                Write-VPASOutput -str "SQL CONNECTIVITY TEST SUCCESSFUL" -type C
            }
            else{
                Write-VPASOutput -str "FAILED TO CONNECT TO SQL DATABASE...PLEASE RERUN VSetSQLConnectionDetails" -type E
                return $false
            }
        }catch{
            Write-VPASOutput -str $_ -type E
            Write-VPASOutput -str "FAILED TO CONNECT TO SQL DATABASE...PLEASE RERUN VSetSQLConnectionDetails" -type E
            return $false
        }

        return $true
    }
    End{

    }
}