Solved

powershell find groups with full access

Posted on 2014-09-17
29
388 Views
Last Modified: 2014-09-24
I am working on a script and having problems. What I am trying to do is by each OU is upgrade each group from 2003 to exchange 2013 and then find all members with full access and add them as an owner/managedby in 2013.


get-distributiongroup -organizationalunit "com.microsoft/clients/users/marketing" | get-adpermission | where { ($_.accessrights -match 'write' ) -or ($_.AccessRights -eq 'GenericAll')

I am not sure on how to do the rest if I can get some assistance please
0
Comment
Question by:techdrive
  • 16
  • 9
  • 4
29 Comments
 
LVL 12

Expert Comment

by:David Paris Vicente
ID: 40329394
Hi,

This -organizationalunit "com.microsoft/clients/users/marketing" is wrong.

get-distributiongroup -organizationalunit "OU=Marketing,OU=Users,DC=Microsoft,DC=com" | get-adpermission | where { ($_.accessrights -eq 'writeproperty' )|Select User or ($_.AccessRights -eq 'GenericAll')|Select User

Let us know if helped.
0
 

Author Comment

by:techdrive
ID: 40329400
Thanks for responding but what about placing those full control users in managedby or owner access to those same groups that they are full control members of.
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40329561
Per the Help:  Get-Help Set-DistributionGroup -Parameter ManagedBy
-ManagedBy <MultiValuedProperty>
    The ManagedBy parameter specifies the name of the mailbox recipient that appears on the Managed by tab of the
    Active Directory object. If this parameter isn't specified, the creator of the group is the owner.

    This parameter accepts the following values:

    * Example: JPhillips
    * Example: Atlanta.Corp.Contoso.Com/Users/JPhillips
    * Example: Jeff Phillips
    * Example: CN=JPhillips,CN=Users,DC=Atlanta,DC=Corp,DC=contoso,DC=com
    * Example: Atlanta\JPhillips
    * Example: fb456636-fe7d-4d58-9d15-5af57d0354c2
    * Example: fb456636-fe7d-4d58-9d15-5af57d0354c2@contoso.com
    * Example: /o=Contoso/ou=AdministrativeGroup/cn=Recipients/cn=JPhillips
    * Example: Jeff.Phillips@contoso.com
    * Example: JPhillips@contoso.com
    The recipients specified with the ManagedBy parameter aren't automatically members of the distribution group. If
    you want recipients specified in this parameter to be added as members of the distribution group, you need to add
    them as members.

    Required?                    false
    Position?                    Named
    Default value
    Accept pipeline input?       False
    Accept wildcard characters?  false

Open in new window


Get the list of users that you want to add and place that into an list (array).  You can then call Set-DistributionGroup using the ManagedBy parameter to set the list of users
Note the Select -ExpandProperty User, as this will return the raw list (array) of values, and a NOT an array of objects with a single property of User and the data as each value

$UserList = Get-DistributionGroup -OrganizationalUnit "OU=Marketing,OU=Users,DC=Microsoft,DC=com" | Get-ADPermission | Where { ($_.AccessRights -eq 'GenericAll') } | Select -ExpandProperty User

Set-DistributionGroup -OrganizationalIUnit "OU=Marketing,OU=Users,DC=Microsoft,DC=com" -ManagedBy $UserList

Open in new window


If you create the $UserList first, you can play with the Get-* and the Where * filter to make sure you have what you are looking for.  You will also be able to log the list you are setting, which is good practice.
0
 

Author Comment

by:techdrive
ID: 40329616
I think I might need to delete this question and start over. I should have said groups with full control not users.
0
 
LVL 12

Expert Comment

by:David Paris Vicente
ID: 40329960
Can you explain in  more detail what do you want to accomplish?

What is the 2003 and 2013?

I you are migrating your Exchange in 2003 to 2013, you cannot do it directly, you will need to install at least Exchange 2007 or 2010 before install Exchange 2013.
0
 

Author Comment

by:techdrive
ID: 40330862
I am trying to upgrade the owners. I at least wanted to test but cannot get this command to run

$owners = Get-ADPermission " "OU=Marketing,OU=Users,DC=Microsoft,DC=com" | ?{$_.User -notlike "*Exchange*" -and $_.User -notlike "S-*" -and $_.User -notlike "*Organization*" -and $_.User -notlike "NT*" -and $_.User -notlike "*Domain Admins*" -and $_.User -notlike "*Enterprise Admins" -and $_.User -notlike "BUILTIN*” -and $_.User –notlike "*Delegated Setup*”} | $owners

I am getting this error message

At line:1 char:393
+ ... ted Setup*"} | $owners
+                    ~~~~~~~
Expressions are only allowed as the first element of a pipeline.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpressionsMustBeFirstInPipeline
0
 

Author Comment

by:techdrive
ID: 40330878
I also ran this command to upgrade the groups in one OU and none were upgraded

ForEach ($DL in (Get-DistributionGroup -organizationalunit "OU=Marketing,OU=Users,DC=Microsoft,DC=com")) { $owners = Get-ADPermission $DL.identity | ?{$_.User -notlike "*Exchange*" -and $_.U
ser -notlike "S-*" -and $_.User -notlike "*Organization*" -and $_.User -notlike "NT*" -and $_.User -notlike "*Domain Adm
ins*" -and $_.User -notlike "*Enterprise Admins" -and $_.User -notlike "BUILTIN*" -and $_.User -notlike "*Delegated Setu
p*"}  | %{$_.user.tostring()};Set-DistributionGroup $DL -BypassSecurityGroupManagerCheck -ManagedBy $owners -forceupgrad
e }
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40331168
Your code is not making sense, Thus the error...

$owners = Get-ADPermission " "OU=Marketing,OU=Users,DC=Microsoft,DC=com" | `
 ?{$_.User -notlike "*Exchange*" -and $_.User -notlike "S-*" -and $_.User -notlike "*Organization*" -and $_.User -notlike "NT*" -and $_.User -notlike "*Domain Admins*" -and $_.User -notlike "*Enterprise Admins" -and $_.User -notlike "BUILTIN*” -and $_.User –notlike "*Delegated Setup*”} | `
$owners

Open in new window


Get AD permisssions of an identified distribution group
then pass that to a where filter (?) and filter out a bunch of -notlikes
then pass that to a $owners variable
and finally assign all this to a $owners variable

Like I said in my previous comment.  Build a list of a particular group group1 (Get-* and Where-*). assign the list to a variable ($owners), this must only be the list. Work through this until you have just a list of names, or identities.  You should be able to simply type the name of the variable $owners and get a list of names, without any property names.

PS C:\> $owners
test@mydoamin.com
user5@mydomain.com
MyOtherDomain\Group7
/o=Contoso/ou=AdministrativeGroup/cn=Recipients/cn=JPhillips

Open in new window


Once you have that, as a seperate command, call Set-DistributionGroup with the single group1 identity and use -ManagedBy $owners

Once you get that to apply, then you can move to a foreach and wrap it all up in braces, and let it do a bunch.


It might also help you to in understanding whats happening by working backwards.

Set-DistributionGroup -Identity Group1 -ManagedBy "test@me.com"

Open in new window


Check who  is managing Group1  (Test@me.com)

Set-DistributionGroup -Identity Group1 -ManagedBy "worker@me.com"

Open in new window


if you check who is managing Group1 -  (worker@me.com)  NOT test@me.com

Set-DistributionGroup -Identity Group1 -ManagedBy @("test@me.com","worker@me.com")

Open in new window


Checking who is managing Group1 should now show the true objective  - (Both users)

So this means that you need to build the list of users, then assign the list to the group.
0
 

Author Comment

by:techdrive
ID: 40331490
get-distributiongroup -organizationalunit "microsoft.com/chicago/users" | get-adpermission |
where { $_.AccessRights -match 'GenericAll' -and $_.user -notlike '*exchange*' -and $_.user -notlike '*system*' -and $_.
user -notlike 's-1*' -and $_.user -notlike '*universal*' -and $_.user -notlike '*domain admins*' -and $_.user -notlike "
*enterprise admins*"  -and $_.user -notlike '*organization*' -and $_.user -notlike '*self*' -and $_.user -notlike '*admi
nistrators*' }  

ok so I finally got my filter completed and working. How do I pass this to the managedby attribute and populate this value.

I did something like this below and it displayed the group name in identity along with the user.

$managedby=get-distributiongroup -organizationalunit "microsoft.com/chicago/users" | get-adpermission |
where { $_.AccessRights -match 'GenericAll' -and $_.user -notlike '*exchange*' -and $_.user -notlike '*system*' -and $_.
user -notlike 's-1*' -and $_.user -notlike '*universal*' -and $_.user -notlike '*domain admins*' -and $_.user -notlike "
*enterprise admins*"  -and $_.user -notlike '*organization*' -and $_.user -notlike '*self*' -and $_.user -notlike '*admi
nistrators*' }  

$managedby
this provided a list of all the users who had full control with the users and groups.
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40331529
Wierd:  Now that I'm able work and can play with it..  It looks like Exchange has special user object.

Here is an exmaple:

[PS] C:\>Get-DistributionGroup -Identity MyGroup1 | Get-ADPermission | ? { $_.Accessrights -eq 'Genericall' }

Identity             User                 Deny  Inherited
--------             ----                 ----  ---------
myDomain.com/Ente... NT AUTHORITY\SYSTEM  False False
myDomain.com/Ente... S-1-5-32-548         False False
myDomain.com/Ente... MyDomain\Domain A... False False
myDomain.com/Ente... MyDomain\Domain A... False True

Open in new window


You just need the User field

[PS] C:\>Get-DistributionGroup -Identity MyGroup1 | Get-ADPermission | ? { $_.Accessrights -eq 'Genericall' } | Select -ExpandProperty user

SecurityIdentifier                                          RawIdentity
------------------                                          -----------
S-1-5-18                                                    NT AUTHORITY\SYSTEM
S-1-5-32-548                                                S-1-5-32-548
S-1-5-21-2556196122-1687407544-1462345251-512               MyDomain\Domain Admins
S-1-5-21-2556196122-1687407544-1462355251-512               MyDomain\Domain Admins

[PS] C:\>Get-DistributionGroup -Identity zss | Get-ADPermission | ? { $_.Accessrights -eq 'Genericall' } | Select -ExpandProperty user | Select -ExpandProperty Rawidentity
NT AUTHORITY\SYSTEM
S-1-5-32-548
MyDomain\Domain Admins
MyDomain\Domain Admins
S-1-5-21-2556196122-1682347544-1447115231-53665
MyDomain\TheAdmins
[PS] C:\>

Open in new window


Play close attention to the (2) Select -ExpandProperty commands at the end of the last example
0
 

Author Comment

by:techdrive
ID: 40331537
but that still does not show me how to assign this to the managedby.
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40331742
[PS] C:\>$Mylist = Get-DistributionGroup -Identity zss | Get-ADPermission | ? { $_.Accessrights -eq 'Genericall' } | Select -ExpandProperty user | Select -ExpandProperty Rawidentity
[PS] C:\>Set-DistributionGroup -identity zss -ManagedBy $mylist

Open in new window

0
 

Author Comment

by:techdrive
ID: 40331796
Cannot process argument transformation on parameter 'ManagedBy'. Cannot convert value
"Microsoft.Exchange.Management.RecipientTasks.ADAcePresentationObject
Microsoft.Exchange.Management.RecipientTasks.ADAcePresentationObject" to type
"Microsoft.Exchange.Data.MultiValuedProperty`1[Microsoft.Exchange.Configuration.Tasks.GeneralRecipientIdParameter]".
Error: "Cannot convert the "Microsoft.Exchange.Management.RecipientTasks.ADAcePresentationObject" value of type
"Microsoft.Exchange.Management.RecipientTasks.ADAcePresentationObject" to type
"Microsoft.Exchange.Configuration.Tasks.GeneralRecipientIdParameter"."
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40331822
If you ran the command I gave above, then you would not get that error.  

Show the whole set of commands you are running,  copy and paste from the console.

Type CLS before you copy and paste...  (CLS = Clear-Screen)
Then run the commands...

Then Paste in here, and use the CODE markers to make it easier to read
0
6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

 

Author Comment

by:techdrive
ID: 40331887
Phil Thanks for your help but I am just going to wait on the other guys. Thanks for your help though.
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40332384
I'm sorry to hear that.  My attempt was to try and show you how to attain your goal this way you understand what's happeneing.

If you're looking for some code that you can simply copy and paste, with out understanding what's happening and why each step was taken.

Here.

$OUName = "microsoft.com/chicago/users" 
$GroupsInOU = get-distributiongroup -organizationalunit $OUName
foreach ($EachGroup in $GroupsInOU) {
    $ManagedbyList4Group = $EachGroup | get-adpermission | `
        where { $_.AccessRights -match 'GenericAll' `
                    -and $_.user -notlike '*exchange*' `
                    -and $_.user -notlike '*system*' `
                    -and $_.user -notlike 's-1*' `
                    -and $_.user -notlike '*universal*' `
                    -and $_.user -notlike '*domain admins*' `
                    -and $_.user -notlike "*enterprise admins*" `
                    -and $_.user -notlike '*organization*' `
                    -and $_.user -notlike '*self*' `
                    -and $_.user -notlike '*administrators*' } | `
        Select -ExpandProperty User | `
        Select -ExpandProperty RawIdentity
    Set-DistributedGroup -Identity $EachGroup -ManagedBy $ManagedbyList4Group
}

Open in new window

0
 

Author Comment

by:techdrive
ID: 40333090
under normal circumstances I would love a lesson but kind of press now for a deadline. I really appreciate your help.
0
 

Author Comment

by:techdrive
ID: 40333128
I made two corrections as it would not originally run but can you explain what rawidentity near the select expandproperty does. For some reason this script only works for distribution/security groups that I personally created. This does not work for groups that I did not create.

[$OUName = "microsoft.com/chicago/users"
$GroupsInOU = get-distributiongroup -organizationalunit $OUName
foreach ($EachGroup in $GroupsInOU) {
    $ManagedbyList4Group = $EachGroup | get-adpermission | `
        where { $_.AccessRights -match 'GenericAll' `
                    -and $_.user -notlike '*exchange*' `
                    -and $_.user -notlike '*system*' `
                    -and $_.user -notlike 's-1*' `
                    -and $_.user -notlike '*universal*' `
                    -and $_.user -notlike '*domain admins*' `
                    -and $_.user -notlike "*enterprise admins*" `
                    -and $_.user -notlike '*organization*' `
                    -and $_.user -notlike '*self*' `
                    -and $_.user -notlike '*administrators*' } | `
        Select -ExpandProperty User | `
        Select -ExpandProperty RawIdentity
    Set-Distributiongroup -Identity $EachGroup -ManagedBy $ManagedbyList4Group
}]
0
 
LVL 3

Accepted Solution

by:
Phil Bossman earned 500 total points
ID: 40333287
The RawIdentity is needed because of what Get-ADPermission is returning.  The User field is not a string.  You can see this (from above) when I selected just the User field.

SecurityIdentifier                                          RawIdentity
------------------                                          -----------
S-1-5-18                                                    NT AUTHORITY\SYSTEM
S-1-5-32-548                                                S-1-5-32-548
S-1-5-21-2556196122-1687407544-1462345251-512               MyDomain\Domain Admins
S-1-5-21-2556196122-1687407544-1462355251-512               MyDomain\Domain Admins

Open in new window


So you need another select to get the details of the user.  I chose RawIdentity because it's easier to read.  But I could have just as well chosen to select the SecurityIdentifier, because the -Managedby property accepts a multi-valued list of SIDs too.

As far as, only returning groups you've created, that sounds like a permissions issue within your environment.

I'm not sure if the problem is in you getting the groups, getting the AD permissions on each group, or setting the permissions on each group
[$OUName = "microsoft.com/chicago/users"
$GroupsInOU = get-distributiongroup -organizationalunit $OUName
$GroupsInOU.Count()

This will tell you how many groups you are getting back.  If this number is correct (all groups, both what you created and others) then the problem could be that you don't have permissions to Get-ADPermissions on the individual groups.


$GroupNameYouDidn'tcreate = "Group Name"
$SingleGroup = get-distributiongroup -Identity $GroupNameYouDidn'tcreate | Get-ADPermissions
@($SingleGroup).Count

This will tell you if you are returning a list of AD permissions.  If this shows anything other then zero, then the problem must be in the Set-DistributionGroup

You could also add a few Verbose flags to see if that tells you more about why you're not getting the results you need.

$OUName = "microsoft.com/chicago/users" 
$GroupsInOU = get-distributiongroup -organizationalunit $OUName -Verbose
Write-Verbose "$($GroupsInOU.Count) groups returned" -Verbose
foreach ($EachGroup in $GroupsInOU) {
    Write-Verbose "Processing $($EachGroup.Name)" -Verbose
    $ManagedbyList4Group = $EachGroup | get-adpermission -Verbose | `
        where { $_.AccessRights -match 'GenericAll' `
                    -and $_.user -notlike '*exchange*' `
                    -and $_.user -notlike '*system*' `
                    -and $_.user -notlike 's-1*' `
                    -and $_.user -notlike '*universal*' `
                    -and $_.user -notlike '*domain admins*' `
                    -and $_.user -notlike "*enterprise admins*" `
                    -and $_.user -notlike '*organization*' `
                    -and $_.user -notlike '*self*' `
                    -and $_.user -notlike '*administrators*' } | `
        Select -ExpandProperty User | `
        Select -ExpandProperty RawIdentity
    Write-Verbose "Setting $($ManagedbyList4Group.Count) users to group" -Verbose
    Set-Distributiongroup -Identity $EachGroup -ManagedBy $ManagedbyList4Group -Verbose
}

Open in new window

0
 

Author Comment

by:techdrive
ID: 40333296
thank you for the explanation sir.
0
 

Author Comment

by:techdrive
ID: 40339021
works great but one more small question and thank you thank you again. I am trying to get this to run from a file rather than an OU. Please help/.


$OUName = "c:\temp\distlist.csv"
foreach ($ouname in $ounames) {
$GroupsInOU = get-distributiongroup -id $OUName -Verbose
Write-Verbose "$($GroupsInOU.Count) groups returned" -Verbose
foreach ($EachGroup in $GroupsInOU) {
    Write-Verbose "Processing $($EachGroup.Name)" -Verbose
    $ManagedbyList4Group = $EachGroup | get-adpermission -Verbose | `
        where { $_.AccessRights -match 'GenericAll' `
                    -and $_.user -notlike '*exchange*' `
                    -and $_.user -notlike '*system*' `
                    -and $_.user -notlike 's-1*' `
                    -and $_.user -notlike '*universal*' `
                    -and $_.user -notlike '*domain admins*' `
                    -and $_.user -notlike "*enterprise admins*" `
                    -and $_.user -notlike '*organization*' `
                    -and $_.user -notlike '*self*' `
                    -and $_.user -notlike '*administrators*' } | `
        Select -ExpandProperty User | `
        Select -ExpandProperty RawIdentity
    Write-Verbose "Setting $($ManagedbyList4Group.Count) users to group" -Verbose
#    Set-Distributiongroup -Identity $EachGroup -ManagedBy $ManagedbyList4Group -Verbose
}
0
 
LVL 12

Expert Comment

by:David Paris Vicente
ID: 40339070
$OUName = import-CSV "c:\temp\distlist.csv"
0
 

Author Comment

by:techdrive
ID: 40339162
I added this $OUName = "import-csv c:\temp\distlist.csv" and now no output.
0
 
LVL 12

Expert Comment

by:David Paris Vicente
ID: 40339226
The quotes must be :
$OUName = import-csv "c:\temp\distlist.csv"

And not
$OUName = "import-csv c:\temp\distlist.csv"

You also had to change the variable name to $OUNAMES.

So it will be like this:
$ounames = import-csv "c:\temp\distlist.csv"
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40339424
What are the contents of c:\temp\distlist.csv  This would impact what you are doing.  Is the file a true CSV or just a simple list.

If distlist.csv is a real comma seperated list, then you need to define which field (column) the OU data is in.

Does the files look like this?
"OUPath","OU Name","Area"
"microsoft.com/chicago/users","Chicago","Active"
"microsoft.com/miami/users","Miami","Disabled"
"microsoft.com/New York/users","New York","Active"

Open in new window

Then it should read
$ounames = import-csv "c:\temp\distlist.csv" | Select -ExpandProperty OUPath

If distlist.csv is truly just a list of names.
Or does the file look like this??
microsoft.com/chicago/users
microsoft.com/miami/users
microsoft.com/new york/users

Open in new window


Then you need to pull in the contents and assign it to $OUNames

$ounames = get-content "C:\Temp\distlist.csv"
0
 

Author Comment

by:techdrive
ID: 40339478
I am only picking up either aliases or displaynames.


ONE DISTRIBUTION GROUP
TWO DISTRIBUTION GROUP
THREE DISTRIBUTION GROUP


OR

one.distribution.group
two.distribution.group
three.distribution.group
0
 
LVL 3

Expert Comment

by:Phil Bossman
ID: 40339505
So the contents of the file is just a simple list....

Then the line should read...

$ounames = get-content "C:\Temp\distlist.csv"
...which will create an array of names, then the foreach will loop over each item in the array. with the full contents of each line inside the $OUName variable.

Example:
$GroupsInOU = get-distributiongroup -id "ONE DISTRIBUTION GROUP" -Verbose
or
$GroupsInOU = get-distributiongroup -id "two.distribution.group" -Verbose

I note this because each line of the file must be valid for passing to the Get-DistributionGroup cmdlet
0
 

Author Comment

by:techdrive
ID: 40339692
These are security groups I am applying this to does it matter because the script processes and then I never see the group populate as an owner to these groups. Using exchange 2013.


$OUName = get-content "c:\temp\distlist.csv"
foreach ($ounames in $ouname) {
$GroupsInOU = get-distributiongroup -id $OUNames -Verbose
Write-Verbose "$($GroupsInOU.Count) groups returned" -Verbose
foreach ($EachGroup in $GroupsInOU) {
  Write-Verbose "Processing $($EachGroup.Name)" -Verbose
    $ManagedbyList4Group = $EachGroup | get-adpermission -Verbose | `
        where { $_.AccessRights -match 'GenericAll' `
                    -and $_.user -notlike '*exchange*' `
                    -and $_.user -notlike '*system*' `
                    -and $_.user -notlike 's-1*' `
                    -and $_.user -notlike '*universal*' `
                    -and $_.user -notlike '*domain admins*' `
                    -and $_.user -notlike "*enterprise admins*" `
                    -and $_.user -notlike '*organization*' `
                    -and $_.user -notlike '*self*' `
                    -and $_.user -notlike '*administrators*' } | `
        Select -ExpandProperty User | `
        Select -ExpandProperty RawIdentity
   Write-Verbose "Setting $($ManagedbyList4Group.Count) users to group" -Verbose  
Set-Distributiongroup -Identity $EachGroup -ManagedBy $ManagedbyList4Group  -BypassSecurityGroupManagerCheck -Verbose

}
}

Open in new window

0
 

Author Comment

by:techdrive
ID: 40342548
thanks for all you guys help. I finally figured it out and thanks the script did a lot of work and help
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

Exchange server is not supported in any cloud-hosted platform (other than Azure with Azure Premium Storage).
This article explains how to prepare an HTML email signature template file containing dynamic placeholders for users' Azure AD data. Furthermore, it explains how to use this file to remotely set up a department-wide email signature policy in Office …
In this video we show how to create a Distribution Group in Exchange 2013. We show this process by using the Exchange Admin Center. Log into Exchange Admin Center.: First we need to log into the Exchange Admin Center. Navigate to the Recipients >>…
In this video we show how to create an Address List in Exchange 2013. We show this process by using the Exchange Admin Center. Log into Exchange Admin Center.: First we need to log into the Exchange Admin Center. Navigate to the Organization >> Ad…

757 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

21 Experts available now in Live!

Get 1:1 Help Now