Public/Install-sqmJdbcDriver.ps1
|
<# .SYNOPSIS Installiert den Microsoft JDBC Driver for SQL Server. .DESCRIPTION Prueft ob der JDBC-Treiber bereits vorhanden ist (via Test-sqmDriverInstalled). Bei Bedarf: Kopiert die .jar-Datei aus dem SourcePath in den Zielpfad und setzt optional die CLASSPATH-Umgebungsvariable. Unterstuetzte Installer-Formate: - .jar : Direkte Kopie - .exe : Microsoft-Installer, wird still ausgefuehrt (/quiet /passive) - .zip : Extraktion, dann .jar kopieren .PARAMETER SourcePath Quellpfad wo der JDBC-Installer oder die .jar liegt. Z.B.: \\srv\Treiber\JDBC oder C:\Downloads\sqljdbc_12.4 .PARAMETER DestinationPath Zielpfad fuer die .jar-Datei. Standard: C:\Program Files\Microsoft JDBC Driver for SQL Server\ .PARAMETER UpdateClassPath Wenn $true: CLASSPATH-Systemumgebungsvariable wird um den Zielpfad erweitert. Standard: $false .OUTPUTS [PSCustomObject] mit: Status : AlreadyInstalled | Installed | Error Version : Erkannte Treiberversion Path : Installationspfad Message : Detailmeldung .EXAMPLE Install-sqmJdbcDriver -SourcePath '\\srv\Treiber\JDBC' .EXAMPLE Install-sqmJdbcDriver -SourcePath 'C:\Downloads\jdbc' -UpdateClassPath $true .NOTES Voraussetzungen: Lokale Administratorrechte. Download: https://learn.microsoft.com/de-de/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server #> function Install-sqmJdbcDriver { [CmdletBinding()] [OutputType([PSCustomObject])] param ( [Parameter(Mandatory = $true, Position = 0)] [string]$SourcePath, [Parameter(Mandatory = $false)] [string]$DestinationPath = 'C:\Program Files\Microsoft JDBC Driver for SQL Server', [Parameter(Mandatory = $false)] [bool]$UpdateClassPath = $false ) $functionName = $MyInvocation.MyCommand.Name $result = [PSCustomObject]@{ Status = 'Error' Version = $null Path = $null Message = $null } function _Log { param([string]$Msg, [string]$Level = 'INFO') Write-Verbose "[$functionName] $Msg" try { Invoke-sqmLogging -Message $Msg -FunctionName $functionName -Level $Level } catch { } } try { # --- Bereits installiert? --- $check = Test-sqmDriverInstalled -DriverType JDBC if ($check.Installed) { $result.Status = 'AlreadyInstalled' $result.Version = $check.Version $result.Path = $check.Path $result.Message = "JDBC-Treiber bereits vorhanden: '$($check.DriverName)'" + $(if ($check.Version) { " v$($check.Version)" } else { '' }) _Log $result.Message 'INFO' Write-Host " OK: $($result.Message)" -ForegroundColor Green return $result } # --- Quellpfad pruefen --- if (-not (Test-Path $SourcePath)) { $result.Message = "Quellpfad nicht erreichbar: $SourcePath" _Log $result.Message 'ERROR' Write-Error $result.Message return $result } _Log "Suche JDBC-Installer in: $SourcePath" # .jar direkt oder in Unterordnern suchen $jarFile = Get-ChildItem -Path $SourcePath -Filter 'mssql-jdbc*.jar' -Recurse ` -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1 $exeFile = Get-ChildItem -Path $SourcePath -Filter 'sqljdbc*.exe' ` -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1 if ($exeFile) { # Microsoft Self-Extractor ausfuehren _Log "Fuehre JDBC-Installer aus: $($exeFile.FullName)" $proc = Start-Process -FilePath $exeFile.FullName -ArgumentList '/quiet', '/passive' ` -Wait -PassThru -ErrorAction Stop if ($proc.ExitCode -ne 0) { $result.Message = "JDBC-Installer fehlgeschlagen (ExitCode $($proc.ExitCode)): $($exeFile.FullName)" _Log $result.Message 'ERROR' Write-Error $result.Message return $result } _Log "Installer abgeschlossen (ExitCode 0)." # Ergebnis erneut pruefen $check2 = Test-sqmDriverInstalled -DriverType JDBC $result.Status = 'Installed' $result.Version = $check2.Version $result.Path = $check2.Path $result.Message = "JDBC-Treiber installiert via Installer." + $(if ($check2.Version) { " v$($check2.Version)" } else { '' }) } elseif ($jarFile) { # .jar direkt kopieren if (-not (Test-Path $DestinationPath)) { New-Item -ItemType Directory -Path $DestinationPath -Force -ErrorAction Stop | Out-Null _Log "Zielverzeichnis erstellt: $DestinationPath" } $destJar = Join-Path $DestinationPath $jarFile.Name Copy-Item -Path $jarFile.FullName -Destination $destJar -Force -ErrorAction Stop _Log "JAR kopiert: $destJar" # Version aus Dateiname $version = $null if ($jarFile.Name -match 'mssql-jdbc-(\d+\.\d+\.\d+)') { $version = $Matches[1] } $result.Status = 'Installed' $result.Version = $version $result.Path = $destJar $result.Message = "JDBC-Treiber installiert: '$($jarFile.Name)'" + $(if ($version) { " v$version" } else { '' }) + " -> $destJar" # CLASSPATH setzen wenn gewuenscht if ($UpdateClassPath) { $current = [System.Environment]::GetEnvironmentVariable('CLASSPATH', 'Machine') if ($current -notlike "*$DestinationPath*") { $new = if ($current) { "$current;$DestinationPath" } else { $DestinationPath } [System.Environment]::SetEnvironmentVariable('CLASSPATH', $new, 'Machine') _Log "CLASSPATH um '$DestinationPath' erweitert." $result.Message += " | CLASSPATH aktualisiert." } } } else { $result.Message = "Kein JDBC-Installer (.exe) oder .jar-Datei in '$SourcePath' gefunden." _Log $result.Message 'ERROR' Write-Error $result.Message return $result } _Log $result.Message 'INFO' Write-Host " OK: $($result.Message)" -ForegroundColor Green } catch { $result.Status = 'Error' $result.Message = "JDBC-Installation fehlgeschlagen: $($_.Exception.Message)" _Log $result.Message 'ERROR' Write-Error $result.Message } return $result } |