Starthilfe für Postgres

Inhaltsverzeichnis


Das Starten und Stoppen eines PostgresSQL Server unter Windows wird durch einen entsprechenden Diensteintrag im Service Manager von Window gesteuert. Der entsprechende Eintrag sorgt für den automatischen Start der Postgres Servers bei jedem Start der Maschine.

Einige Anwender haben den Shurtcut auf das services.msc vermutlich schon auf dem Desktop liegen. Andere, die mit dem Service Management von Windows nicht so vertraut sind und aus Respekt lieber Abstand halten möchten, würden vielleicht einen anderen Weg bevorzugen.

Für Gelegenheitsanwender, die an und ab eine Datenbank benötigen, um zum Beispiel Daten aus der Webseite des OpenGeodata.NRW zu untersuchen oder weiterzuverarbeiten, die in Libreoffice Calc oder Excel mit ihrer Beschränkung auf rund eine Millionen Zeilen nicht geladen werden können, bietet sich eine Installation eines Datenbank Systems an. Dieses läuft aber, wie zuvor erwähnt, in der Standard Installation automatisch nach dem Start. Häufig wird der Server aber nicht permanent benötigt. Daher, und zum Zweck der Schonung der Ressourcen, wäre ein manueller Start des Datenbank Servers per Script, dass mit einem Doppelklick auf eine entsprechende Verknüpfung auf dem Desktop ausgeführt werden kann, vorteilhaft.

Das Powershell Script

Nachfolgend stelle ich ein Powershell Script vor, dass per UAC sich selber Administrationsrechte gibt und dann mittels einer kleinen Messagebox den aktuellen Status des Postgres Server anzeigt und es ermöglicht ihn zu starten oder zu beenden.

Das Script sollte am besten an einem geeigneten Ort unterhalb des
.\Documents\WindowsPowerShell Ordners gespeichert werden.

Das Script verwendet dazu Code, den ein Microsoft Entwickler in einem Blogbeitrag zur Verfügung gestellt hat, um sich selber höhere Rechte zu verschaffen und somit die Windows User Account Control, UAC auszulösen. Man sollte dabei allerdings berücksichtigen, dass auf diesem Weg auch Schadcode mit erweiterten Rechten zur Ausführung gebracht werden kann.

PowerShell
# Source for self-elevation for using UAC:
# https://learn.microsoft.com/en-us/archive/blogs/virtual_pc_guy/a-self-elevating-powershell-script
#
# Get the ID and security principal of the current user account
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal = new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
 
# Get the security principal for the Administrator role
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator

# Check to see if we are currently running "as Administrator"
if ($myWindowsPrincipal.IsInRole($adminRole))
    {
    # We are running "as Administrator" - so change the title and background color to indicate this
    $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
    $Host.UI.RawUI.BackgroundColor = "DarkBlue"
    clear-host
    }
else
    {
    # We are not running "as Administrator" - so relaunch as administrator

    # Create a new process object that starts PowerShell
    $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";

    # Specify the current script path and name as a parameter
    $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'";

    # Indicate that the process should be elevated
    $newProcess.Verb = "runas";

    # Start the new process
    [System.Diagnostics.Process]::Start($newProcess);

    # Exit from the current, unelevated, process
    exit
   }
 
# Run your code that needs to be elevated here

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#[System.Windows.Forms.Application]::EnableVisualStyles()

$pg_service = Get-Service -Name *postgres*

#Check the startup type and ask to set it to manual
if ($pg_service.starttype -eq "Automatic") {
    $retval = [System.Windows.Forms.MessageBox]::Show($pg_service.Name + "`r`n`Startup type : " + $pg_service.Starttype + "`r`n`nSet Startup Type of PostgreSQL Service to 'Manual'?", "PostgreSQL Service", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Question)
    if ($retval -eq "Yes") {
        Set-Service -InputObject $pg_service.Name -StartupType Manual
    }
    else {
        [System.Windows.Forms.MessageBox]::Show($pg_service.Name + "`r`n`Startup type : " + $pg_service.Starttype + "`r`n`nStartup Type of PostgreSQL Service left to 'Automatic'?", "PostgreSQL Service", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Question)
    }
}

#Start service
if ($pg_service.Status -eq "Stopped") {
    $retval = [System.Windows.Forms.MessageBox]::Show($pg_service.Name + " : " + $pg_service.Status + "`r`n`nStart PostgreSQL Service?", "PostgreSQL Service", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Question)
    if ($retval -eq "Yes") {
        Start-Service -InputObject $pg_service.Name

        do {
        $pg_service = Get-Service -Name *postgres*
        }
        until($pg_service.Status -eq "Running")

        [System.Windows.Forms.MessageBox]::Show($pg_service.Name + " : " + $pg_service.Status, "PostgreSQL Service", [System.Windows.Forms.MessageBoxButtons]::Ok)
    }
}

#Stop service
elseif ($pg_service.Status -eq "Running") {
    $retval = [System.Windows.Forms.MessageBox]::Show($pg_service.Name + " : " + $pg_service.Status + "`r`n`nStop PostgreSQL Service?", "PostgreSQL Service", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Question)
    if ($retval -eq "Yes") {
        Stop-Service -InputObject $pg_service.Name

        do {
        $pg_service = Get-Service -Name *postgres*
        }
        while($pg_service.Status -eq "Running")

        [System.Windows.Forms.MessageBox]::Show($pg_service.Name + " : " + $pg_service.Status, "PostgreSQL Service", [System.Windows.Forms.MessageBoxButtons]::Ok)
    }
}
Expand

Shortcut

Nun wird der Shortcut auf dem Desktop benötigt. Rechtsklicken sie dazu auf den Desktop und wählen aus dem Kontextmenü:
Neu -> Verknüpfung aus.

Unter Windows 11 wird ein Fenster präsentiert, in dem nach dem Speicherort des Elements, in diese Fall das Script gefragt wird. Dort bitte mit Hilfe des Durchsuchen Schaltfläche zu dem Speicherort des Script navigieren und das Script auswählen und auf Weiter klicken. Jetzt noch dem Shortcut einen Namen geben und auf Fertig stellen klicken.

Danach mit einem Rechtsklick auf den Shortcut und Eigenschaften auswählen. Das Icon auf dem Desktop und das geöffnete Eingenschaftsfenster sollte so aussehen.

Damit die Powershell das Script ausführt, muss Wert in der Textzeile für „Ziel“ mit dem nachfolgenden Inhalt ersetzt werden.

Aktuell sollte der Eintrag so ausehen:

"C:\Users\YOUR_USER\Documents\WindowsPowerShell\scripts\Start PostgreSQL Server.ps1"

Daraus muss folgender Eintrag werden:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\Users\YOUR_USER\Documents\WindowsPowerShell\scripts\Start PostgreSQL Server.ps1'"

Bitte dabei unbedingt die Änderung des Position der doppelten Anführungszeichen und den neu hinzugefügten einzelnen Anführungszeichen beachten. Die doppelten Anführungszeichen umschliessen den Übergabeparameter an die Powershell, hier den Pfad zu dem Script – der in einzelne Anführungszeichen eingschlossen ist. Zusätzlich wird noch ein Kaufmännisches UND (&) vorweggestellt, damit die Powershell mit Leerzeichen im Pfad zurechtkommt. Danach das Eigenschaftsfenster mit OK schliessen. Das Icon auf dem Desktop sollte jetzt das Powershell Symbol tragen.

Damit alles funktioniert, bitte noch den Pfadbestandteil YOUR_USER durch Ihren Benutzernamen ersetzen und ggf. einen vorhandenen Unterordner für Skripte anpassen oder der Pfadbestandteil entfernen.

Wenn der Benutzername korrigert wurde und alle Eingaben und Korrekturen richtig ausgeführt wurden, dann sollte nach einem Doppelklick auf die Verknüpfung die Windows User Access Control nach erweiterten Ausführungsrechten fragen und im Anschluss ein Terminal Fenster mit blauen Hintergrund und die Message Box mit so wie auf dem Screenshot unter zu sehen sein.

Windows Terminal Fenster mit blauem Hintergrund um anzuzeigen, dass es sich um eine eleviertes Fenster handelt und der Message Box, die den Status des Postgres Server anzeigt.

Ein Klick auf die Schflöche Ja würde Message Box schliesen und den PostgreSQL Server starten, bei einem Klick auf Nein ändert sich nichts. Das ganze entsprechend vice versa, wenn der Server schon gestartet ist.