Solved

Need to batch file automate a simple Windows 2000 service install and configuration

Posted on 2004-08-29
32
465 Views
Last Modified: 2010-07-27
I need to install a service in Windows 2000/XP but want to automate the process with a batch file.  I prefer batch since I know how to use it best, but if someone could instruct me on a script it would be okay as well.  Here is what I do manually now to install the service.

I exit a program that is running in the taskabr by the clock then I open the command prompt and type
c:\program files\remote backup\rbackup /i

I then have to open the services windows and tell it to automatic start, interact with desktop then start the service.

How can I automate this whole process including the closing of the program if open?
0
Comment
Question by:murryc
  • 13
  • 13
  • 6
32 Comments
 
LVL 18

Expert Comment

by:exx1976
ID: 11928354
Well, if you can tell me the name of the process as it appears in the Processes Window in task manager, then I could write a quick piece of VBS that would accomplish this for you...
0
 

Author Comment

by:murryc
ID: 11928715
the program is running as rbackup.exe in the processes.  Let em clarify the task I manually complete.

I shutdown the application.

I open command prompt

I make sure I am in the c: drive

I navigate to the directory cd\program files\remote backup

I then execute rbackup /i

I then go into the services and select automatic start up for the service and select to interact with desktop

I then start the service and verify it is running as rbackup.exe in the processes (or just see the icon on the taskbar)

Can you also write a VBS that removes the service.  I just do the same thing to install but use rbackup /u instead of /i.

Thanks.
0
 
LVL 7

Expert Comment

by:GATOR420
ID: 11930019
If you have sc.exe from the resource kit I think you could use this below. Change SERVICENAME to be what you want the name to appear as in services.

Set ServicePath="c:\program files\remotebackup\rbackup.exe /i"
SC create SERVICENAME binpath= "%servicepath% -service" type= own type= interact start= auto

For removing it, I am going to presume it's already running:

SC stop SERVICENAME
SC delete SERVICENAME

I think that should work. Give it a try and let me know.
0
 
LVL 18

Expert Comment

by:exx1976
ID: 11931395
Ok, so the rbackup.exe that you are stopping, this is a service that is already running, no?

If it is a service, do you want it stopped cleanly (like through the services page), or just killed??
0
 

Author Comment

by:murryc
ID: 11931796
the initial rbackup.exe is just a running process and not a service.  it becomes a service once we run the VBS you are creating that installs it as a service.  The removal VBS will have to stop the service then remove it completely.  a clean stop would be better if possible.

GATOR420..i will try your method also, but will also try using exx1976 option since he was first to reply
0
 
LVL 18

Expert Comment

by:exx1976
ID: 11932608
Well, download PSKill from here:

http://www.sysinternals.com/ntw2k/freeware/pskill.shtml

This script assumes that the name of the service is "rbackup".  Veryify this in your service properties before using this script..  Further, this script assumes that you have placed PSKill in the root of your C: drive.  If this script will be used on remote client machines, then you can insert these lines to the beginning of the script to copy PSKill to the workstation (just make sure to change <SERVERNAME> and <SHARENAME> to their respective correct entries for your environment):

Set oFS = CreateObject("Scripting.FileSystemObject")
oFS.CopyFile "\\<SERVERNAME>\<SHARENAME>\PSKill.exe" , "C:\PSKill.exe"


If the name of the service is not rbackup, then simply change it in the line towards the end of the script where you see ** Name = 'rbackup'")  **

Then...

Set ws = CreateObject("WScript.Shell")
ws.run "c:\pskill rbackup.exe"
wscript.Sleep 5000
ws.run "c:\program files\remote backup\rbackup /i"
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
     & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Service WHERE Name = 'rbackup'")
For Each objService In colListOfServices
     errReturnCode = objService.Change( , , , , "Auto", TRUE)
     objService.StartService()
Next


To remove it (assuming it's running and you want it stopped first)...


strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
     & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Service WHERE Name = 'rbackup'")
For Each objService In colListOfServices
     errReturn = objService.StopService()
Next
Set ws = CreateObject("WScript.Shell")
ws.run "c:\program files\remote backup\rbackup /u"


Let me know if I can be of any further assistance..

HTH,
exx
0
 

Author Comment

by:murryc
ID: 11991690
when I run the install service script it kills the service okay but then tells me it cannot find c:\program files\remote backup\rbackup /i.  That file does exist but I think it will not work unless you have navigated to that folder first then execute rbackup /i.  At leat that is what the instructions say from the vendor.  The file exists and it works if you manaully browse to that folder through the CMD then execute the rbackup /i.  Any suggestions?
0
 

Author Comment

by:murryc
ID: 11993213
okay, the problem has to do with the spaces in the path for rbackup.  The VBS does not seem to like the spaces.  I created a folder with no spaces and put the rbackup in that folder and it worked great.  I would really like however, to have it work from its current location so is there anything we can do about the spaces limitation?
0
 
LVL 7

Expert Comment

by:GATOR420
ID: 11995851
Just curious if you have tried my script yet? :)
0
 
LVL 18

Expert Comment

by:exx1976
ID: 11996742
Yes, try this line instead:


ws.run """c:\program files\remote backup\rbackup /i"""

Or, you might have to do this instead, depending upon where the program wants the /i..  Some programs do not like it inside the quotes

ws.run """c:\program files\remote backup\rbackup"" /i"

HTH,
exx
0
 

Author Comment

by:murryc
ID: 11997364
GATOR420..I do not have the resource kit..is there some other way I can get the file sc.exe?
0
 

Author Comment

by:murryc
ID: 11997489
exx1976...that fixed it.

Now, let me take a step further.  The service is not starting after the install.  I receive no error and the service is set to automatic so a reboot would fix it but can we get it to start after the install.

Also, is there anyway I can tell it what to do on failure attempts in the service properties?  I would like to set the first 2 to 'restart service' and then set the last one to run a program and designate a batch file called service.bat that will email me if it every invokes it.  I already have the batch file that emails.  I just need to program the script to set the settings in the service.
0
 
LVL 7

Expert Comment

by:GATOR420
ID: 11997763
0
 
LVL 18

Expert Comment

by:exx1976
ID: 11998616
Check the name of the service to make sure it is the same after the install as it was before the install (when we stopped it).

This line here starts the service:

objService.StartService()


But, this line selects WHICH service to start:

Set colListOfServices = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Service WHERE Name = 'rbackup'")


So, if the service name has changed and is no longer known as 'rbackup' then the line above (objService.StartService()) will start nothing, since nothing was selected from the Win32_Service set with the SQL query...

The other thing that could be causing the script to not start the service is if the installation of the program takes longer than just a moment or two, the script is attempting to start it before the installation has finished.  To solve this, insert another wscript.sleep xxxxx line into the script right after the installation line, where x=milliseconds (1000 = 1 second).  Time the installation, see roughly how long it takes, and allow a few extra seconds for a slower machine..  So, if the installation takes 15 seconds, then make that line        wscript.sleep 20000   for a 20 second pause until processing continues.  Most of my scripts that make calls to a DOS window or command line program are configured with 5000 ms sleeps in them to ensure that the external program has had time to perform its function before I call it again (XCACLS, SUBINACL, etc etc).

As far as configuring the failure attempts, unfortunately, I do not know how to do that.  I checked a couple of my scripting books here, and there was no mention of it..  While it may be possible to access it, I have some pretty comprehensive books here, and I'd have to guess that information is stored as a BLOB (Binary Large OBject) and is not accessible by conventional means (Terminal Services properties in AD are stored in this fashion in 2000).  I would check TechNet or MSDN for more information if you really want to learn it..

Also, there is a way to kill that process off without using PSKill if you don't want to push that program to your target machines..  Let me know and I'll post it (using VBS, of course).


HTH,
exx
0
 

Author Comment

by:murryc
ID: 11998951
exx, I would love to have the alternate kill solution so that I do not have to push the pskill.  I will test the start solution and let you know.

GATOR..I will download the sc.exe tool and try that as well and let you know, but as it stands exx has solved the issue.

Between the both of you, is there any benefit of using a batch (I assume that is what the sc.exe tool uses) versus using a VBS script to complete this?  Are there any problems I might encounter with one that I would not with the other?
0
 
LVL 18

Expert Comment

by:exx1976
ID: 11999414
SC is an executable (I believe), but it would have to be written into a batch.

Batch versus VBS will depend largely on your clients, and your preference.  WSH (Windows Scripting Host, the engine that VBS runs on) has been a part of the base install of MS OSes since 2000 (I THINK 98 also, but I'm not certain of this).  I know NT and 95 did not have it built in, but I believe Me did (again, uncertain).  If you are using all 2000 and higher clients, then the benefit to using VBS instead of batch is that you can disable the commant prompt in your group policies and the VBS will continue to function.  Unless, however, you are calling a DOS program (don't know if your rbackup is DOS or not), then those will cease to function as well.

VBS has very many handles directly into the OS (such as raw manipulation of services, AD, DNS, WINS, etc etc..  Basically, almost anything MS related can be controlled via VBS.  I have many many scripts written to automate many different things, but the most commonly used ones create a user, then set ALL the user properties (address, phone numbers, profile path, home directory path, what drive letter to map it to, login hours, etc etc), then create a profile directory, set the permissions and ownership of it as well as copy in the default profile, create a home directory, set the permissions on that, add the user to whatever groups they need to be in, create their mailbox, set the send/receive limits on it, put the mailbox in whatever storage group I want it in, set the mailbox size limits, etc etc..  Basically, with two mouse clicks, a name and an SSN, the script will spit out a COMPLETELY functional user object for me that can log into the system moments later.  Another very nice feature is its tight integration with almost any MS product..  For instance, I can make Excel and Word do very cool things, you can write SQL queries using it, etc etc..  Its incredibly versatile, and can accomplish most any task you put to it, given the right massaging, and the occasional use of a third party tool (TSCMD, for instance)..

The alternate kill solution is as follows.  This is the complete version of the script, with the quote corrections as well, assuming the OS wants the /i inside the quotes, also including the extra sleep line.  This script will terminate the running process, install the updated service, and then start it.

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
     & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Process WHERE Name = 'rbackup.exe'")
For Each objProcess in colProcessList
     objProcess.Terminate()
Next
wscript.Sleep 5000
ws.run """c:\program files\remote backup\rbackup /i"""
wscript.Sleep 20000
Set colListOfServices = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Service WHERE Name = 'rbackup'")
For Each objService In colListOfServices
     errReturnCode = objService.Change( , , , , "Auto", TRUE)
     objService.StartService()
Next
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 7

Expert Comment

by:GATOR420
ID: 11999630
While I have to agree that VBS and WSH is going to be the way of the future for complex tasks, it may be a bit overkill for this particular task.

It seems as if you have already encountered all the problems that you would have with VBS for this simple task, I don't think you need more. Glad to hear that it is working for you though.

The other thing really is the tightness of code needed to do the same task. Look at the amount of lines I needed to do the same task in a batch file as ex needed to write to achieve the same results with VBS. This is where I would definitely say that VBS is overkill when I can write out the same tasks in 4 lines of code.  

And for reference, yes, sc.exe is an executable (part of the Windows 2000 Resource Kit) and is written in to the script I provided you above.

So while VBS and WSH are great for doing some really wonderful things that cannot be achieved with batch files, they are really better suited to the more complex tasks that batch file scripting has no room for.
0
 
LVL 18

Expert Comment

by:exx1976
ID: 11999734
While I do not disagree with Gator about the differences, and that the 4 lines of code he wrote to perform this operation are "lighter" to look at, what amount of overhead does SC actually create when it runs??  It very well may be lighter, but my gut feeling is that that executable grabs handles to the same system processes that the VBS code I wrote does, and probably uses a little more memory, at that.  Just looks a little prettier, but at the cost of not having the granular level of control that scripting the process yourself affords.  Not only that, but like I said before, if you're using all 2000 and higher clients, then WSH is already installed, there is no need to push down any more executables to your clients in the login scripts (what if you have remote clients??  Pushing executables across a dialup connection can get to be painful, even if they're small)...


And Gator - How many lines of code are in SC itself?  Surely you didn't write that executable, and we may never know, since it's compiled..  But I'm willing to bet that the source for SC is many many more lines than the 14 lines of code it took me in VBS..  


HTH,
exx
0
 

Author Comment

by:murryc
ID: 11999854
exx...the service did not start because it was named remote backup instead of rbackup after installed.  I updated your script and put the sleep command as well because it prompts the user with a successful popup that has to be accepted before the service can start so I set the sleep to 10 seconds to give the user enough time to accept the prompt.  If the user does not accept the prompt then the service will start after reboot or manual start and it works great.  I also had to move the /i outside of the quotes to get it to work.

I will implement the pskill alternative and test.

Thank you both for your insight on VBS versus batch.  I myself use batch files in my Windoes 2000/XP ADS environment to handle all of the detailed logon stuff since I do not know VBS jusy yet and I have seen it's limitations.

I will most likley settle for the VBS solution here since I do not have to push any utlities to the clients.  All of the clients are customer computers so they are not on a network and I would have to script another process to download the utility or include everything in an installer which if I can get away with NOT doing, it would be better and easy to manage.

0
 
LVL 18

Expert Comment

by:exx1976
ID: 11999909
The two main books I use for finding solutions to my VBS questions are

Windows 2000 Scripting Guide
by The Microsoft Windows Resource Kit Scripting Team
Microsoft Press
ISBN 0-7356-1867-4

and

Windows 2000 Scripting Bible
by William R Stanek
IDG Books Worldwide
ISBN 0-7645-4677-5

I would also suggest MS course # 2433 to learn the essentials.  It's a great 3 day course that most anyone can sit in and not have a problem with.  Prior programming knowledge is a plus, but definitely not a requirement.

Glad I could help out.


-exx
0
 
LVL 18

Expert Comment

by:exx1976
ID: 11999949
Whoops..  Forgot one line in there..  Should read like this:

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
     & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Process WHERE Name = 'rbackup.exe'")
For Each objProcess in colProcessList
     objProcess.Terminate()
Next
wscript.Sleep 5000
Set ws = CreateObject("WScript.Shell")
ws.run """c:\program files\remote backup\rbackup /i"""
wscript.Sleep 20000
Set colListOfServices = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Service WHERE Name = 'rbackup'")
For Each objService In colListOfServices
     errReturnCode = objService.Change( , , , , "Auto", TRUE)
     objService.StartService()
Next

The line    "Set ws = CreateObject("Wscript.Shell")"    got inadvertantly removed when I removed the reference to pskill..  Sorry about that....


-exx
0
 
LVL 7

Expert Comment

by:GATOR420
ID: 11999966
Not sure what you mean by overhead, resources? RAM? CPU? If so, not sure it would be any more significant than what you wrote.

Granular level of control? How granular do you need to get for one executable and one service?

SC also runs remotely. In fact, I use this to install and uninstall services on remote machines all day without requiring that the executable be on the remote machine. Works like a champ. There is no need to push this executable on to remote machines.

I don't know how many lines of code are in SC.EXE, however, I do know that I can use it for any service. Not just the one in question here, but any other service that exists in the system. And although sc.exe may be comprised of more than 14 lines of code, it does do the trick and I don't need to reinvent the wheel. And as I said before, there is no need to push the executable onto remote workstations.

Ex, I certainly don't mean to debate this with you or the script that you wrote. I agree that VBS and WSH are the way to go. I just think that this particular task would have been better achieved with a batch file VS. VBS. Batch files are also much easier to manipulate for someone who does not understand VBS. :)



0
 

Author Comment

by:murryc
ID: 12000063
Gator...how do I batch without pushing sc.exe to the clients?

exx, I implemented the pskill replacement with the line of code you left out and it works but it does not start the service after all is done.  With PSKill the script works great, without it the initial process gets killed but the new service does not start.

Here is what I have....

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
     & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Process WHERE Name = 'rbackup.exe'")
For Each objProcess in colProcessList
     objProcess.Terminate()
Next
Set ws = CreateObject("WScript.Shell")
wscript.Sleep 5000
ws.run """c:\program files\remote backup\RBackup"" /i"
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
     & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Service WHERE Name = 'Remote Backup'")
For Each objService In colListOfServices
     errReturnCode = objService.Change( , , , , "Auto", TRUE)
wscript.Sleep 10000
     objService.StartService()
Next
0
 
LVL 7

Expert Comment

by:GATOR420
ID: 12000093
murry, you only need sc.exe on the machine that will be running the batch file.

The batch has already been written for you and is way at the top of this thread. :)
0
 
LVL 18

Accepted Solution

by:
exx1976 earned 500 total points
ID: 12000879
Move the 'wscript.Sleep 10000' line up.  It needs to be before the query to the services database.  Otherwise, if you are querying the database before the service has finished installing, it won't show up in the services database, hence The SQL query will evaluate to NULL and there will be no values in colListOfServices for the for...next loop to evaluate.

I would put the wscript.Sleep directly under the ws.run """c:\program files\remote backup\rbackup"" /i" line personally, but anywhere between the installation line and the SQL query line will be fine.


Also, not sure if you are checking this or not, but the name of the service that is referenced in the services database is not always the same as the name that is referenced in the display pane..  To find the system-side name of a service, double click the service in the "services" MMC and look at the first line on the General tab.  For instance, the service "Distributed Link Tracking Client" on my Windows 2000 box is actually knows as "TrkWks" to the system...  The name you want in the SQL query should be the name the system sees, not the name that the display pane shows.

Also, for troubleshooting purposes, change the

objService.StartService()

line to  

errStart = objService.StartService()

And then right after that add the line

If errStart > 0 Then WScript.Echo(errStart)

That should echo an integer if there are any errors starting the service.  If you get any error number, post it here and I'll tell you what it means (there are many different possible error codes -- if you're getting one, then it's just being ignored with the current code).  You also have a few redundant lines in there that I have removed, shortening it up (happened during all of our versioning, I'm sure).  The complete code should look like this (including the changes I referenced above):

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
     & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Process WHERE Name = 'rbackup.exe'")
For Each objProcess in colProcessList
     objProcess.Terminate()
Next
Set ws = CreateObject("WScript.Shell")
wscript.Sleep 5000
ws.run """c:\program files\remote backup\RBackup"" /i"
wscript.Sleep 10000
Set colListOfServices = objWMIService.ExecQuery ("SELECT * FROM " _
     & "Win32_Service WHERE Name = 'Remote Backup'")
For Each objService In colListOfServices
     errReturnCode = objService.Change( , , , , "Auto", TRUE)
     errStart = objService.StartService()
     If errStart > 0 Then wscript.Echo("Start error number" & errStart)
Next


HTH,
exx
0
 

Author Comment

by:murryc
ID: 12001218
exx..that worked...now one last thing...can I include both scripts in a single file and construct a simple question that will ask the user which selection they want, either install or uninstall?  I know how to do this easily in batch, but not in VBS, can it be done?

GATOR...let me make sure I am on the same page with the sc.exe....is the sc.exe a file found by deafult on 2000/XP machines?  If not then I would have to push (install the file) with the batch since this script will be executed on standalone amchines that are not connected to a network or at least a network I have control off.  This scsript will be downloaded from my website and executed lcoally to install the new service of the software the client just installed.  the VBS solution is working, but I wanted to give the batch a fair shake, but can it still be done without copying (pushing, installing) the sc.exe utility to the installing computer?
0
 

Author Comment

by:murryc
ID: 12001416
exx..if the service is already installed but is disabled or is stopped, I get an error number 14..can we build in a check that checks and if the service is already installed it executes the uninstall command first then the install command.  If we always run the unintsall first we will get an error so it has to do it only if the service is already installed.  What do you think?
0
 
LVL 18

Expert Comment

by:exx1976
ID: 12005620
Error 14 is "The service is disabled."  Not stopped, but DISABLED, as in you can't start it.  It has nothing to do with the fact that the service is stopped (other than it obviously isn't started because it's disabled!).

As far as asking the user questions and all this other stuff, I don't mean to sound rude, but I've been posting in this thread for 10 days now, and I do believe that your original question has been answered.  More than answered, in fact, since the original topic didn't say anything about an uninstall script either...

Might I suggest that you begin a new topic for your new questions??



Respectfully,
exx
0
 

Author Comment

by:murryc
ID: 12006944
fair enough exx, you have earned your points plus amny more....I will repost as I have more I wnat to do with this script.  Maybe you will pick it back up after I repost it.  Thanks for your hard work and the solution you have provided works great.
0
 
LVL 18

Expert Comment

by:exx1976
ID: 12007572
Not a problem..  I'll be sure to look for the new topic.


-exx
0
 

Author Comment

by:murryc
ID: 12007904
exx - is there anyway I can get the error code lists for the scripts so that I can create a help file.  I can post this in another post, but I thought I might have to get that from you.  Let me know.
0
 
LVL 18

Expert Comment

by:exx1976
ID: 12008720
0 - no error
1 - request not supported
2 - user did not have necessary access
3 - the service cannot be stopped because other services that are running are dependent on it
4 - the requested control code is not valid, or it is unacceptable to the service
5 - the requested control code cannot be sent to the service because the state of the service (win32_baseservice state property) is equal to 0, 1, or 2
6 - the service has not been started
7 - the servie did not respond to the start request in a timely fashion
8 - unknown failure when starting the service
9 - the directory path to the service executable file was not found
10 - the service is already running
11 - the database to add a new service is locked
12 - a dependency this service relies on has been removed from the system
13 - the service failed to find the service needed from a dependent service
14 - the service has been disabled from the system
15 - the service does not have the correct authentication to run on the system
16 - this service is being removed from the system
17 - the service has no execution thread
18 - the service has circular dependencies when it starts
19 - a service is running under the same name
20 - the service name has invalid characters
21 - invalid parameters have been passed to the service
22 - the account under which this service runs is either invalid or lacks the permissions to run the service
23 - the service exists in the database of services available from the system
24 - the service is currently paused in the system.


HTH,
exx
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

NTFS file system has been developed by Microsoft that is widely used by Windows NT operating system and its advanced versions. It is the mostly used over FAT file system as it provides superior features like reliability, security, storage, efficienc…
A Short Story about the Best File Recovery Software – Acronis True Image 2017
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now