2020-08-28 03:10:23 -04:00
|
|
|
<#
|
|
|
|
|
.SYNOPSIS
|
|
|
|
|
Opens a connection to a MSSQL server
|
|
|
|
|
.DESCRIPTION
|
|
|
|
|
This Cmdlet will open a connection to a MSSQL server
|
|
|
|
|
and returns that connection object.
|
|
|
|
|
.FUNCTIONALITY
|
|
|
|
|
Opens a connection to a MSSQL server
|
|
|
|
|
.EXAMPLE
|
|
|
|
|
PS>Open-IcingaMSSQLConnection -IntegratedSecurity -Address localhost;
|
|
|
|
|
.EXAMPLE
|
|
|
|
|
PS>Open-IcingaMSSQLConnection -Username Exampleuser -Password (ConvertTo-IcingaSecureString 'examplePassword') -Address 123.125.123.2;
|
|
|
|
|
.PARAMETER Username
|
|
|
|
|
The username for connecting to the MSSQL database
|
|
|
|
|
.PARAMETER Password
|
|
|
|
|
The password for connecting to the MSSQL database as secure string
|
|
|
|
|
.PARAMETER Address
|
|
|
|
|
The IP address or FQDN to the MSSQL server to connect to (default: localhost)
|
|
|
|
|
.PARAMETER Port
|
|
|
|
|
The port of the MSSQL server/instance to connect to with the provided credentials (default: 1433)
|
|
|
|
|
.PARAMETER SqlDatabase
|
|
|
|
|
The name of a specific database to connect to. Leave empty to connect "globaly"
|
|
|
|
|
.PARAMETER IntegratedSecurity
|
|
|
|
|
Allows this plugin to use the credentials of the current PowerShell session inherited by
|
|
|
|
|
the user the PowerShell is running with. If this is set and the user the PowerShell is
|
|
|
|
|
running with can access to the MSSQL database you will not require to provide username
|
|
|
|
|
and password
|
2020-08-28 07:14:51 -04:00
|
|
|
.PARAMETER TestConnection
|
|
|
|
|
Set this if you want to return $null on connection errors during MSSQL.open() instead of
|
|
|
|
|
exception messages.
|
2020-08-28 03:10:23 -04:00
|
|
|
.OUTPUTS
|
|
|
|
|
System.Data.SqlClient.SqlConnection
|
|
|
|
|
.LINK
|
|
|
|
|
https://github.com/Icinga/icinga-powershell-framework
|
|
|
|
|
#>
|
|
|
|
|
function Open-IcingaMSSQLConnection()
|
|
|
|
|
{
|
|
|
|
|
param (
|
|
|
|
|
[string]$Username,
|
|
|
|
|
[securestring]$Password,
|
|
|
|
|
[string]$Address = "localhost",
|
|
|
|
|
[int]$Port = 1433,
|
|
|
|
|
[string]$SqlDatabase,
|
2020-08-28 07:14:51 -04:00
|
|
|
[switch]$IntegratedSecurity = $FALSE,
|
|
|
|
|
[switch]$TestConnection = $FALSE
|
2020-08-28 03:10:23 -04:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if ($IntegratedSecurity -eq $FALSE) {
|
|
|
|
|
if ([string]::IsNullOrEmpty($Username)) {
|
|
|
|
|
Exit-IcingaThrowException `
|
|
|
|
|
-ExceptionType 'Input' `
|
|
|
|
|
-ExceptionThrown $IcingaExceptions.Inputs.MSSQLCredentialHandling `
|
|
|
|
|
-CustomMessage '-Username not set and -IntegratedSecurity is false' `
|
|
|
|
|
-Force;
|
|
|
|
|
} elseif ($null -eq $Password) {
|
|
|
|
|
Exit-IcingaThrowException `
|
|
|
|
|
-ExceptionType 'Input' `
|
|
|
|
|
-ExceptionThrown $IcingaExceptions.Inputs.MSSQLCredentialHandling `
|
|
|
|
|
-CustomMessage '-Password not set and -IntegratedSecurity is false' `
|
|
|
|
|
-Force;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$Password.MakeReadOnly();
|
|
|
|
|
$SqlCredential = New-Object System.Data.SqlClient.SqlCredential($Username, $Password);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
|
|
|
|
|
$SqlConnection.ConnectionString = "Server=$Address,$Port;";
|
|
|
|
|
|
2020-08-28 08:06:47 -04:00
|
|
|
if ([string]::IsNullOrEmpty($SqlDatabase) -eq $FALSE) {
|
2020-08-28 03:10:23 -04:00
|
|
|
$SqlConnection.ConnectionString += "Database=$SqlDatabase;";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($IntegratedSecurity -eq $TRUE) {
|
|
|
|
|
$SqlConnection.ConnectionString += "Integrated Security=True;";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$SqlConnection.Credential = $SqlCredential;
|
|
|
|
|
|
|
|
|
|
Write-IcingaDebugMessage `
|
|
|
|
|
-Message 'Open client connection for endpoint {0}' `
|
|
|
|
|
-Objects $SqlConnection;
|
|
|
|
|
|
|
|
|
|
$SqlConnection.Open();
|
|
|
|
|
} catch {
|
2020-08-28 07:14:51 -04:00
|
|
|
|
|
|
|
|
if ($TestConnection) {
|
|
|
|
|
return $null;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-15 09:34:42 -04:00
|
|
|
if ([string]::IsNullOrEmpty($Username) -eq $FALSE) {
|
|
|
|
|
Exit-IcingaThrowException `
|
|
|
|
|
-InputString $_.Exception.Message `
|
|
|
|
|
-StringPattern $Username `
|
|
|
|
|
-ExceptionType 'Input' `
|
|
|
|
|
-ExceptionThrown $IcingaExceptions.Inputs.MSSQLCredentialHandling;
|
|
|
|
|
}
|
2020-08-28 03:10:23 -04:00
|
|
|
|
|
|
|
|
Exit-IcingaThrowException `
|
|
|
|
|
-InputString $_.Exception.Message `
|
|
|
|
|
-StringPattern 'error: 40' `
|
|
|
|
|
-ExceptionType 'Connection' `
|
|
|
|
|
-ExceptionThrown $IcingaExceptions.Connection.MSSQLConnectionError;
|
|
|
|
|
|
|
|
|
|
Exit-IcingaThrowException `
|
|
|
|
|
-InputString $_.Exception.Message `
|
|
|
|
|
-StringPattern 'error: 0' `
|
|
|
|
|
-ExceptionType 'Connection' `
|
|
|
|
|
-ExceptionThrown $IcingaExceptions.Connection.MSSQLConnectionError;
|
|
|
|
|
|
|
|
|
|
Exit-IcingaThrowException `
|
|
|
|
|
-InputString $_.Exception.Message `
|
|
|
|
|
-StringPattern 'error: 25' `
|
|
|
|
|
-ExceptionType 'Connection' `
|
|
|
|
|
-ExceptionThrown $IcingaExceptions.Connection.MSSQLConnectionError;
|
|
|
|
|
# Last resort
|
|
|
|
|
Exit-IcingaThrowException `
|
|
|
|
|
-InputString $_.Exception.Message `
|
|
|
|
|
-ExceptionType 'Custom' `
|
|
|
|
|
-Force;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $SqlConnection;
|
|
|
|
|
}
|