Public/New-ADSIGroup.ps1

function New-ADSIGroup
{
<#
    .SYNOPSIS
        function to create a new group
     
    .DESCRIPTION
        function to create a new group
     
    .PARAMETER Name
        Specifies the property Name
     
    .PARAMETER DisplayName
        Specifies the property DisplayName
     
    .PARAMETER UserPrincipalName
        Specifies the property UserPrincipalName
     
    .PARAMETER Description
        Specifies the property Description
     
    .PARAMETER GroupScope
        Specifies the Group Scope (Global, Local or Universal)
     
    .PARAMETER IsSecurityGroup
        Specify if you want to create a Security Group.
        By default this is $true.
     
    .PARAMETER Passthru
        Specifies if you want to see the object created after running the command.
     
    .PARAMETER Credential
        Specifies if you want to specifies alternative credentials
     
    .PARAMETER DomainName
        Specifies if you want to specifies alternative DomainName
     
    .EXAMPLE
        PS C:\> New-ADSIGroup -Name "TestfromADSIPS3" -Description "some description" -GroupScope Local -IsSecurityGroup
     
    .NOTES
        Francois-Xavier.Cat
        LazyWinAdmin.com
        @lazywinadm
        github.com/lazywinadmin
     
    .LINK
        https://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.groupprincipal(v=vs.110).aspx
#>

    
    [CmdletBinding(SupportsShouldProcess = $true)]
    param
    (
        [Parameter(Mandatory = $true)]
        $Name,

        [String]$DisplayName,

        [String]$UserPrincipalName,

        [String]$Description,

        [Parameter(Mandatory = $true)]
        [system.directoryservices.accountmanagement.groupscope]$GroupScope,
        [switch]$IsSecurityGroup = $true,

        [switch]$Passthru,

        [Alias("RunAs")]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential = [System.Management.Automation.PSCredential]::Empty,

        [String]$DomainName
    )
    
    BEGIN
    {
        Add-Type -AssemblyName System.DirectoryServices.AccountManagement
        
        # Create Context splatting
        $ContextSplatting = @{ ContextType = "Domain" }
        
        IF ($PSBoundParameters['Credential']) { $ContextSplatting.Credential = $Credential }
        IF ($PSBoundParameters['DomainName']) { $ContextSplatting.DomainName = $DomainName }
        
        $Context = New-ADSIPrincipalContext @ContextSplatting
    }
    PROCESS
    {
        TRY
        {
            
            if ($PSCmdlet.ShouldProcess($Name, "Create Group"))
            {
                $newGroup = [System.DirectoryServices.AccountManagement.GroupPrincipal]::new($Context, $Name)
                $newGroup.Description = $Description
                $newGroup.GroupScope = $GroupScope
                $newGroup.IsSecurityGroup = $IsSecurityGroup
                $newGroup.DisplayName
                #$newGroup.DistinguishedName =
                #$newGroup.Members
                $newGroup.SamAccountName = $Name
                
                IF ($PSBoundParameters['UserPrincipalName']) { $newGroup.UserPrincipalName = $UserPrincipalName }
                
                # Push to ActiveDirectory
                $newGroup.Save($Context)
                
                IF ($PSBoundParameters['Passthru'])
                {
                    $ContextSplatting.Remove('ContextType')
                    Get-ADSIGroup -Identity $Name @ContextSplatting
                }
            }
        }
        CATCH
        {
            Write-Error $Error[0]
        }
        
    }
    END
    {
        
    }
}