AdvancedADManagement.psm1

Function Get-DomainUser{
<#
.SYNOPSIS
Get information about a user account
.PARAMETER User
The user account to gather information for
Accepts wildcards
.EXAMPLE
Get-DomainUser -User jsmith*
Finds all users that start with jsmith
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.1
.LINK
https://www.mosaicmk.com
#>

    [CmdletBinding()]
     Param(
            [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
            [Alias("Name","AccountName","UserAccount","UserName","User")]
            $SamAccountName
        )
        process{
            $DMUser = Get-ADUser -filter {SamAccountName -like $SamAccountName} -Properties *
            Foreach ($item in $DMUser){
                $DomainUser = New-Object -TypeName psobject
                $DomainUser | Add-Member -MemberType NoteProperty -Name DisplayName -Value $Item.DisplayName
                $DomainUser | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $Item.SamAccountName
                $DomainUser | Add-Member -MemberType NoteProperty -Name CanonicalName -Value $Item.CanonicalName
                $DomainUser | Add-Member -MemberType NoteProperty -Name EmailAddress -Value $Item.EmailAddress
                $DomainUser | Add-Member -MemberType NoteProperty -Name Initials -Value $Item.Initials
                $DomainUser | Add-Member -MemberType NoteProperty -Name DateCreated -Value $Item.whenCreated
                $DomainUser | Add-Member -MemberType NoteProperty -Name LastLogonDate -Value $item.LastLogonDate
                $DomainUser | Add-Member -MemberType NoteProperty -Name PasswordExpired -Value $item.PasswordExpired
                $DomainUser | Add-Member -MemberType NoteProperty -Name PasswordLastSet -Value $Item.PasswordLastSet
                $DomainUser | Add-Member -MemberType NoteProperty -Name PasswordNeverExpires -Value $Item.PasswordNeverExpires
                $DomainUser | Add-Member -MemberType NoteProperty -Name PasswordNotRequired -Value $Item.PasswordNotRequired
                $DomainUser | Add-Member -MemberType NoteProperty -Name LockedOut -Value $Item.LockedOut
                $DomainUser | Add-Member -MemberType NoteProperty -Name badPwdCount -Value $Item.badPwdCount
                $DomainUser | Add-Member -MemberType NoteProperty -Name LastChanged -Value $item.WhenChanged
                $DomainUser | Add-Member -MemberType NoteProperty -Name DistinguishedName $item.DistinguishedName
                $DomainUser | Add-Member -MemberType NoteProperty -Name Description -Value $item.Description
                $DomainUser | Add-Member -MemberType NoteProperty -Name AccountExpirationDate -Value $item.AccountExpirationDate
                $DomainUser | Add-Member -MemberType NoteProperty -Name UserPrincipalName -$item.UserPrincipalName
                $DomainUser
            }
        }
}

Function Unlock-DomainUser{
<#
.SYNOPSIS
unlocks a user account
.PARAMETER SamAccountName
the samaccount of the user
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.1
.LINK
https://www.mosaicmk.com
#>

    Param(
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","AccountName","UserAccount","UserName","User")]
        $SamAccountName
    )
    Process{Unlock-ADAccount $SamAccountName}
}

Function Reset-DomainUserPassword{
<#
.SYNOPSIS
Resets the the password for a user account
.PARAMETER Samaccountname
the samaccount of the user
.PARAMETER Password
the password you want to set for the user
.PARAMETER DontChangePasswordAtLogin
use this switch if the user is to not change there password on the next login
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.1
.LINK
https://www.mosaicmk.com
#>

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","AccountName","UserAccount","UserName","User")]
        $SamAccountName,
        [string]$Password,
        [switch]$DontChangePasswordAtLogin
    )
    Process{
        If ($Password) {
            $Value = $Password | ConvertTo-SecureString -AsPlainText -Force
            Set-ADAccountPassword -Identity $SamAccountName -Reset -NewPassword $Value
        }
        IF (!($Password)){Set-ADAccountPassword -Identity $SamAccountName -Reset}
        IF ($DontChangePasswordAtLogin) {Set-ADUser -Identity $SamAccountName -ChangePasswordAtLogon $false} IF (!($DontChangePasswordAtLogin)){Set-ADUser -Identity $SamAccountName -ChangePasswordAtLogon $True}
        $Value = $null
        $Password = $null
    }
}

function Get-DomainUserGroupMembership {
<#
.SYNOPSIS
Gets the groups the user is a member of
.PARAMETER Samaccountname
the samaccount of the user
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.1
.LINK
https://www.mosaicmk.com
#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","AccountName","UserAccount","UserName","User")]
        [string]$SamAccountName
    )
    Process{
        $Groups = (Get-Aduser $SamAccountName -Properties *).MemberOf
        $AllObjects = @()
        foreach ($item in $Groups) {
            $GroupName = Get-ADGroup "$item" -Properties *
            $DGroup = $GroupName.cn | Out-String | ForEach-Object {$_.Trim()}
            $AllObjects += [pscustomobject]@{GroupName = $DGroup}
        }
        $AllObjects
    }
}

Function Get-DomainGroupMembers{
<#
.SYNOPSIS
Gets gets the members of a domain group
.PARAMETER GroupName
Name of the group to the members of
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.1
.LINK
https://www.mosaicmk.com
#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","Group","DomainGroupName","DomainGroup")]
        $GroupName
    )
    process{
        $Objects = Get-ADGroupMember $GroupName
        foreach ($Object in $Objects){
            $DCObject = New-Object -TypeName psobject
            $DCObject | Add-Member -MemberType NoteProperty -Name Name -Value $Object.Name
            $DCObject | Add-Member -MemberType NoteProperty -Name ObjectClass -Value $Object.ObjectClass
            $DCObject | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $Object.SamAccountName
            $DCObject
        }
    }
}

function Get-DomainGroup {
<#
.SYNOPSIS
Gets inforamtion about a group
.PARAMETER Samaccountname
Name of the group you want to gether information for
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.1
.LINK
https://www.mosaicmk.com
#>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","Group","DomainGroupName","DomainGroup")]
        [string]$GroupName
    )
    Process{
        $Group = Get-ADGroup -Filter {CN -like $GroupName} -Properties *
        Foreach ($Item in $Group){
            $DGroup = New-Object -TypeName psobject
            $DGroup | Add-Member -MemberType NoteProperty -Name GroupName -Value $Item.CN
            $DGroup | Add-Member -MemberType NoteProperty -Name CononicalName -Value $Item.CanonicalName
            $DGroup | Add-Member -MemberType NoteProperty -Name DistinguishedName -Value $Item.DistinguishedName
            $DGroup | Add-Member -MemberType NoteProperty -Name DateCreated -Value $Item.whenCreated
            $DGroup | Add-Member -MemberType NoteProperty -Name DateModified -Value $Item.WhenChanged
            $DGroup | Add-Member -MemberType NoteProperty -Name Type -Value $Item.GroupCategory
            $DGroup | Add-Member -MemberType NoteProperty -Name Scope -Value $Item.GroupScope
            $DGroup
        }
    }
}

Function Get-DomainComputer{
<#
.SYNOPSIS
Gets a domain computer
.PARAMETER ComputerName
Name of the computer to get
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.0
.LINK
https://www.mosaicmk.com
#>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","DeviceName","Computer","Device")]
        [string]$ComputerName
    )
    Process{
        $Device = Get-ADComputer -filter {name -like $ComputerName} -Properties *
        Foreach ($item in $Device){
            $DDevice = New-Object -TypeName psobject
            $DDevice | Add-Member -MemberType NoteProperty -Name ComputerName -Value $item.Name
            $DDevice | Add-Member -MemberType NoteProperty -Name Description -Value $item.Description
            $DDevice | Add-Member -MemberType NoteProperty -Name CanonicalName -Value $item.CanonicalName
            $DDevice | Add-Member -MemberType NoteProperty -Name DistinguishedName -Value $item.DistinguishedName
            $DDevice | Add-Member -MemberType NoteProperty -Name DateCreated -Value $item.Created
            $BitLockerObjects = (Get-ADObject -Filter {objectclass -eq 'msFVE-RecoveryInformation'} -SearchBase $item.DistinguishedName -Properties 'msFVE-RecoveryPassword').'msFVE-RecoveryPassword'
            $DDevice | Add-Member -MemberType NoteProperty -Name BitLockerRecoveryPassword -Value $BitLockerObjects
            $DDevice
        }
    }
}

function Get-DomainComputerGroupMembership {
<#
.SYNOPSIS
Gets the groups the computer is a member of
.PARAMETER ComputerName
Name of the computer
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.0
.LINK
https://www.mosaicmk.com
#>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","DeviceName","Computer","Device")]
        [string]$ComputerName
    )
    Process{
        $Groups = (Get-ADComputer -Filter {name -like $ComputerName} -Properties *).MemberOf
        $AllObjects = @()
        foreach ($item in $Groups) {
            $GroupName = Get-ADGroup "$item" -Properties *
            $DGroup = $GroupName.cn | Out-String
            $DGroup = $DGroup.Trim()
            $AllObjects += [pscustomobject]@{GroupName = $DGroup}
        }
        $AllObjects
    }
}

Function Get-ADObjectInfo {
<#
.SYNOPSIS
gets info about an ad object
.PARAMETER Object
Name of the object
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.0
.LINK
https://www.mosaicmk.com
#>

    param (
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name","DeviceName","Computer","Device","AccountName","UserAccount","UserName","User","SamAccountName")]
        [string]$Object
    )
    Process{
        $IL = Get-ADObject -Filter {Name -like $Object} -Properties *
        IF ($IL -eq $null){$IL = Get-ADObject -Filter {sAMAccountName -like $Object} -Properties *}
        foreach ($item in $IL){
            IF ($item.ObjectClass -eq "computer"){Get-DomainComputer -ComputerName $item.name}
            IF ($item.ObjectClass -eq "User"){Get-DomainUser -SamAccountname $item.sAMAccountName}
            IF ($item.ObjectClass -eq "group"){Get-DomainGroup -GroupName $item.name}
            IF ($item.ObjectClass -eq "organizationalUnit"){Get-DomainOU -OU $item.name}
        }
    }
}


Function Get-DomainOU {
<#
.SYNOPSIS
gets
.PARAMETER ComputerName
Name of the computer
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.0
.LINK
https://www.mosaicmk.com
#>

    param (
        [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
        [Alias("Name")]
        [string]$OU
    )
    Process{Get-ADOrganizationalUnit -Filter {Name -like $OU}}
}

# In dev
# Function Remove-DomainObject {
# <#
# .SYNOPSIS
# gets
# PARAMETER ComputerName
# Name of the computer
# .NOTES
# Contact: Contact@mosaicMK.com
# Version 1.0.0
# .LINK
# https://www.mosaicmk.com
# #>
# param (
# [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName)]
# [Alias("Name","DeviceName","Computer","Device","AccountName","UserAccount","UserName","User","SamAccountName")]
# [string]$Object
# )
# Process{
# $IL = Get-ADObject -Filter {Name -like $Object} -Properties *
# IF ($IL -eq $null){$IL = Get-ADObject -Filter {sAMAccountName -like $Object} -Properties *}
# $DCs = (Get-ADDomain).ReplicaDirectoryServers
# foreach ($item in $IL){
# IF ($item.ObjectClass -eq "computer"){

# }
# IF ($item.ObjectClass -eq "User"){

# }
# IF ($item.ObjectClass -eq "group"){}
# IF ($item.ObjectClass -eq "organizationalUnit"){

# }
# }
# }
# }

Function Copy-ADGroupMembership{
<#
.SYNOPSIS
Copy user group membership from one user to another
.DESCRIPTION
Gets the group membership of one user and a user to eac group
.NOTES
Contact: Contact@mosaicMK.com
Version 1.0.0
.LINK
https://www.mosaicmk.com
#>


    PARAM(
        [Parameter(Mandatory=$True)]
        [string]$UserCopyFrom,
        [Parameter(Mandatory=$True)]
        [string]$UserCopyTo
    )

    $Groups = (Get-ADUser -Filter {samaccountname -eq $UserCopyFrom} -Properties *).MemberOf
    If (!($Groups)) {Write-Error "Could not find $UserCopyFrom";Return}
    $User = Get-ADUser -Filter {samaccountname -eq $UserCopyTo} -Properties *
    If (!($User)) {Write-Error "Could not find $UserCopyTo";Return}
    Foreach ($Group in $Groups){Add-ADGroupMember -Identity $Group -Members $User}
}