Solved

VB Script Modification Request Pt2

Posted on 2013-06-20
14
398 Views
Last Modified: 2013-06-22
Hello Experts,

I've been getting very limited support from this site recently. However, I thought I would try and enlist help again in modifying a vb script.

Can someone please help determine why I get the error message show in the attachment for the following script:


' ConnectInTabToSpecifiedHostname-HandlePasswordAuthInTerminalWindow.vbs
'   Last Modified: 21 Mar, 2012
'
' DESCRIPTION:
'   Prompts for host/IP, username, and password (if not hard-coded in the script
'   variables strHost, strUser, and strPwd), and then uses the information to
'   connect to the host using the SSH2 protocol.  The session configuration
'   object is used to detect if the option is enabled for handling
'   authentication in the terminal window, and prompts the user to have this
'   script automatically enable it if the option is not currently enabled.
'   SSH2 authentication is handled by waiting for the username and password
'   prompts and sending the username and password, respectively.

' If you don't want to be prompted for host information, set the three variables
' below to non-empty, legitimate values; understand that storing sensitive data
' such as passwords in a plaintext file is not a best practice, and should be
' avoided for reasons of security:
strHost = "192.168.232.128"
strUser = ""
' If you choose to store a plaintext password in this file, make sure that the
' file system permissions for this script file are such that your user account
' is the only one that has access to the file.
strPwd  = ""

'-------------------------------------------------------------------------------
Sub Main()
    If strHost = "" Then
        strHost = Trim( _
            GetPlainTextInput( _
                "Specify host name or IP address", _
                "Connect To Host", _
                strHost))
        ' Bail if the input was cancelled
        If strHost = "" Then Exit Sub
    End If

    ' Get Username and Password as needed
    If strUser = "" Then
        strUser = Trim( _
            GetPlainTextInput(_
                "Specify username for " & strHost & ":", _
                "Username?", _
                strUser))
        ' Bail if user cancelled
        If strUser = "" Then Exit Sub
    End If
    If strPwd = "" Then
        strPwd = Trim(_
            GetPasswordInput(_
                "Specify password for " & strUser & ":", _
                "Password?", _
                strPwd))
        ' Bail if user cancelled
        If strPwd = "" Then Exit Sub
    End If

    ' Connect in a new tab to the host specified
    bWaitForAuthToCompleteBeforeReturning = False
    bLetCallerDetectAndHandleConnectionErrors = True
    Set objNewTab = crt.Session.ConnectInTab( _
        "/SSH2 " & strHost, _
        bWaitForAuthToCompleteBeforeReturning, _
        bLetCallerDetectAndHandleConnectionErrors)
        
    If objNewTab.Session.Connected <> True Then
        DisplayMessage "Failed to connect to " & strHost
        ' You're not allowed to close the script tab (the tab in which the
        ' script was launched oringinally), so only try if the new tab really
        ' was a new tab -- not just reusing a disconnected tab.)
        If objNewTab.Index <> crt.GetScriptTab().Index Then
            objNewTab.Close
        End If
        Exit Sub
    End If
    
    ' Before continuing on with the script, ensure that the session option
    ' for handling authentication within the terminal window is enabled
    Set objConfig = objNewTab.Session.Config
    bAuthInTerminal = objConfig.GetOption("Auth Prompts In Window")
    If Not bAuthInTerminal Then
        If PromptYesNo(_
            "The 'Default' session (used for all ad hoc " & _
            "connections) does not have the ""Display logon prompts in " & _
            "terminal window"" option enabled, which is required for this " & _
            "script to operate successfully." & vbcrlf & vbcrlf & _
            "Would you like to have this script automatically enable this " & _
            "option in the 'Default' session so that next time you run " & _
            "this script, the option will already be enabled?") <> vbYes Then
            Exit Sub
        End If
        
        ' User answered prompt with Yes, so let's set the option, save, and exit
        objConfig.SetOption "Auth Prompts In Window", True
        objConfig.Save
        Exit Sub
    End If
    
    ' Make sure the new tab is "Synchronous" so we can properly wait/send/etc.
    objNewTab.Screen.Synchronous = True
    
    ' Handle authentication in the new tab using the new tab's object reference
    ' instead of 'crt'
    nAuthTimeout = 10  ' seconds
    
    ' Modify the "$" or the "->" in the array below to reflect the actual shell
    ' prompt you expect to find when authentication is successful to your remote
    ' machine.
    vPossibleShellPrompts = Array(_
        "changed state to down:")
    Do
           DisplayMessage "Authentication timed out!"
                Exit Sub
                
            Case 1 ' "changed state to down:"
                ' Send the username
                objNewTab.Screen.Send strUser & vbcr "show ip int brief"
                
            Case 3 ' "sword:"
                ' Send the password
                objNewTab.Screen.Send strPwd & vbcr
            
            Case 4,5 ' "Login incorrect", "authentication failed."
                ' Let user know, and attempt to get correct password
                strPwd = GetPasswordInput(_
                    "Password authentication to '" & strHost & "' as user '" & _
                    strUser & "' failed." & vbcrlf & vbcrlf & _
                    "Please specify the correct password for user " & _
                    "'" & strUser & "':",_
                    "Auth failure - Bad Password?",_
                    strPwd)
                If strPwd = "" Then
                    DisplayMessage "User cancelled auth. Script exiting."
                    Exit Sub
                End If
                
                ' If we have another password to try, automatically loop through
                ' to the top and try again...
            
            Case 6,7,8 ' "$", "]#", or "->" <-- Shell prompt means auth success
                objNewTab.Session.SetStatusText _
                    "Connected to " & strHost & " as " & strUser
                Exit Do
                
            Case Else
                DisplayMessage "Ooops! Looks like you forgot to add code " & _
                    "to handle this index: " & objNewTab.Screen.MatchIndex & _
                    vbcrlf & _
                    vbcrlf & _
                    "Modify your script code's ""Select Case"" block " & _
                    "to have 'Case' statements for all of the strings you " & _
                    "are passing to the ""WaitForStrings"" method."
                
                objNewTab.Session.Disconnect
                ' Only attempt to close the tab if it's not *the* script tab
                If crt.GetScriptTab().Index <> objNewTab.Index Then
                    objNewTab.Close
                End If
                
                Exit Sub
        End Select
    Loop
    
    objNewTab.Session.SetStatusText "Doing work in script..."
    ' Do work in new tab here, using objNewTab.Screen, objNewTab.Session, etc.
    ' .
    ' .
    ' . 

    ' For demonstration, simulate work being done by sending "work work work "
    ' and "sleeping" for a while.
    For nTempIndex = 1 to 3
        objNewTab.Screen.Send "work "
        objNewTab.Screen.WaitForString "work "
        crt.Sleep 1000
    Next
    
    objNewTab.Session.SetStatusText "Work completed."
    crt.Sleep 2000
    
    ' Clear the status bar
    objNewTab.Session.SetStatusText ""
    
    ' When done with work, disconnect the new tab and close it
    objNewTab.Session.Disconnect
    ' Only attempt to close the tab if it's not *the* script tab
    If crt.GetScriptTab().Index <> objNewTab.Index Then
        objNewTab.Session.SetStatusText "Closing tab..."
        crt.Sleep 1000
        objNewTab.Close
        crt.Session.SetStatusText "Script Completed."
        crt.Sleep 2000
        crt.Session.SetStatusText ""
    Else
        crt.Session.SetStatusText "Script Completed."
        crt.Sleep 2000
        crt.Session.SetStatusText ""
        
        ' Close the entire application?  You decide.
        ' crt.Quit
    End If
End Sub

'-------------------------------------------------------------------------------
Function PromptYesNo(strText)
    PromptYesNo = crt.Dialog.MessageBox(strText, "SecureCRT", vbYesNo)
End Function

'-------------------------------------------------------------------------------
Function DisplayMessage(strText)
    crt.Dialog.MessageBox strText
End Function

'-------------------------------------------------------------------------------
Function GetPlainTextInput(strPrompt, strTitle, strDefaultValue)
    GetPlainTextInput = _
        crt.Dialog.Prompt(strPrompt, strTitle, strDefaultValue)
End Function

'-------------------------------------------------------------------------------
Function GetPasswordInput(strPrompt, strTitle, strDefaultValue)
    GetPasswordInput = _
        crt.Dialog.Prompt(strPrompt, strTitle, strDefaultValue, True)
End Function

Open in new window

scripterror1.png
0
Comment
Question by:cpatte7372
  • 7
  • 7
14 Comments
 

Author Comment

by:cpatte7372
ID: 39265047
Experts,

I thought I would give you the full picture of what I'm trying to achieve.

I'm trying to modify the script above as describe in the attachment.

I'm not interested in the authentication part of the script.

Can you help me please?

Cheers
ModifyAuthExample.png
0
 
LVL 52

Expert Comment

by:Scott Fell, EE MVE
ID: 39265070
>I've been getting very limited support from this site recently.
 cpatte7372, looking at your profile, you have a lot of questions you have not closed out yet.  Some of those were long threads meaning those experts put in a lot of time for you.  By closing the questions out and awarding points, you are letting the experts know all is good and their volunteered time was not a waste.  Because you have a lot of open questions, those same experts may not come back to help you and instead use their volunteer time for others.  I would suggest giving those questions some attention.

> I get the error message show in the attachment for the following script:
Assuming line 114 as shown in your png file is the same line 114 in your script, I would guess you did not start your conditional Case with Select Case / End Case.  Please see the usage here http://www.w3schools.com/vbscript/vbscript_conditionals.asp

Your fix should be just before line 114 adding, Select Case SomeVariable then at some point after your Case Else you need to add an End Case statement.  Please see the sample from the link I provided.
0
 
LVL 52

Expert Comment

by:Scott Fell, EE MVE
ID: 39265084
Now your ModifyAuthExample.png looks nothing like your original posted code.

I would suggest making a code sample of ONLY the important part so it is easy for us to follow. This is a great guide on how to make a Short, Self Contained, Correct (Compilable), Example http://sscce.org/

Let us know where the exact error is on your shortened example.
0
 

Author Comment

by:cpatte7372
ID: 39265443
Padas,

I've taken what you said on board and I have started assigning more points. Hopefully, this will result in more Experts coming forward to help me out.

Anyway, the ModifyAuthExample.png includes those sections of the script that need to be modified.

I would just like someone to add the correct syntax in the areas suggested in ModifyAuthExample.png.


Can you help me?
0
 
LVL 52

Expert Comment

by:Scott Fell, EE MVE
ID: 39266235
I have already answered your question here.  Your error had to do with missing "Select Case" and "End Case".  Now you have updated code with completely new issues that I can't understand.   Another thing to avoid here is to start your question with one thing, then later on introduce a completely new question and set of issues in the same question as you have done here.  

I would suggest closing this question out since it appears to be answered, then ask a new question.  If your new question is about your script that appears to have many problems, just go after one error per question.  We volunteer our time.  Completely debugging somebody's code is what we do for a living not for free.  In your question, paste your code, not a png file, let us know the line number of the pasted code where the error is not the line number in your completed code.

The one quick thing I can see in your code is the "case" needs to be one item, not an array.
Wrong Example:
Case 1,3
    something
Case else
    something else

Open in new window

Correct Example
Case 1
   something 1
Case 2
   something 2
Case 3
   something 3

Open in new window

Also in those case statements, make sure your variables are either numeric or alpha numeric (Case "1" instead of Case 1).  You can use either, but if you use numeric, make sure your passing a variable that is numeric.  To do this, you might need to change your Select Case statement to something like, Select Case int(MyVariable).  And prior to that line, do a test to make sure the variable is numeric and if it is not, then convert it to one.  Perhaps like;
If not isnumeric(MyVariable) then
    MyVariable=0 ' or whatever number you want that you can deal with in your case statement.
end if
Select Case int(MyVariable)

Open in new window

0
 

Author Comment

by:cpatte7372
ID: 39266256
Padas,

I have amended the script as follows. You'll see I have commented out all of the authentication. However, the script does nothing now.

Please note, I have little to NO scripting experience. The script was taken from a website called vandyke.

' ConnectInTabToSpecifiedHostname-

HandlePasswordAuthInTerminalWindow.vbs
'   Last Modified: 21 Mar, 2012
'
' DESCRIPTION:
'   Prompts for host/IP, username, and password (if not hard-coded in 

the script
'   variables strHost, strUser, and strPwd), and then uses the 

information to
'   connect to the host using the SSH2 protocol.  The session 

configuration
'   object is used to detect if the option is enabled for handling
'   authentication in the terminal window, and prompts the user to 

have this
'   script automatically enable it if the option is not currently 

enabled.
'   SSH2 authentication is handled by waiting for the username and 

password
'   prompts and sending the username and password, respectively.

' If you don't want to be prompted for host information, set the three 

variables
' below to non-empty, legitimate values; understand that storing 

sensitive data
' such as passwords in a plaintext file is not a best practice, and 

should be
' avoided for reasons of security:
strHost = "192.168.232.128"
strUser = ""
' If you choose to store a plaintext password in this file, make sure 

that the
' file system permissions for this script file are such that your user 

account
' is the only one that has access to the file.
strPwd  = ""

'---------------------------------------------------------------------

----------
Sub Main()
    If strHost = "" Then
        strHost = Trim( _
            GetPlainTextInput( _
                "Specify host name or IP address", _
                "Connect To Host", _
                strHost))
        ' Bail if the input was cancelled
        If strHost = "" Then Exit Sub
    End If

    ' Get Username and Password as needed
'    If strUser = "" Then
 '       strUser = Trim( _
  '          GetPlainTextInput(_
   '             "Specify username for " & strHost & ":", _
    '            "Username?", _
     '           strUser))
        ' Bail if user cancelled
      '  If strUser = "" Then Exit Sub
'    End If
 '   If strPwd = "" Then
'        strPwd = Trim(_
 '           GetPasswordInput(_
  '              "Specify password for " & strUser & ":", _
   '             "Password?", _
    '            strPwd))
        ' Bail if user cancelled
     '   If strPwd = "" Then Exit Sub
    'End If

    ' Connect in a new tab to the host specified
    'bWaitForAuthToCompleteBeforeReturning = False
'    bLetCallerDetectAndHandleConnectionErrors = True
    'Set objNewTab = crt.Session.ConnectInTab( _
     '   "/SSH2 " & strHost, _
      '  bWaitForAuthToCompleteBeforeReturning, _
       ' bLetCallerDetectAndHandleConnectionErrors)
        
    'If objNewTab.Session.Connected <> True Then
     '   DisplayMessage "Failed to connect to " & strHost
        ' You're not allowed to close the script tab (the tab in which 

the
        ' script was launched oringinally), so only try if the new tab 

really
        ' was a new tab -- not just reusing a disconnected tab.)
        'If objNewTab.Index <> crt.GetScriptTab().Index Then
            'objNewTab.Close
        'End If
        Exit Sub
    'End If
    
    ' Before continuing on with the script, ensure that the session 

option
    ' for handling authentication within the terminal window is 

enabled
    Set objConfig = objNewTab.Session.Config
    bAuthInTerminal = objConfig.GetOption("Auth Prompts In Window")
    If Not bAuthInTerminal Then
        If PromptYesNo(_
            "The 'Default' session (used for all ad hoc " & _
            "connections) does not have the ""Display logon prompts in 

" & _
            "terminal window"" option enabled, which is required for 

this " & _
            "script to operate successfully." & vbcrlf & vbcrlf & _
            "Would you like to have this script automatically enable 

this " & _
            "option in the 'Default' session so that next time you run 

" & _
            "this script, the option will already be enabled?") <> 

vbYes Then
            Exit Sub
        End If
        
        ' User answered prompt with Yes, so let's set the option, 

save, and exit
        objConfig.SetOption "Auth Prompts In Window", True
        objConfig.Save
        Exit Sub
    End If
    
    ' Make sure the new tab is "Synchronous" so we can properly 

wait/send/etc.
    objNewTab.Screen.Synchronous = True
    
    ' Handle authentication in the new tab using the new tab's object 

reference
    ' instead of 'crt'
    nAuthTimeout = 10  ' seconds
    
    ' Modify the "$" or the "->" in the array below to reflect the 

actual shell
    ' prompt you expect to find when authentication is successful to 

your remote
    ' machine.
    vPossibleShellPrompts = Array(_
        "changed state to down")
    Do
           
              Select Case objNewTab.Screen.MatchIndex
                
            Case 1 ' "changed state to down:"
                ' Send the username
                objNewTab.Screen.Send strUser & vbcr & "show ip int 

brief"
                
            Case 3 ' "sword:"
                ' Send the password
                objNewTab.Screen.Send strPwd & vbcr
            
            Case 4,5 ' "Login incorrect", "authentication failed."
                ' Let user know, and attempt to get correct password
                strPwd = GetPasswordInput(_
                    "Password authentication to '" & strHost & "' as 

user '" & _
                    strUser & "' failed." & vbcrlf & vbcrlf & _
                    "Please specify the correct password for user " & 

_
                    "'" & strUser & "':",_
                    "Auth failure - Bad Password?",_
                    strPwd)
                If strPwd = "" Then
                    DisplayMessage "User cancelled auth. Script 

exiting."
                    Exit Sub
                End If
                
                ' If we have another password to try, automatically 

loop through
                ' to the top and try again...
            
            Case 6,7,8 ' "$", "]#", or "->" <-- Shell prompt means 

auth success
                objNewTab.Session.SetStatusText _
                    "Connected to " & strHost & " as " & strUser
                Exit Do
                
            Case Else
                DisplayMessage "Ooops! Looks like you forgot to add 

code " & _
                    "to handle this index: " & 

objNewTab.Screen.MatchIndex & _
                    vbcrlf & _
                    vbcrlf & _
                    "Modify your script code's ""Select Case"" block " 

& _
                    "to have 'Case' statements for all of the strings 

you " & _
                    "are passing to the ""WaitForStrings"" method."
                
                objNewTab.Session.Disconnect
                ' Only attempt to close the tab if it's not *the* 

script tab
                If crt.GetScriptTab().Index <> objNewTab.Index Then
                    objNewTab.Close
                End If
                
                Exit Sub
        End Select
    Loop
    
    objNewTab.Session.SetStatusText "Doing work in script..."
    ' Do work in new tab here, using objNewTab.Screen, 

objNewTab.Session, etc.
    ' .
    ' .
    ' . 

    ' For demonstration, simulate work being done by sending "work 

work work "
    ' and "sleeping" for a while.
    For nTempIndex = 1 to 3
        objNewTab.Screen.Send "work "
        objNewTab.Screen.WaitForString "work "
        crt.Sleep 1000
    Next
    
    objNewTab.Session.SetStatusText "Work completed."
    crt.Sleep 2000
    
    ' Clear the status bar
    objNewTab.Session.SetStatusText ""
    
    ' When done with work, disconnect the new tab and close it
    objNewTab.Session.Disconnect
    ' Only attempt to close the tab if it's not *the* script tab
    If crt.GetScriptTab().Index <> objNewTab.Index Then
        objNewTab.Session.SetStatusText "Closing tab..."
        crt.Sleep 1000
        objNewTab.Close
        crt.Session.SetStatusText "Script Completed."
        crt.Sleep 2000
        crt.Session.SetStatusText ""
    Else
        crt.Session.SetStatusText "Script Completed."
        crt.Sleep 2000
        crt.Session.SetStatusText ""
        
        ' Close the entire application?  You decide.
        ' crt.Quit
    End If
End Sub

'---------------------------------------------------------------------

----------
Function PromptYesNo(strText)
    PromptYesNo = crt.Dialog.MessageBox(strText, "SecureCRT", vbYesNo)
End Function

'---------------------------------------------------------------------

----------
Function DisplayMessage(strText)
    crt.Dialog.MessageBox strText
End Function

'---------------------------------------------------------------------

----------
Function GetPlainTextInput(strPrompt, strTitle, strDefaultValue)
    GetPlainTextInput = _
        crt.Dialog.Prompt(strPrompt, strTitle, strDefaultValue)
End Function

'---------------------------------------------------------------------

----------
Function GetPasswordInput(strPrompt, strTitle, strDefaultValue)
    GetPasswordInput = _
        crt.Dialog.Prompt(strPrompt, strTitle, strDefaultValue, True)
End Function

Open in new window

0
 
LVL 52

Expert Comment

by:Scott Fell, EE MVE
ID: 39266565
What I meant was not giving me all the code.  If things are not needed for this, instead of commenting them out, remove them completely so it is easier to get right to the question.

If I have answered the initial question, "Can someone please help determine why I get the error message show in the attachment for the following script:" which is the error on line 114 that pertains to not starting out your case statement with "Select Case" then you should close out this question. I don't answer multiple question in the same thread or it never ends...

If you don't have any coding experience and you want to work with what could be complex coding, I would suggest trying to learn.

http://www.w3schools.com/vbscript/default.asp
http://www.codecademy.com/
https://www.khanacademy.org/cs
http://codehs.com/

Otherwise, hire somebody.  

The idea here is to help you with pieces of your code you are having trouble with and if you can't identify what you are having issues with because you are just copy and pasting code from somewhere else and then asking us to debug everything I think is too much.  In that case you should hire somebody to do this for you.
0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 

Author Comment

by:cpatte7372
ID: 39267665
Padas,

No need to be rude.
0
 
LVL 52

Accepted Solution

by:
Scott Fell,  EE MVE earned 500 total points
ID: 39268120
I'm sorry you take it that way. I am trying to help you with honesty.  Part of getting a great answer is formatting a great question.   Sometimes that is part of what we have to do here, help you format your question to what you really mean and not what you asked.  However, I don't think my suggestions are getting through.

1) Your original question about line 114 in your original code.  Is that fixed with my suggestion?  Apparently that part is because I saw it updated on your 2nd code posted.  This means you should close out this question.  If there are more problems, work on them one at a time.  

2) Did you try breaking out your case statements as I suggested? Instead of
Case 1,2
You would use
Case 1
  ' some code
Case 2
 ' Some Code


3) I suggested that you make sure your variables you are testing for are numeric and not alpha-numeric.  Did you try that as well?

4) It is hard to help somebody that is copy and pasting code and not trying to understand what they are doing.  The first site I gave you is what I used to use heavily many years ago as a guide, the 2nd site I have started to use to learn new languages and just recently found the last 2 and will be using those as well.   A few hours spent on w3schools.com learning vbscript will save you 10 fold right away in frustration working on your project.
0
 

Author Comment

by:cpatte7372
ID: 39268315
Padas,

I've just been having bad day - you weren't being rude at all.

Thanks for sticking with me with this....
0
 
LVL 52

Expert Comment

by:Scott Fell, EE MVE
ID: 39268358
No worries.

Your next step is to close out this question since it is answered.  Then try the other suggestions I mentioned with your Case Statements.  Run your code, create a NEW question with any other issues.

If you have other issues, post your code you used.  Hit the Preview button to see the line numbers created.  Let us know the line number of the error (not the line number of your original code, the line number of your snippet).

My gut feeling is this will correct the errors for the Select Case, but the next potential problem is "Select Case objNewTab.Screen.MatchIndex" and making sure there is data for objNewTab.  Hopefully not.  

I primarily work with vbscript for web, not for shell scripting as I work on a mac so I can't test any of this.  

Don't forget to close out your other questions as well as this one....
0
 

Author Comment

by:cpatte7372
ID: 39268367
Padas,

Do you think you could look at my other question relating to vbscript?

Cheers
0
 
LVL 52

Expert Comment

by:Scott Fell, EE MVE
ID: 39268380
How about closing this question out!
0
 

Author Closing Comment

by:cpatte7372
ID: 39268393
Cheers mate.
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Suggested Solutions

In the world of WAN, QoS is a pretty important topic for most, if not all, networks. Some WAN technologies have QoS mechanisms built in, but others, such as some L2 WAN's, don't have QoS control in the provider cloud.
Shadow IT is coming out of the shadows as more businesses are choosing cloud-based applications. It is now a multi-cloud world for most organizations. Simultaneously, most businesses have yet to consolidate with one cloud provider or define an offic…
After creating this article (http://www.experts-exchange.com/articles/23699/Setup-Mikrotik-routers-with-OSPF.html), I decided to make a video (no audio) to show you how to configure the routers and run some trace routes and pings between the 7 sites…
After creating this article (http://www.experts-exchange.com/articles/23699/Setup-Mikrotik-routers-with-OSPF.html), I decided to make a video (no audio) to show you how to configure the routers and run some trace routes and pings between the 7 sites…

760 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

18 Experts available now in Live!

Get 1:1 Help Now