Essayer de lancer un service Windows à partir d'une application Windows donnant System.ComponentModel.Win32Exception: L'accès est refusé

StackOverflow https://stackoverflow.com/questions/4407796

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();
}
}
Était-ce utile?

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 : text alt

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top