简体   繁体   中英

Export user from multiple groups

Good Morning Guys,

I write this script to export multiple users in multiple groups in a CSV file.

In addition to not exporting anything, I cannot insert a column in the CSV where the user's appatenency group is specified. Just the one with the name "vpn-*", like vpn-users

Powershell Version 4.0

$Data = $UserData = @()
$GroupName = Get-ADGroup -Filter {name -like "VPN-*"} -Properties Name | Select-Object Name
Foreach ($group in $GroupName)
{
$UserData = Get-ADGroupMember -Identity {$group}
Where objectClass -eq 'user' | 
Get-ADUser -Properties Name, UserPrincipalName, description, Enabled |
Select-Object Name, UserPrincipalName, description, Enabled 
}
$UserData  | export-csv "c:\members2.csv"

I see a number of issues with the posted code. Some are mere preferences, but others look like they would affect the outcome.

-Properties Name isn't needed in the initial Get-ADGroup command. The Name property is returned by default.

Respectful to @Theo's comment re: -ExpandProperty , however, I prefer not to use that unnecessarily. You don't even need the first Select-Object command, just reference the property and it will unroll and return a string array. Property unrolling is supported as of PowerShell Version 3.

Your argument to the -Filter parameter should be a string. I myself have a hard time breaking the habit of wrapping those queries in script blocks {...} , however, there are some specifics of the AD cmdlets, and using a string is a best practice. Basically, the argument takes a string type, if you give it a script block it will convert it to a string and that process may not always work as desired.

It's better to store your AD properties in an array you can cite multiple times. Normally you would've only needed to add 'Description' but considering you were also using it in a later Select-Object command it makes more sense to add all the desired properties to an array.

Personally, I prefer not to use simplified syntax. I don't know what the community's opinion is on that but I rewrote using my preference.

You were also missing | ' before the Where-Object command.

And, yes you would have to move the Export-Csv inside the loop to output data per loop iteration. Using the -Append parameter to avoid overwriting it on every iteration.

Untested Example:

$ADProps = 'Name', 'UserPrincipalName', 'description', 'Enabled'

$GroupName = (Get-ADGroup -Filter "name -like 'VPN-*'" ).Name

Foreach ( $Group in $GroupName )
{
    $UserData = 
    Get-ADGroupMember -Identity $Group |
    Where-Object{ $_.objectclass -eq 'user' } | 
    Get-ADUser -Properties $ADProps |
    Select-Object ($ADProps += @{Name = 'Group'; Expression = { $Group }})

    $UserData | export-csv "c:\members2.csv" -NoTypeInformation -Append
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM