Essayer de lancer un service Windows à partir d'une application Windows donnant System.ComponentModel.Win32Exception: L'accès est refusé
-
08-10-2019 - |
Question
Je suis en train de développer une application Windows pour démarrer / arrêter et de l'état de moniteur de deux services particuliers.
Le problème est que je reçois
System.ComponentModel.Win32Exception: L'accès est refusé
Notez que les services sont le système local
Ce qui suit est mon code
private void StartService(string WinServiceName)
{
ServiceController sc = new ServiceController(WinServiceName,".");
try
{
if (sc.ServiceName.Equals(WinServiceName))
{
//check if service stopped
if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped))
{
sc.Start();
}
else if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Paused))
{
sc.Start();
}
}
}
catch (Exception ex)
{
label3.Text = ex.ToString();
MessageBox.Show("Could not start " + WinServiceName + "Service.\n Error : " + ex.ToString(), "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
sc.Close();
sc.Dispose();
// CheckStatus();
}
}
La solution
Essayez ce leppie a suggéré dans son commentaire, si elle ne fonctionne pas, vous devez nous dire quelle ligne est de lancer exception -. Lorsque vous créez ServiceController, quand vous essayez de le démarrer ou ailleurs
BTW, vous ne devriez pas appeler sc.Start () si le service est en pause, vous devez appeler sc.Continue ().
En outre, il est probablement mieux idée d'utiliser en utilisant construction que d'essayer / enfin, comme ceci:
private void StartService(string WinServiceName)
{
try
{
using(ServiceController sc = new ServiceController(WinServiceName,"."))
{
if (sc.ServiceName.Equals(WinServiceName))
{
//check if service stopped
if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped))
{
sc.Start();
}
else if (sc.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Paused))
{
sc.Continue();
}
}
}
}
catch (Exception ex)
{
label3.Text = ex.ToString();
MessageBox.Show("Could not start " + WinServiceName + "Service.\n Error : " + ex.ToString(), "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
De cette façon, vous n'avez pas besoin d'appeler sc.Close () vous-même (BTW, vous devez appeler Fermer Ne rejetez est redondant - Documentation: Fermer sectionneurs cette instance ServiceController du service et libère toutes les ressources que l'instance alloué.)
EDIT :
Faites un clic droit sur votre fichier exe dans l'Explorateur et choisissez Exécuter en tant qu'administrateur. Dans Windows 7, sauf si vous avez l'UAC (User Access Control) désactivé, vous n'êtes pas en cours d'exécution des programmes en tant qu'administrateur jusqu'à ce que vous demande explicitement / ou vous êtes invité à le faire.