InfrastructureFunctionsModule.psm1

<#
    .NOTES
    --------------------------------------------------------------------------------
     Code generated by: SAPIEN Technologies, Inc., PowerShell Studio 2022 v5.8.210
     Generated on: 12/10/2022 17:03
     Generated by: michaelq
    --------------------------------------------------------------------------------
    .DESCRIPTION
        Script generated by PowerShell Studio 2022
#>



    <#
        ===========================================================================
         Created with: SAPIEN Technologies, Inc., PowerShell Studio 2022 v5.8.210
         Created on: 12/10/2022 16:45
         Created by: michaelq
         Organization:
         Filename: InfrastructureFunctionsModule.psm1
        -------------------------------------------------------------------------
         Module Name: InfrastructureFunctionsModule
        ===========================================================================
    #>

    
    function Add-Users_to_Group
    {
    Param 
    ( 
        [Parameter(Mandatory = $true)] $SourceFile,  
        [Parameter(Mandatory = $true)] $DstGroupName 
    )  
    $VPNUsers = gc $SourceFile
    $VPNUsers | ForEach-Object { Add-ADGroupMember -Identity $DstGroupName -Members $_ }
    }
    
    Function Get-AllAADRecursiveMembersofGroupsstartingwith{
    
    [cmdletbinding()]
    param(
    [parameter(Mandatory=$True)]$StartofGroupname,
    [parameter(Mandatory=$True)]$OutFileLocation = "c:\Temp" #default
    )
    
    # Connect to azure
    
    Connect-AzureAD
    
    # Functions
    
        # Get-DateTime
        Function Get-DateTime {(Get-Date).ToString("yyyy-MM-dd_HH-mm-ss")}
    
        # Get-RecursiveAzureAdGroupMemberUsers
        Function Get-RecursiveAzureAdGroupMemberUsers{
        [cmdletbinding()]
        param(
           [parameter(Mandatory=$True,ValueFromPipeline=$true)]
           $AzureADGroup
        )
            Begin{
                If(-not(Get-AzureADCurrentSessionInfo)){Connect-AzureAD}
            }
            Process {
                [array]$ErrorArray=@()
                $AzureGroup = Get-AzureADGroup -ObjectId $AzureADGroup
                Write-Verbose -Message "Enumerating $($AzureGroup.DisplayName)"
                $Members = Get-AzureADGroupMember -ObjectId $AzureGroup.ObjectId -All $true
                $UserMembers = $Members | Where-Object{$_.ObjectType -eq 'User'}
                If($Members | Where-Object{$_.ObjectType -eq 'Group'}){
                    $UserMembers += $Members | Where-Object{$_.ObjectType -eq 'Group'} | ForEach-Object {
                        $LoopVar = $_
                        try {
                            Get-RecursiveAzureAdGroupMemberUsers -AzureGroup $_
                        }
                        catch {
                            $LoopVar # Current object that (probably) caused the exception
                            $_       # Current ErrorRecord that holds the exception data
                            {$ErrorArray+=(New-Object PSCustomObject -Property @{"GroupName"=$LoopVar.DisplayName;"Error"=$_;"Erroring Group Detail"=$LoopVar;})}
                            #Write-host -ForegroundColor Red Error enumerating Group - $LoopVar.DisplayName
                            #write-host -ForegroundColor Red $_
                            #write-host -ForegroundColor Red $LoopVar
    
                        }
                    }
                }
            }
            end {
                Return $UserMembers
                # Return $ErrorArray | Export-Csv C:\Temp\Errors_RecursiveGroupMembersOfGroupsStartingWith-$($StartofGroupname)-$($datetime).csv -NoTypeInformation -Append
    
            }
        }
    
    # Enumerate Groups
    
    #$StartofGroupname = Read-Host "Please enter start of AAD GroupName followed by a *"
    
    $Groups = Get-AzureADGroup -Top 100000 | ? {$_.DisplayName -like "$($StartofGroupname)*"} | Sort-Object -Property DisplayName
    
    # GetTime for Output
    
    function Get-DateTime {(Get-Date).ToString("yyyy-MM-dd_HH-mm-ss")}
    $datetime = Get-DateTime
    
    # Configure output array
    
    [array]$OutputArray=@()
    
    
    Foreach ($Group in $Groups)
    {
    $AllNestedUsers = Get-RecursiveAzureAdGroupMemberUsers $Group.ObjectId
    $AllNestedUsers = $AllNestedUsers | Sort-Object -Property DisplayName | Get-Unique
    if ($AllNestedUsers -eq $Null) {$OutputArray+=(New-Object PSCustomObject -Property @{"GroupName"=$Group.DisplayName;"DisplayName"="No Users in Group";"UserPrincipalName"="No Users in Group";;"Usertype"="No Users in Group";"AccountEnabled"="No Users in Group";"Office"="No Users in Group";})}
    else {
    foreach ($AllNestedUser in $AllNestedUsers)
        {$OutputArray+=(New-Object PSCustomObject -Property @{"GroupName"=$Group.DisplayName;"DisplayName"=$AllNestedUser.DisplayName;"UserPrincipalName"=$AllNestedUser.UserPrincipalName;"Usertype"=$AllNestedUser.Usertype;"AccountEnabled"=$AllNestedUser.AccountEnabled;"Office"=$AllNestedUser.PhysicalDeliveryOfficeName;})}}}
    $OutputArray | Export-Csv $OutFileLocation\RecursiveGroupMembersOfGroupsStartingWith-$($StartofGroupname)-$($datetime).csv -NoTypeInformation
    
    }
    
    Function Get-DateTime {(Get-Date).ToString("yyyy-MM-dd_HH-mm-ss")}
    
    Function Get-DCDNSForwarders {
    
    # Define Simple Functions
    
    function Get-DateTime {(Get-Date).ToString("yyyy-MM-dd_HH-mm-ss")}
    
    # Define Variables
    
    $dcs = Get-ADDomainController -Filter * | Sort-Object
    $datetime = Get-DateTime
    $outfile = "c:\temp\DCs_DNSForwarders_$($datetime).csv"
    
    # Define Array
    
    [array]$OutputArray=@()
    
    # Define Task
    
    foreach ($DC in $DCs)
        {
        $date = get-date
        $forwarders = Get-DnsServerForwarder -ComputerName $DC
        $OutputArray+=(New-Object PSCustomObject -Property @{"Date"=$date;"DomainController"=$DC;"DNSForwarderIPAddress"=$forwarders.IPaddress;})
        }
    
    # Output File and Print Data
     
    $OutputArray | Out-File $outfile
    $OutputArray
    }
    
    Function Get-NICDCDNSServers {
    
    # Define Simple Functions
    
    function Get-DateTime {(Get-Date).ToString("yyyy-MM-dd_HH-mm-ss")}
    
    # Define Variables
    
    $dcs = Get-ADDomainController -Filter * | Sort-Object
    $datetime = Get-DateTime
    $outfile = "c:\temp\DCs_Interface_DNSServers_$($datetime).csv"
    
    # Define Array
    
    [array]$OutputArray=@()
    
    # Define Task
    
    foreach ($DC in $DCs)
        {
        $date = get-date
        $CimSession = New-CimSession -ComputerName $dc.Name 
        if ($CimSession -eq $null) {$OutputArray+=(New-Object PSCustomObject -Property @{"Date"=$date;"DomainController"=$DC;"DNSServerIPAddress"="NoResultReturned";})} else 
        {
        $DNSconfig = get-DnsClientServerAddress -CimSession $CimSession | ? {$_.InterfaceAlias -like "Server*" -and $_.AddressFamily -eq "2"}
        $OutputArray+=(New-Object PSCustomObject -Property @{"Date"=$date;"DomainController"=$DC;"DNSServerIPAddress"=$DNSconfig.serveraddresses;})
        }
        }
    
    # Output File and Print Data
     
    $OutputArray | Out-File $outfile
    $OutputArray
    }
    
    function Get-FSMORoles {
    Param 
    ( 
        [Parameter(Mandatory = $true)] $Domain 
    )  
    Import-Module activedirectory
    [array]$OutputArray=@()
    $ADforestRoles = Get-ADForest $Domain  # | ft DomainNamingMaster, SchemaMaster
    $ADDomainRoles = Get-ADDomain $Domain  # | ft InfrastructureMaster, PDCEmulator, RIDMaster
    $OutputArray+=(New-Object PSCustomObject -Property @{"DomainNamingMaster"=$ADforestRoles.DomainNamingMaster; `
                                                        "SchemaMaster"=$ADforestRoles.SchemaMaster; `
                                                        "InfrastructureMaster"=$ADdomainRoles.InfrastructureMaster; `
                                                        "PDCEmulator"=$ADdomainRoles.PDCEmulator; `
                                                        "RIDMaster"=$ADdomainRoles.RIDMaster;})
    
    $OutputArray
    }
    
    Function Get-Uptime {
    
    <#
    .SYNOPSIS
        Gets Local Machine Uptime
    .DESCRIPTION
        Created by Mike Quick 12/10/2022
        Gets Local Machine Uptime
    .PARAMETER Filename
        NONE
    .EXAMPLE
        Get-Uptime
    .LINK
        https://manage.wix.com/dashboard/7ffa7bd8-227b-4959-a850-9ad3e4e64523/blog/a2373973-8168-4160-8de6-03c57bc761c5/edit?tab=published&lang=en
    #>

    
    $Computerinfo = Get-ComputerInfo 
    $Boottime = (get-date) - (gcim Win32_OperatingSystem).LastBootUpTime
     
    write-host  $Computerinfo.OsLastBootUpTime Boot Time
    write-host  $Boottime.Days Days
    write-host  $Boottime.Hours Hours 
    write-host  $Boottime.Minutes Minutes
    write-host  $Boottime.Seconds Seconds
    
    }
    
    function Remove-Whitespace {
        
    <#
    .SYNOPSIS
    Working?
    .DESCRIPTION
    Working?
    Set the parameters for the new rule.
    Working?
    Working?
    .PARAMETER DisplayName
    Working?
    .PARAMETER LocalPort
    Working?
    .PARAMETER Direction
    Working?
    .PARAMETER Action
    Working?
    .PARAMETER Exists
    Working?
    >EXAMPLE
    WORKING?
    #>

    
    [cmdletbinding()]
    
    param 
    (
    [parameter(Mandatory=$True)]$Filename
    )
    $File = Get-Content $Filename
    $File | Foreach {$_.TrimEnd()} | Foreach {$_.TrimStart()} | Set-Content $Filename
    }
    
    function Search-FileAllLocalDisks {
        param (
        [Parameter(Mandatory = $true)] $Filename
        )
    
        $disks = Get-WmiObject -Class Win32_volume -Filter "DriveType = 3" | Where-Object {$_.DriveLetter -cne $null} -ErrorAction SilentlyContinue
        
        $Files = foreach ($disk in $disks.name) {Get-ChildItem "$disk" -File -Recurse -Filter $Filename -ErrorAction SilentlyContinue}
    
        return ,$Files 
    }