Is Service Installed Hangup?


The following "IsServiceInstalled" method looks good, but it throws errors when cannot find a service.

I don't understand why it doesn't simply return "false" if a service is not found.

I use this code to call the following method;

        if (IsServiceInstalled(control.ServiceName))                    
        //run other code

        private bool IsServiceInstalled(string svcName)
        {
            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController service in services)
            {
                if (service.ServiceName == svcName)
                    return true;
            }
            return false;
        }

       
pointemanAsked:
Who is Participating?
 
käµfm³d 👽Commented:
That's not even valid code. You can't surround a function definition with a try/catch. What I was referring to was more like:
private bool IsServiceInstalled(string svcName)
{
    ServiceController[] services = ServiceController.GetServices();

    foreach (ServiceController service in services)
    {
        try
        {
            if (service.ServiceName == svcName)
                return true;
        }
        catch
        {
            // One failed
        }
    }
} 

Open in new window

0
 
käµfm³d 👽Commented:
I'm guessing that "ServiceController.GetServices()" is what is causing the exception. Even though you can enumerate the running services on a system, I have run into issues where certain processes cannot be accessed because of permissions. I would suggest putting a try/catch inside your foreach and/or elevating your program. I'm not completely sure the latter will do the trick.
0
 
käµfm³d 👽Commented:
Correction:

>>  I'm guessing that "ServiceController.GetServices()" is what is causing

I'm guessing that "service.ServiceName == svcName" is what is causing...
0
Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

 
Kenneth BrownResearch AssociateCommented:
Step through the code in debugger to find which actual line throws the error.
0
 
pointemanAuthor Commented:
The more I think about it, I wonder if I'm not waiting long enough for a result. I know the list of services on any pc would be long.
Here's the method I use to call each servicecontroller:

foreach (ServiceController control in controllers)
{
       if (IsServiceInstalled(control.ServiceName))
       {
             ServiceCommand(control, (string)command);
       }
       Thread.Sleep(5000);
}  
 
0
 
iHadiCommented:
The code runs smoothly without any exceptions and returns false if not found. Can you post the exception you are getting and the stack trace
0
 
pointemanAuthor Commented:
Doing this, but not any better:
try
{
       private bool IsServiceInstalled(string svcName)
        {
            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController service in services)
            {
                if (service.ServiceName == svcName)
                    return true;
            }            
}
catch
{
     return false;
}
  return true;
}

 
0
 
pointemanAuthor Commented:
Good greif, isn't there a better way to look for a service exists before calling ServceControllers?
0
 
Kenneth BrownResearch AssociateCommented:
In your new sleep 5s method - when does it error? immediately, or after some time - that would surely indicate where roughly the problem is....
0
 
Kenneth BrownResearch AssociateCommented:
I missed a few posts, but surely the try/catch is just a temporary measure to narrow down what is causing the problem so you can handle it more nicely; not an actual solution. Is there any reason you cant debug it as my suggestion?
0
 
pointemanAuthor Commented:
Using this to solve problem, thanks....  

       private bool IsServiceInstalled(string svcName)
       {
           ServiceController[] services = ServiceController.GetServices();

           foreach (ServiceController service in services)
           {
                try
                {
                      if (service.ServiceName == svcName)
                             return true;
                }
                catch
                {
                     return false;
                }
               return false;
       }

 
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.