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
.PARAMETER NoSSL
   If the environment is not set up for SSL, API calls will be made via HTTP not HTTPS (Not Recommended!)
.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{

    }
}