J'essaie de supprimer un service Windows avec sc delete <service name>
et rencontre l'erreur suivante:
[SC] DeleteService FAILED 1072:
Le service spécifié a été marqué pour suppression.
Ce que j'ai déjà fait:
Arrêté le service, évidemment. Le sc queryex "<service name>"
donne le résultat suivant:
SERVICE_NAME: Stub service
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1067 (0x42b)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 0
FLAGS :
Assurez-vous que Microsoft Management Console est fermé (taskkill /F /IM mmc.exe
),
En raison de cette suppression, services.msc
affiche toujours le service (avec un nom, mais aucun statut ni type de démarrage), mais la description est «<Échec de la lecture de la description. Code d'erreur: 2> ”. Lors de la tentative d'affichage des propriétés, «Le système ne peut pas trouver le fichier spécifié.» S'affiche cinq fois.
Le problème persiste.
Quelle est la prochaine étape?
Plusieurs causes peuvent conduire au blocage du service dans la mention «marqué pour suppression».
L'explorateur de processus de SysInternals est ouvert . Sa fermeture devrait entraîner la suppression automatique du service.
Microsoft Management Console (MMC) est ouvert . Pour vous assurer que toutes les instances sont fermées, exécutez taskkill /F /IM mmc.exe
.
La console de services est ouverte . Ceci est identique au point précédent, car la console Services est hébergée par MMC.
L'observateur d'événements est ouvert . Encore une fois, ceci est identique au troisième point.
La clé HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{nom du service} existe .
Quelqu'un d'autre est connecté au serveur et l'une des applications précédemment mentionnées est ouverte.
Une instance de Visual Studio utilisée pour déboguer le service est ouverte.
Cela peut également être causé en laissant la console Services ouverte. Windows ne supprimera pas le service tant qu'il ne sera pas fermé.
Dans mon cas, cela a fonctionné après la fermeture de la Services
. Vérifiez si le Services.msc
est ouvert, si oui, fermez-le et vérifiez si un processus de service est trouvé dans Task Manager
.
Salut les gars, j'ai eu le même problème, finalement je décide de tuer le processus de service.
pour cela, essayez les étapes ci-dessous:
obtenir l'identifiant du processus de service avec
sc queryex <service name>
tuer le processus avec
taskkill /F /PID <Service PID>
La suppression des clés de registre, comme suggéré ci-dessus, a bloqué mon service dans l'état d'arrêt. La procédure suivante a fonctionné pour moi:
ouvrez le gestionnaire de tâches> sélectionnez l'onglet Services> sélectionnez le service> cliquez avec le bouton droit de la souris et sélectionnez "Accéder au processus"> cliquez avec le bouton droit sur le processus et sélectionnez Arrêter le processus
Le service devrait être parti après cela
Cela signifie que le service est toujours répertorié comme désactivé dans services.msc . Fermez simplement le service.msc et ouvrez-le à nouveau en tant qu'administrateur .... Le service ne sera pas répertorié. Maintenant, installez le service en utilisant la commande,
installutil "chemin du service"
Voici ce qui a fonctionné pour moi: Mon service s’affiche comme étant en cours d’exécution, bien qu’il ait déjà été désinstallé. Réception d'un message d'erreur indiquant que le service n'est pas en état de recevoir des messages de contrôle . Néanmoins, le service a été arrêté .- Services.msc .- fermés. Services.msc . - Le service avait disparu (ne figurait plus dans la liste des services).
(L'environnement était Windows 7.)
Il semble que sur les versions de Windows ultérieures à Windows 7 (non vérifiées, mais plus récentes de Windows Server 2012 R2), le gestionnaire de contrôle de service (SCM) est plus strict.
Tandis que sur Windows 7, il crée simplement un autre processus, il vérifie maintenant si le processus de service est toujours actif et peut renvoyer ERROR_SERVICE_MARKED_FOR_DELETE (1072) pour tout appel ultérieur à CreateService/DeleteService, même si le service semble être arrêté.
Je parle de code API Windows ici, mais je veux décrire clairement ce qui se passe, donc cette séquence peut conduire à l'erreur mentionnée:
SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);
SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state
DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;
// any further calls to CreateService/DeleteService will fail
// if service process is still around
La raison pour laquelle un processus de service est toujours actif après avoir déjà signalé son état SERVICE_STOPPED n'est pas surprenante. Il s'agit d'un processus régulier dont le thread principal est «bloqué» dans son appel à l'API StartServiceCtrlDispatcher
. Il réagit donc d'abord à une action de contrôle d'arrêt, puis doit exécuter la séquence de code restante.
Il est regrettable que le SCM/OS ne gère pas cela correctement pour nous ..__ Une solution programmatique est un peu simple et précise: obtenez le descripteur de processus de l'exécutable de service avant d'arrêter le service, puis attendez que ce descripteur soit signalé.
Si vous abordez le problème du point de vue de l'administration système, la solution consiste également à attendre que le processus de service disparaisse complètement.
Découvert une dernière chose à vérifier - regardez dans le Gestionnaire des tâches - si d'autres utilisateurs sont connectés à cette boîte, même s'ils sont "déconnectés", vous devez les déconnecter pour que le service soit enfin supprimé.
Dans mon cas, j'exécute taskkill /f /im dongleserver.exe
, Où dongleserver.exe
est le fichier exe de mon programme.
Ensuite, je peux déjà réinstaller mon programme.
Dans mon cas, cela était dû à une exception non gérée lors de la création de la source eventLog. Utilisez try catch pour identifier la cause.
La fermeture de chaque fenêtre actuellement ouverte suivie de l'exécution de la commande suivante a résolu le problème pour moi:
taskkill /F /IM mmc.exe
Si les étapes fournies par @MainMa n'ont pas fonctionné, suivez les étapes suivantes
Étape 1 Essayez de supprimer le processus à partir du gestionnaire de tâches Windows ou d’utiliser taskkill/F/PID. Vous pouvez trouver le pid du processus avec la commande 'sc queryex'. Essayez la prochaine étape si vous ne pouvez toujours pas désinstaller.
Étape 2 Si ci-dessus
Exécuter Autoruns pour Windows Rechercher un service par son nom et supprimer les résultats.
étapes à suivre:
step-1 goto l'emplacement C:\Windows\Microsoft.NET\Framework\v4.0.30319
step-2 run commande: installutil/u chemin-complet/nom_serveur.exe
step-3 fermez le panneau de services et rouvrez-le
step-4 run commande: installutil chemin-complet/nom_service.exe
J'avais ce problème lorsque j'utilisais Application Verifier pour vérifier mon service Win. Même après avoir fermé App Ver, la suppression de mon service était bloquée. Seule la suppression du service de App Ver a résolu le problème et le service a été supprimé immédiatement. On dirait qu'un processus utilise toujours votre service après avoir essayé d'en supprimer un.
La raison principale de l’erreur est que le processus n’est pas arrêté .. pour le résoudre, ouvrez le gestionnaire de tâches et accédez aux services pour voir si vous pouvez toujours voir votre service, puis passez au processus de ce service et à la fin du processus. Alors le problème sera résolu complètement.
Très probablement, la suppression du service échoue car
protected override void OnStop()
jeter une erreur lors de l'arrêt d'un service. Envelopper des objets dans un catch try empêchera le marquage d'erreur de suppression
protected override void OnStop()
{
try
{
//things to do
}
catch (Exception)
{
}
}