Start · Sprachen · PHP · Referenz · win32_delete_service

win32_delete_service

Funktion

Löscht einen Windows-Dienst aus der SCM-Datenbank (Service Control Manager).

seit PHP 5.4.0 Kategorie: misc

Signatur

win32_delete_service(string $servicename, string $machine = null): int

Beschreibung

win32_delete_service() entfernt einen vorhandenen Diensteintrag dauerhaft aus der Windows-SCM-Datenbank (Service Control Manager). Der Dienst muss zuvor gestoppt worden sein, andernfalls schlägt die Funktion fehl. Die Funktion gehört zur PECL-Erweiterung win32service und steht ausschließlich unter Windows zur Verfügung.

Typischerweise wird diese Funktion in Installations- oder Deinstallationsskripten verwendet, die PHP-Skripte als Windows-Dienste registrieren und wieder entfernen. Der Rückgabewert entspricht einem WIN32-Fehlercode, wobei WIN32_NO_ERROR (0) Erfolg signalisiert.

Ab Version 1.0.0 der win32service-Erweiterung wirft die Funktion bei Fehlern eine Win32ServiceException statt einen Fehlercode zurückzugeben. Die Kompatibilität des eigenen Codes sollte daher je nach eingesetzter Version der Erweiterung angepasst werden.

  • Der Dienst muss gestoppt sein, bevor er gelöscht werden kann.
  • Das Skript muss mit administrativen Rechten ausgeführt werden.
  • Die Funktion ist nur unter Windows verfügbar.

Parameter

Name Typ Default Beschreibung
$servicename Pflicht string Der interne Name des Windows-Dienstes, wie er in der SCM-Datenbank registriert ist (nicht der Anzeigename).
$machine string null Der Name des entfernten Rechners, auf dem der Dienst gelöscht werden soll. Wird null oder ein leerer String übergeben, wird der lokale Rechner verwendet.

Rückgabewert

Typ
int
Beschreibung
Gibt einen WIN32-Fehlercode zurück. WIN32_NO_ERROR (0) signalisiert Erfolg. Ab Erweiterungsversion 1.0.0 wird stattdessen eine Win32ServiceException geworfen, wenn ein Fehler auftritt.

Beispiele

Dienst stoppen und anschließend löschen

<?php
// Sicherstellen, dass die win32service-Erweiterung geladen ist
if (!extension_loaded('win32service')) {
    die('win32service-Erweiterung nicht verfügbar.');
}

$serviceName = 'MeinPHPDienst';

// Dienst zuerst stoppen
$stopResult = win32_stop_service($serviceName);
if ($stopResult !== WIN32_NO_ERROR) {
    echo "Fehler beim Stoppen des Dienstes: " . $stopResult . PHP_EOL;
    exit(1);
}

// Kurz warten, bis der Dienst vollständig gestoppt ist
sleep(3);

// Dienst aus der SCM-Datenbank löschen
$deleteResult = win32_delete_service($serviceName);

if ($deleteResult === WIN32_NO_ERROR) {
    echo "Dienst '" . $serviceName . "' wurde erfolgreich gelöscht." . PHP_EOL;
} else {
    echo "Fehler beim Löschen des Dienstes. Fehlercode: " . $deleteResult . PHP_EOL;
}
Dienst 'MeinPHPDienst' wurde erfolgreich gelöscht.

Löschen mit Exception-Handling (ab win32service 1.0.0)

<?php
$serviceName = 'MeinPHPDienst';

try {
    // Dienst stoppen
    win32_stop_service($serviceName);
    sleep(3);

    // Dienst löschen
    win32_delete_service($serviceName);
    echo "Dienst erfolgreich gelöscht." . PHP_EOL;
} catch (Win32ServiceException $e) {
    echo "Fehler: " . $e->getMessage() . " (Code: " . $e->getCode() . ")" . PHP_EOL;
}
Dienst erfolgreich gelöscht.

// Wichtig · Fallstricke

Administratorrechte erforderlich: Das ausführende PHP-Skript muss mit Administrator-Privilegien gestartet werden, da der Zugriff auf den SCM entsprechende Berechtigungen erfordert. Andernfalls schlägt die Funktion mit einem Zugriffsfehler (ERROR_ACCESS_DENIED) fehl.

Dienst muss gestoppt sein: Ein noch laufender Dienst kann nicht gelöscht werden. Es ist notwendig, den Dienst zuerst mit win32_stop_service() zu stoppen und auf den vollständigen Stopp zu warten, bevor win32_delete_service() aufgerufen wird.

Nur Windows: Diese Funktion ist ausschließlich auf Windows-Systemen verfügbar und erfordert die PECL-Erweiterung win32service. Der Aufruf unter anderen Betriebssystemen führt zu einem fatalen Fehler.

Versionsunterschiede: Ab Version 1.0.0 der win32service-Erweiterung werden Fehler als Win32ServiceException geworfen statt als Fehlercode zurückgegeben. Skripte sollten entsprechend angepasst werden.