MEDISTAR und das Ende des Supports für Windows XP

Wenn auf einem Rechner XP läuft, wird wahrscheinlich auch Windows 7 auf ihm laufen. Außerdem besteht nicht unbedingt die Notwendigkeit in der Praxis Windows XP aufzugeben – trotz des Auslaufens des Microsoft-Supports (April 2014). Wenn die Rechner nicht ans Internet angeschlossen sind und auch sonst niemand irgendetwas neu installiert, werden ja Sicherheits-Updates nicht unbedingt benötigt.
Ganz anders sieht die Sache bei einer Software-Firma wie MEDISTAR aus. Dort können aus hygienischen Gründen keine veralteten Rechner toleriert werden – damit würde man die Kunden gefährden. Logischerweise kann die Firma dann aber auch keine Garantie mehr dafür abgeben, dass ihr Softwareprodukt auf Windows XP läuft, denn sie kann es selbst nicht mehr testen.
Als Anwender braucht man aber keine Angst zu haben, dass das Praxisprogramm in naher Zukunft nicht mehr unter XP laufen würde. Das eigentliche Problem ist nämlich absolut gegensätzlich. Der MEDISTAR-Unterbau, das QT-Framework in der Version 3 hat schon längst das Greisenalter erreicht. Daher besteht vielmehr die Gefahr, dass die Software irgendwann nicht mehr mit neueren Betriebssystemen zusammen arbeitet. Natürlich wird MEDISTAR irgendwann auf QT 4 upgraden. Die aktuelle Version ist aber 5.1. Ein direktes Upgrade auf Version 5 ist aber aus technischen Gründen nicht möglich. Und selbst QT 5 verträgt sich meines Wissens mit XP.
Kurzum: man kann sich entspannt zurück lehnen. MEDISTAR wird noch in etlichen Jahren unter XP laufen. Aber: Garantien dafür gibt es nicht – siehe oben. Wer bereit ist das Risiko einzugehen, macht aus meiner Sicht für die nächsten zwei bis drei Jahre keinen Fehler.
PS: Wenn dann doch ein Upgrade ansteht, sollte man wegen des Support-Zeitraumes das neueste Windows-Betriebssystem wählen. Im Moment ist das nicht Windows 7, sondern Windows 8.1. Aber da geht es schon wieder los: MEDISTAR übernimmt im Moment keine Garantie dafür, dass die Praxissoftware unter 8.1 läuft, weil sie es noch nicht ausreichend getestet haben. Gibt es ja auch erst einer Woche. Also Mut zum Risiko!

MEDISTAR-SQL-Backup mit PowerShell erstellen

Der in der MEDISTAR-SQL-Version vorhandene Backup-Dienst automatisiert die Datensicherung, indem er einmal am Tag zu einer bestimmten Uhrzeit Kopien der ISAM-Datenbanken und einen Dump der Oracle-Datenbank erstellt. Die Dateien landen im Unterordner «Sicherung» des MEDISTAR-Verzeichnisses. Wenn man zusätzlich zu anderen Zeiten sichern möchte, kann dies mit folgendem PowerShell-Skript geschehen. Die Befehle für das Erstellen des Dumps der Oracle-Datenbank sind übrigens dem Log-Protokoll des Backup-Dienstes entnommen.

MSBackup.ps1
################################################################################
# Zweck: Exportiert ISAM-Datenbanken und erzeut einen Dump der Oracle-Datenbank.
#        Das Skript imitiert den MEDISTAR-Backup-Dienst. Es bietet als zusätz-
#        liches Feature die Möglichkeit, für jeden Wochentag einen anderen
#        Sicherungsort anzugeben (siehe Variable '$Location').
#        Außerdem können neben den ISAM-Datenbanken auch andere Dateien aus den
#        gleichen Ordnern gesichert werden (siehe Variable '$ExtTypes').
# Autor: Wilhelm Happe, © 2012
################################################################################
 
$PassWord = "XXXXXXXX"
$DumpFile = "ORACLE_EXP.DMP"
$IsamDirs = "HDATEN","INST","MED","PARA","PDATEN","PRAXIS","STAT"
$ExtTypes = "*.isd","*.isk","*.ism","PLPARA.*","oph*.mac"
$Isam_Log = "$Location\ISAM_EXP.log"
$MediStar = "${env:MEDISTARDIR}"
$Location = [string]::Concat($MediStar, "\Sicherung")
#$Location = [string]::Concat("D:\MSBackup", "_", (Get-Date).DayOfWeek)
 
$ErrorActionPreference = "SilentlyContinue"; $Index = 0
$Host.UI.RawUI.WindowTitle = "MEDISTAR-SQL-Export"
 
Function New-Folder {param([string]$Path)
  New-Item -itemtype directory -path "$Path" -force | out-null
  If ($?) {"$Path wurde erstellt."}
  Else {Write-Warning "$Path konnte nicht erstellt werden."; Sleep 3; Exit}}
 
If (Get-Process 'm42t' -ea 0) {
  Write-Warning "Sie müssen alle MEDISTAR-Tasks beenden."; Sleep 3; Exit}
 
Write-Host `nVorhandene Sicherungsdaten werden gelöscht: -fore blue -back white
Remove-Item -Path $Location\$DumpFile -force -ErrorAction 0
ForEach ($Item in $IsamDirs) {Remove-Item -Path $Location\$Item -recurse}
New-Folder -Path $Location
ForEach ($Item in $IsamDirs) {New-Folder -Path $Location\$Item}
 
Set-Content $Isam_Log -value ("Zeit: " + (Get-Date -format D) + ", " + `
  (Get-Date -format T) + "`nUser: " + $env:computername + "\" + `
  $env:username + "`n" + "¯" * 42)
 
# Der nachfolgende Block kopiert keine Dateien aus Unterordnern (s. unten)
If ($IsamDirs.Length -gt 0) {ForEach ($Folder in $IsamDirs) {
  Write-Host `nOrdner mit ISAM-Dateien werden kopiert: -fore blue -back white
  ForEach ($File in GCI "$MediStar\$Folder" -include $ExtTypes -recurse) {
    $FilePath = $MediStar -replace "\\","\\" -replace "\:","\:"
    $Destination = $File -replace $FilePath,$Location
    Copy-Item -path $File -dest $Destination -force -ea 0
    If ($?) {$Index ++; "$Destination"; AC $Isam_Log -value $Destination}
    Else {Write-Warning "$File wurde nicht kopiert"}}}}
Else {Write-Warning "`$IsamDirs enthält keine Elemente."; Sleep 3; Exit}
 
AC $Isam_Log ("_" * 42 + "`nAnzahl kopierter Dateien: " + $Index + "`nZeit: " `
  + (Get-Date -format D) + ", " + (Get-Date -format T))
 
Write-Host `nEs wird ein Export der Datenbank erstellt: -fore blue -back white
$SqlFile = "${env:temp}\Temp.sql"
@"
CREATE or REPLACE DIRECTORY exp_dir AS '$Location';
exit;
"@ | Set-Content $SqlFile  # Standard-Exportpfad neu setzten
sqlplus sys/$PassWord as sysdba '@'$SqlFile
expdp system/$PassWord directory=exp_dir dumpfile=$DumpFile `
  logfile=ORACLE_EXP.log schemas=MSUSER
@"
CREATE or REPLACE DIRECTORY exp_dir AS '$MediStar\Sicherung';
exit;
"@ | Set-Content $SqlFile  # Standard-Exportpfad zurücksetzten
sqlplus sys/$PassWord as sysdba '@'$SqlFile
Remove-Item -Path $SqlFile

Wenn der Wunsch besteht, Patientenbilder mitzusichern hilft der folgende Skriptblock. Enhalten ist die Anweisung, nur Bilder aus den letzten 90 Tagen zu kopieren.

# Der nachfolgende Block ermöglicht das Kopieren von Dateien aus Unterordnern.
# Z.B. werden Patientenbilider aus dem Unterordner PBILDER von PDATEN kopiert.
Write-Host `nEs werden zusätzliche Dateien kopiert: -fore blue -back white
$CopyFrom = @(
  "$MediStar\PDATEN\PBILDER\*.jpg"
	)
ForEach ($Item in $CopyFrom) {
  $Target = Split-Path $Item  # hinten trimmen (z.B.: '\_*.*')
  $Target = $Target.Replace("$MediStar\", "") # vorne trimmen
	If (!(Test-Path "$Location\$Target" -PathType Container))
		{New-Item "$Location\$Target" -Type Directory}
  Foreach ($i in Get-ChildItem $Item) {
    if ($i.LastWriteTime.Date -gt $(Get-Date).AddDays(-90))
      {
      Copy-Item $i.FullName $Location\$Target -ErrorVariable "Err"
	    If ($Err) {"Fehler beim Kopieren von $i.FullName"; Start-Sleep -s 5})
  }
}