functionpowershelladgroup

How to create a Function using Powershell


I need help with the code below. I want the script to perform the following: prompt the user for an AD group name, if the group name is found, export the group members to a CSV file. one of the requirements is that I must include a function statement. Thank you in advance.

The code works if I use a variable like the following example: $groupsusers = Get-ADGroup -Identity $nameofgroup, instead of the function statement. However, I don't want to use a variable, I want to implement a function statement.

$prompt = "Enter A Group Name"
do
{
$nameofgroup = Read-Host $prompt
}
until(!$(dsquery Group-Object $nameofgroup; $prompt = "Group 
'$nameofgroup' was not found, try again"))

$nameofgroup = Read-Host $prompt

function GetGroupInfoToCsv (#what parameters go here?){

ForEach-Object{

$settings = @{ Group = $_.DistinguishedName; Member = $null }
$_| Get-ADGroupMember |
ForEach-Object{
    $settings.Member = $_.DistinguishedName
    New-Object PsObject -Property $settings
}

}

}

GetGroupInfoToCsv | Export-Csv .\GroupMembers.csv -NoTypeInformation

Solution

  • You could combine the asking for user input and returning the info into the same function. Something like this:

    function Get-GroupMembers {
        $prompt = "Enter A Group Name. Press Q to quit"
        # create an endless loop
        while ($true) {
            Clear-Host
            $answer = Read-Host $prompt
            # if the user has had enough, exit the function
            if ($answer -eq 'Q') { return }
    
            # try and find one or more AD groups using the answer as (part of) the name
            $group = Get-ADGroup -Filter "Name -like '*$answer*'"
            # if we have found something, exit the while loop and start enumerating the members
            if ($group) { break }
    
            $prompt = "Group '$answer' was not found, try again. Press Q to quit"
        }
    
        # you only get here if Get-ADGroup found one or more groups
        $group | ForEach-Object {
            # output a PSObject with the properties you are after
            $members = $_ | Get-ADGroupMember
            foreach ($member in $members) {
                [PsCustomObject]@{
                    'Group'  = $_.DistinguishedName
                    'Member' = $member.DistinguishedName
                }
            }
        }
    }
    
    # call the function
    $groupinfo = Get-GroupMembers
    # test if the function returned anything. 
    # the user could have cancelled of the group had no members to output
    if ($groupinfo) {
        Write-Host "Adding $($groupinfo.Count) items to the CSV file"
        # without -Append, you would overwrite your CSV file..
        $groupinfo | Export-Csv .\GroupMembers.csv -NoTypeInformation -Append
    }
    else {
        Write-Host 'Nothing found..'
    }
    

    As you can see, I have changed the function name so it complies with the Verb-Noun convention in PowerShell.