Solved

Script to name computer with user input and add to AD

Posted on 2012-12-20
26
1,294 Views
Last Modified: 2014-02-28
Hi experts!

I have a zinger that will really show your skills!

I've found a lot of scripts online that can be used during a Bare Metal OS Deployment Task Sequence in SCCM that will prompt the user for the Computer Name.  I'm looking for something a little more robust.

Our Naming Convention for computers is <Location><Org><xWKx><4 numbers>

So for one Org (we'll call it Sales) that has 3 Workstations, they would be named:

LOCSALESXWKX0001
LOCSALESXWKX0002
LOCSALESXWKX0003
LOCSALESXWKX0004


> LOC is always the same.
> Org depends on the organization the machine belongs to.
> XWKX is always the same
> The 4 numbers are just the next available (Not already used) in Active Directory.

With me so far?  Ok, here's what I'm looking for:

I want a script to add to the Task sequence that will prompt the user for their Org only.

Then I want it to create the computer name by adding <LOC><User input for Org><xWKx><next available number in AD>

Oh, and once it has a name, can it add the computer to Active Directory?  (Ideally for this part, the OU it would be created in would also be dependant on the Org, but we can have an Imaging OU and just put them all in there to move them later)

Anything close to this would be a huge deal!

Thank you and I hope to see some ideas soon!
0
Comment
Question by:Irrylyn
  • 12
  • 10
  • 4
26 Comments
 
LVL 65

Expert Comment

by:RobSampson
ID: 38711946
Hi, I should be able to help you out with this logic, but not until the new year.  I'm not sure how to integrate it into a Task Sequence, but I'm sure I could organise the VBScript to work outside of that, and perhaps you could work to integrate it in.

One question, when you say the ending four numbers are not to be otherwise used in AD, do you mean the number as a whole, regardless of the department, or is the same number, but different departments, allowed?

Regards,

Rob.
0
 

Author Comment

by:Irrylyn
ID: 38713346
Same number allowed for different departments.

Can have

LOCSALESXWKX0001
LOCSALESXWKX0002
LOCSALESXWKX0003
LOCHRXWKX0001
LOCHRXWKX0002
LOCHRXWKX0003
etc

Thank you and enjoy your holidays
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 38742724
Hey, I was just thinking, since you're asking for the computer name, you're going to want to rename it before running the task sequence right?  A rename requires a reboot, so the script would need to be run outside of the task sequence I would think.

I wrote a script a while ago to do a similar thing, here (it's a very long thread, so scroll to the accepted answer):
http://www.experts-exchange.com/Programming/Languages/Q_23460761.html

Test that out first off, and we'll see if you need any modifications.

Regards,

Rob.
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 38742727
Also, from the follow-on post of that thread, you may want to change line 56 from this:
objShell.Run "shutdown -r -t 00", 1, False

to this
objShell.Run "wscript """ & WScript.ScriptFullName & """", 1, False

so that it renames and joins the domain without the reboot in between.

I just noticed though, this is "joining" the domain, rather than just "adding" the computer account....does that still work for you?

Rob.
0
 

Author Comment

by:Irrylyn
ID: 38745749
Sorry, was on vacay myself.

This will be used only for bare metal installations.  Naming them for the first time, so no reboot should be required.

All I need is for it to add the computer account to AD.  The Task Sequence within SCCM will join it to the domain during one of its tasks, after it installs the Operating System.

So the task sequence itself does the installation/configuration through a PXE boot.  I want to incorporate a script to automate the computer name creation from the user's input of which department they are in.  We have 10k+ computers.  Currently when departments get new machines, they have to bring them into the helpdesk to be imaged.  SCCM allows us to set up a sequence of tasks that will do this over the network so they don't have to bring them in.  Our only problem is that we need to automate the machine name and add it to AD so it can be joined to the domain when it's time for that task to run.

I hope you had refreshing holidays!
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 38746536
OK, so from what I know from the Task Sequence, it has a screen that allows the user to enter the full computer name that they want, and join the domain with that computer name.

If you want to use that GUI to do what you need, then I think we'll need to modify the HTA that is launched by the Task Sequence.  When I get back to work, I'll check out which HTA is run for that "enter computer name" part of the Task Sequence, and see if I can modify it.  If I can, then it would actually suit us as well, since we have a similar naming convention, so I could benefit from that too!

Rob.
0
 
LVL 65

Accepted Solution

by:
RobSampson earned 500 total points
ID: 38749829
Alright, here's a solution that I hope works for you. I have a modified version of this in my Task Sequence that works well.

First off, let me say that this may not be the best way to customise the task sequence to do this job, but it's the only way I know, since I'm not an MDT expert.

The solution I have developed involved modifying the script files on the deployment server, under the <DEPLOYMENTSHARE>\Scripts folder.

The first thing you need to do, and this critical, is back up your
DeployWiz_Definition_ENU.xml
and
DeployWiz_Validation.vbs
files that are situated in the Scripts folder of your deployment share.

Now, open
DeployWiz_Definition_ENU.xml
with a text editor, or your favorite code editor.

Locate the section that begins with
      <Pane id="ComputerName">

and find its end point at the first occurrence of
      </Pane>

Replace that entire section with this code:
	<Pane id="ComputerName">
		<Condition><![CDATA[UCase(Property("SkipComputerName"))<>"YES" and Property("DeploymentType")<>"REPLACE" and Property("DeploymentType")<>"UPGRADE" and Property("DeploymentType")<>"CUSTOM" and Property("DeploymentType") <> "StateRestore"]]></Condition>
		<Initialization><![CDATA[InitializeComputerName]]> </Initialization>
		<Body>
		<![CDATA[

    <H1>Configure the computer name.</H1>
    <span style="width: 95%;">

        <p><span class="Larger">Enter the <u class=larger>o</u>rganization for this computer:</span>
		<select id="OSDComputerOrganization" name=OSDComputerOrganization size=1 language=vbscript onpropertychange=ValidateComputerOrganization AccessKey=o>
			<option id="--select--" value="--select--"> -- Select -- </option>
			<option id="SALES" value="SALES">SALES</option>
			<option id="IT" value="IT">IT</option>
			<option id="MKTG" value="MKTG">MKTG</option>
			<option id="FINANCE" value="FINANCE">FINANCE</option>
		</select></p>

        <p><span class="Larger">Computer n<u class=larger>a</u>me:</span>
        <input type=text id="OSDComputerName" name=OSDComputerName size=15 language=vbscript onpropertychange=ValidateComputerName AccessKey=A /></p>

        <p>&nbsp;
          <label class=ErrMsg for=OSDComputerName>* Required (MISSING)</label>
          <label class=ErrMsg id=InvalidChar>Letters, Numbers & Dashes only!</label>
          <label class=ErrMsg id=TooLong>Maximum of 15 characters!</label>
        </p>

        <!--  Computer Description Format -->
        <!--

        <p>You can also give your computer a friendly description. Unlike the computer
        name, the computer description may contain spaces and other special characters. "Frank Kim's Test machine" and
        "E-Mail Server #23, Miami Regional Office, Rm. 2305." are examples of computer descriptions.</p>

        <p><span class="Larger">Computer <u class=larger>d</u>escription:</span><br/>
        <input type=text id="Description" name=ComputerDescription size=60 language=vbscript onpropertychange=ValidateComputerName AccessKey=d /></p>
        -->

    </span>
    
		]]>
		</Body>
		<Validation><![CDATA[ValidateComputerName]]></Validation>
	</Pane>

Open in new window


Now, within that code, find the options that are SALES, IT, MKTG, and FINANCE.

These can be changed to suit your available options.

Next, open
DeployWiz_Validation.vbs
with a text editor, or your favorite code editor.

Right down the bottom of that file, add this function:
	Function GenerateComputerName
		Dim strLocation, strWorkstation, strDomain, strAdminUser, strAdminPass, strLDAP_Server, sAutoComputerName, strComputerPrefix
		
' ** CONFIGURATION **
		strLocation = "LOC"
		strWorkstation = "XWKX"
		strDomain = "domain"
		strAdminUser = "username"
		strAdminPass = "password"
		strLDAP_Server = "maindc.domain.com"
' *******************
		
		sAutoComputerName = ""
		
		Dim strStart, objConnection, objCommand, objRecordset, boolFound, strQuery, strNewName
		strComputerPrefix = strLocation & OSDComputerOrganization.value & strWorkstation
		strStart = "0001"
	
		Const ADS_SECURE_AUTHENTICATION = &H1
		Const ADS_USE_ENCRYPTION = &H2
		Const ADS_CHASE_REFERRALS_EXTERNAL = &H40
		Const ADS_SERVER_BIND = &h200
	
		Set objConnection = CreateObject("ADODB.Connection")
		objConnection.Provider = "ADSDSOObject"
	
		' Authenticate ADODB Connection
		objConnection.Properties("User ID") = strDomain & "\" & strAdminUser
		objConnection.Properties("Password") = strAdminPass
		objConnection.Properties("ADSI Flag") = ADS_SERVER_BIND
	
		objConnection.Open "Active Directory Provider"
		Set objCommand = CreateObject("ADODB.Command")
		objCommand.ActiveConnection = objConnection
		objCommand.Properties("Page Size") = 1000
		objCommand.Properties("Timeout") = 600
		objCommand.Properties("Searchscope") = 2
		objCommand.Properties("Cache Results") = False
		objCommand.Properties("Chase Referrals") = ADS_CHASE_REFERRALS_EXTERNAL
		 
		' Create a simple LDAP Query for computer name
		boolFound = False
		While boolFound = False
			strQuery = "SELECT aDSPath FROM 'LDAP://" & strLDAP_Server & "' WHERE objectClass='Computer' AND Name='" & strComputerPrefix & strStart & "'"
			objCommand.CommandText = strQuery
			On Error Resume Next
			Set objRecordSet = objCommand.Execute
			If Err.Number <> 0 Then
				'WScript.Echo "Error " & Err.Number & VbCrLf & "Description: " & Err.Description & VbCrLf & "Query: " & strQuery
				Err.Clear
				On Error GoTo 0
				strNewName = ""
				boolFound = True
			Else
				On Error GoTo 0
				If Not objRecordSet.EOF Then
					strStart = CStr(CInt(strStart) + 1)
				Else
					boolFound = True
					strNewName = strComputerPrefix & strStart
				End If
			End If
		Wend
		 
		objConnection.Close
		 
		Set objRecordset = Nothing
		Set objCommand = Nothing
		Set objConnection = Nothing
		
		sAutoComputerName = strNewName

		OSDComputerName.value = sAutoComputerName
	End Function

Open in new window


Within that code, find the
' ** CONFIGURATION **

section.  You will need to modify these values:
            strLocation = "LOC"
            strWorkstation = "XWKX"
            strDomain = "domain"
            strAdminUser = "username"
            strAdminPass = "password"
            strLDAP_Server = "maindc.domain.com"

to suit your environment.

Note that you only need to specify credentials of a user that has read access, since you're only reading AD for the next available computer name, so if required, create such a user for this task and use the credentials here.

Then, if all went well, that should be it.  When you now boot your Task Sequence, on the Computer Name pane, you should have your drop down box, and as soon as you select one, the AD should query for the next number available.

Regards,

Rob.
0
 

Author Comment

by:Irrylyn
ID: 38751027
This is better than what I was hoping for, thank you.  I definately think I can work with it.  I do hope this ends up benefiting you as well for all of your hard work.

I wont be able to start testing this for a few weeks, as my project was halted due to some certificate issues, but once that is hashed out I will put this to work.

Thanks again.
0
 

Author Closing Comment

by:Irrylyn
ID: 38751032
Above and beyond.  Great solution and instructions.
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 38752849
OK great.  Please provide feedback here when you can so I know whether it worked out for you.

In my situation, I have modifed it so that it doesn't query AD (thus not requiring any credentials), but it determines whether the machine is a laptop or desktop, then it pulls the service tag (Dell machine) and prompts for the geographical location.  Then it appends that together like
<D or N><Service Tag><Location>

it works nicely.  Thanks for giving me the motivation to get that done!

Regards,

Rob.
0
 

Expert Comment

by:petrosyg
ID: 39865627
Rob,

I came accross this thread and would like to clarify something from you ....

I feel like I can use your solution in order to name my computers during deployrmrnt ...

I have a naming scheme  "ABC-DELLService TAG"  eg. ATL-df674rs
ABC -- location code and I have about 50 locations
Dell service Tag - I am able to query it out.

How can I utilize your solution above?
Scripting is not my strength ..
I am using task sequencer at the momment.

Thank you
Petros
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 39866170
Hi Petros, I'll see if I can help you.  Back up your DeployWiz_Definition_ENU.xml and DeployWiz_Validation.vbs files.

In DeployWiz_Definition_ENU.xml, locate the section that begins with
      <Pane id="ComputerName">

and find its end point at the first occurrence of
      </Pane>

Replace that section with this code:
		<Condition><![CDATA[UCase(Property("SkipComputerName"))<>"YES" and Property("DeploymentType")<>"REPLACE" and Property("DeploymentType")<>"UPGRADE" and Property("DeploymentType")<>"CUSTOM" and Property("DeploymentType") <> "StateRestore"]]></Condition>
		<Initialization><![CDATA[InitializeComputerName]]> </Initialization>
		<Body>
		<![CDATA[

    <H1>Configure the computer name.</H1>
    <span style="width: 95%;">

        <p><span class="Larger">Enter the <u class=larger>l</u>ocation for this computer:</span>
		<select id="OSDComputerLocation" name=OSDComputerLocation size=1 language=vbscript onpropertychange=ValidateComputerLocation AccessKey=l>
			<option id="--select--" value="--select--"> -- Select -- </option>
			<option id="ABC" value="ABC">ABC</option>
			<option id="DEF" value="DEF">DEF</option>
			<option id="GHI" value="GHI">GHI</option>
		</select></p>

        <p><span class="Larger">Computer n<u class=larger>a</u>me:</span>
        <input type=text id="OSDComputerName" name=OSDComputerName size=15 language=vbscript onpropertychange=ValidateComputerName AccessKey=A /></p>

        <p>&nbsp;
          <label class=ErrMsg for=OSDComputerName>* Required (MISSING)</label>
          <label class=ErrMsg id=InvalidChar>Letters, Numbers & Dashes only!</label>
          <label class=ErrMsg id=TooLong>Maximum of 15 characters!</label>
        </p>

        <!--  Computer Description Format -->
        <!--

        <p>You can also give your computer a friendly description. Unlike the computer
        name, the computer description may contain spaces and other special characters. "Frank Kim's Test machine" and
        "E-Mail Server #23, Miami Regional Office, Rm. 2305." are examples of computer descriptions.</p>

        <p><span class="Larger">Computer <u class=larger>d</u>escription:</span><br/>
        <input type=text id="Description" name=ComputerDescription size=60 language=vbscript onpropertychange=ValidateComputerName AccessKey=d /></p>
        -->

    </span>
    
		]]>
		</Body>
		<Validation><![CDATA[ValidateComputerName]]></Validation>

Open in new window


changing the OSDComputerName options as you need to, to add your 50 locations.

In DeployWiz_Validation.vbs, add this custom function:
'''''''''''''''''''''''''''''''''''''
'  Validate Computer Location : CUSTOM FUNCTION
'

Function ValidateComputerLocation

	' Check Warnings
	ParseAllWarningLabels


	If OSDComputerLocation.value = "--select--" then
		InvalidChar.style.display = "none"
		TooLong.style.display = "none"
		OSDComputerName.value = ""
		ValidateComputerLocation = False
		ButtonNext.disabled = true
	Else
		Dim strComputer, objWMIService, colBIOS, objBIOS, strServiceTag, bIsLaptop, bIsDesktop, bIsServer, sAutoComputerName, colEnclosure, objInstance
		strComputer="."
		Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
		Set colBIOS = objWMIService.ExecQuery("Select SerialNumber from Win32_Bios")
		For Each objBIOS In colBIOS
			strServiceTag = objBIOS.SerialNumber
		Next
		
		bIsLaptop = False
		bIsDesktop = False
		bIsServer = False
		sAutoComputerName = ""
		Set colEnclosure = objWMIService.ExecQuery("Select ChassisTypes from Win32_SystemEnclosure")
		For Each objInstance In colEnclosure
			If objInstance.ChassisTypes(0) = 12 Or objInstance.ChassisTypes(0) = 21 then
				' Ignore docking stations
			Else
				Select Case objInstance.ChassisTypes(0)
					Case "8", "9", "10", "11", "12", "14", "18", "21"
						bIsLaptop = true
					Case "3", "4", "5", "6", "7", "15", "16"
						bIsDesktop = true
					Case "23"
						bIsServer = true
					Case Else
						' Do nothing
				End Select
			End If
		Next
		
		'If bIsLaptop = True Then
		'	sAutoComputerName = "N" & OSDComputerLocation.value & strServiceTag
		'ElseIf bIsDesktop = True Then
		'	sAutoComputerName = "D" & OSDComputerLocation.value & strServiceTag
		'ElseIf bIsServer = True Then
		'	sAutoComputerName = "S" & OSDComputerLocation.value & strServiceTag
		'End If
		sAutoComputerName = OSDComputerLocation.value & "-" & strServiceTag
		OSDComputerName.value = sAutoComputerName

		oEnvironment.Item("OSDComputerName") = OSDComputerName.Value
		
		ValidateComputerLocation = True
		InvalidChar.style.display = "none"
		TooLong.style.display = "none"
	End If

End Function

Open in new window


and that should do it for the deployment HTA.  You will notice that the code above has the the chassis type in it, but that's not used for your version.

Regards,

Rob.
0
 

Expert Comment

by:petrosyg
ID: 39867505
Rob,

Thank you very much for your quick response .. let me go through it quickly and I will get back to you ... I am sure I will have a follow up question or two...

Petros
0
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 

Expert Comment

by:petrosyg
ID: 39867665
Rob,

Ok .. just to give you a little background, this is an SCCM 2012 R2 - currently we deploy 2 images x32 and x64. I am attaching a task squencer as an example. Also Our boot image is MDT with Command prompt.
IN my ALL unknown device collection is where I have a variable "OSDComputerName" and it prompst me to enter teh computer name.
We are moving from Zenworks to SCCM and we still in testing mode.


I know where to put the first Script, (I am not sure if I need to edit anything else but I will find out ... I already made a copy of that file as a backup)

The HTA, I am not that familiar with.
deploy---unknown-computer-Captur.JPG
Deploy-task-seq-1Capture.JPG
Deploy-task-seq-2Capture.JPG
Deploy-task-seq-3Capture.JPG
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 39867702
So when it prompts you for the computer name, are you referring to the step for approving computers before the deployment begins to run? Or is it during a screen in the task sequence selection in WinPE?
0
 

Expert Comment

by:petrosyg
ID: 39867718
I believe you are correct, it prompts me before the deployement begins to run.
0
 

Expert Comment

by:petrosyg
ID: 39867738
It is a Task Seq Wiz .... Edit Task Sequence Variable ... Select the Task Variable to Edit...
0
 

Expert Comment

by:petrosyg
ID: 39867789
Here is a screen shot
photo--5-.JPG
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 39872388
I only use MDT so I can't see the full features of SCCM you are using.  If you remove the OSDComputerName variable from the Unknown Computers properties, and run the Task Sequence, does it prompt you for a computer name?  From what I can tell, it may not, and just call a machine MININT-XXXX

That's OK, and you should then be able to use the approach here:
http://t3chn1ck.wordpress.com/2009/04/24/script-to-prompt-for-system-name-in-sccm-osd/

But instead of that script, you can use this to prompt for the prefix (of your location) and it will automatically add the dash and the service tag.

Rob.

		Dim strComputer, objWMIService, colBIOS, objBIOS, strServiceTag
		strComputer="."
		Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
		Set colBIOS = objWMIService.ExecQuery("Select SerialNumber from Win32_Bios")
		For Each objBIOS In colBIOS
			strServiceTag = objBIOS.SerialNumber
		Next

Dim sNewComputerName, oTaskSequence, sTSMachineName, bPromptName
Set oTaskSequence = CreateObject ("Microsoft.SMS.TSEnvironment")
 
' Get the name the computer is set to receive and truncate to first 6 letters
sTSMachineName = lcase(oTaskSequence("_SMSTSMachineName"))
If left(sTSMachineName,6) = "minint" Then
   bPromptName = True
ElseIf sTSMachineName = "minwinpc" Then
   bPromptName = True
Else
   bPromptName = False
End If
 
' Note: The wscript.echo commands are logged in SMSTS.log for troubleshooting.  They are not displayed to the end user.
If bPromptName = True Then
   wscript.echo "Detected that the computer name is scheduled to receive a random value.  Prompting user to input a standard name."
   sNewComputerName = InputBox ("Please enter a location to continue." & vbCrLf & _
   "The name will be set to XXXX-" & strServiceTag & vbCrLf & _
   "where XXXX is the location you enter.", "Computer Location", , 30,30)
   oTaskSequence("OSDComputerName") = UCase(sNewComputerName & "-" & strServiceTag)
   wscript.echo "Set Task Sequence variable OSDComputerName to: " & sNewComputerName & "-" & strServiceTag
Else
   wscript.echo "Computer set to receive a standard name, continuing as is."
End If

Open in new window

0
 

Expert Comment

by:petrosyg
ID: 39872416
Thank you so much Rob, I will test it shortly and report back.
Again, thank you for the help.
Petros
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 39872421
No problem. If you still have issues, could you open a new question and post its link here? That way, I'll take a look, but your also more likely to have SCCM experts have a look too.
0
 

Expert Comment

by:petrosyg
ID: 39872435
Ok. I will do that. Also, should I keep the previous changes? The changes I made to the Deploywiz_validation files?
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 39872534
No, you wouldn't need either of those files changed, since we're not using that page of the task sequence with your requirements.
0
 

Expert Comment

by:petrosyg
ID: 39876792
Rob,

Thank you that did it .... You are very helpfull and thank you for going out of your way to help me.
I am going to get few things done and hopefully revisit this process again and hopefully one day I will be able to accomplish the location selection from a script as well (a drop down selection of location code).

I will probably open a new question and I will provide you the link if you want to followup.

Again, Thank you for all your efforts

Petros
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 39877945
Excellent. Good to hear.

Rob.
0
 

Expert Comment

by:petrosyg
ID: 39894881
Rob,

Will you look at the following link and  see if you have a suggestion.
http://www.experts-exchange.com/Software/Server_Software/Q_28377074.html

I have about 50 Apps to package and I have few web links with a shortcut placed in the desktop and the start menu.

In Zen works there are so many controls available that made the packaging a lot easier, So far , in SCCM, msi or Exe have been fine but simple scripts dealing with shortcuts and Icons etc.  has been a pain.(at least to me)

Thank you
Petros
0

Featured Post

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
how to add field in my script 2 24
Messed up my code 6 21
Image decoding from Camera 3 48
How to make an ADE file by code? 11 42
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
Email signature management is something that is often overlooked in many organizations or is simply not implemented effectively. Let's take a look at what methods are available for managing this important piece of corporate branding.
An introduction to basic programming syntax in Java by creating a simple program. Viewers can follow the tutorial as they create their first class in Java. Definitions and explanations about each element are given to help prepare viewers for future …
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …

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