Home > Software engineering >  Powershell variable issue Get-Content and Get-ADGroup
Powershell variable issue Get-Content and Get-ADGroup

Time:11-23

I'm trying to figure out the reason why I can run the script using variable $groups with Get-Content but it wont work if variable $groups goes with Get-ADGroup list I did below...

Block that works:

$groups = Get-Content C:\groups.csv 

$results = @()

$file = "C:\Usuarios_Grupos_Darwin_AD.csv"  

foreach($Group in $Groups) { 

$results  =Get-ADGroupMember -Id $Group -Recursive | %{Get-ADUser -Identity $_.SamAccountName -Properties Enabled,Name} | Select @{Expression={$Group};Label=”Group Name”},SamAccountName,Name,Enabled

}

$results | export-csv -notypeinformation -Delimiter ";" -path $file 

Block that's not working: (only the first line has been changed)

$groups = Get-ADGroup -Filter {Name -like '*Darwin*'}  -Properties * | select -property Name

$results = @()

$file = "C:\Usuarios_Grupos_Darwin_AD.csv"  

foreach($Group in $Groups) { 

$results  =Get-ADGroupMember -Id $Group -Recursive | %{Get-ADUser -Identity $_.SamAccountName -Properties Enabled,Name} | Select @{Expression={$Group};Label=”Group Name”},SamAccountName,Name,Enabled

}

$results | export-csv -notypeinformation -Delimiter ";" -path $file

Here is the error:

Get-ADGroupMember : Cannot bind parameter 'Identity'. Cannot create object of type "Microsoft.ActiveDirectory.Management.ADGroup". The adapter cannot set the value of property 
"Name".
At line:11 char:34
  $results  =Get-ADGroupMember -Id $Group -Recursive | %{Get-ADUser -Id ...
                                   ~~~~~~
      CategoryInfo          : InvalidArgument: (:) [Get-ADGroupMember], ParameterBindingException
      FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember

I'm trying to embed the output list all in one script without having to generate csv with another script.

Thanks in advance !!

CodePudding user response:

Theo, worked like a charm ! Your powershell advices were so helpful man, thank you very much. Do you know how could I select only the group name to appear in csv instead of the distinguishedName ? It's appearing like "CN=GroupNameblabla OU=XXX DC=Xxxx...."

Christophe, that way worked like a charm too ! Thank you brother !! I used this right now for the urgency.

Folks, unfortunately I can't upvote your questions now because I don't have 15 reputation points yet but I'll do when I reach it.

CodePudding user response:

A few notes about your code:

  • the -Filter parameter should be a string, not a scriptblock
  • using $results = is very costly because the entire array needs to be rebuilt in memory on each addition
  • Get-ADGroupMember can return also computer and (when not used with -Recursive) also group objects, not just users, so you cannot pipe directly to Get-ADUser
  • never use -Properties * if all you want is one single property

Try this:

# Get-ADGroup already returns objects with these properties:
# DistinguishedName, GroupCategory, GroupScope, Name, ObjectClass, ObjectGUID, SamAccountName, SID
$groups = Get-ADGroup -Filter "Name -like '*Darwin*'"
$file = "C:\Usuarios_Grupos_Darwin_AD.csv"  
# let PowerShell collect the objects for you instead of using  =
$results = foreach($Group in $Groups) { 
    # Get-ADGroupMember can return objects of type users and computers (also groups when used without -Recursive)
    # so filter the result to get only user objects
    $Group | Get-ADGroupMember -Recursive | Where-Object { $_.objectClass -eq 'user' } | ForEach-Object {
        $_ | Get-ADUser | Select @{Name = 'Group Name'; Expression={$Group.Name}}, SamAccountName, Name, Enabled
    }
}

$results | Export-Csv -Path $file -NoTypeInformation -Delimiter ";"
  • Related