Get-Architecture.psm1

<#
    ===========================================================================
     Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.154
     Created on: 2019-06-20 10:51
     Created by: 8Q0V
     Organization:
     Filename: Get-Architecture.psm1
    -------------------------------------------------------------------------
     Module Name: Get-Architecture
    ===========================================================================
#>


function Run-DBQuery {
    [CmdletBinding()]
    [OutputType([int])]
    Param
    (
        [Parameter(Mandatory = $True,
            HelpMessage = "Please specify the SQL Server instance. Ex Computer\Instance",
            ValueFromPipeline = $False)]
        [ValidateNotNullorEmpty()]
        $Database,
        [Parameter(Mandatory = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = "Please specify the TSQL query.",
            Position = 0)]
        [OutputType([System.Data.DataTable])]
        $QueryString


    )

    try {
        try {
            $ConnectionString = "Data Source=$Database;Integrated Security=True;User ID=;Password="
            $command = New-Object System.Data.SqlClient.SqlCommand ($QueryString, $ConnectionString) -ErrorAction Inquire
            $adapter = New-Object System.Data.SqlClient.SqlDataAdapter ($command) -ErrorAction Inquire
        }
        catch [System.Net.WebException], [System.Exception] {
            $errorMessage = $_.Exception.Message
            Write-Warning "$errorMessage Server:$server xx"
        }



        #Load the Dataset

        $dataset = New-Object System.Data.DataSet
        if ($adapter) {
            [void]$adapter.Fill($dataset)
            #Return the Dataset
            return @(, $dataset.Tables[0])
        }
        {
            Write-Host "Either no access to DB or something went wrong!"
        }

    }

    catch [System.Net.WebException], [System.Exception] {
        $errorMessage = $_.Exception.Message
        Write-Warning "$errorMessage Server:$server"
    }




}

function Connect-Server {
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true,
            ValueFromPipelineByPropertyName = $true,
            Position = 0)]
        $Servers
    )

    BEGIN {
        $serverarch_obj = @()
    }
    PROCESS {
        foreach ($Server in $Servers) {
            try {
                $objOption = New-CimSessionOption -Protocol Dcom -ErrorAction stop
                $objSession = New-CimSession -ComputerName $server -SessionOption $objOption -ErrorAction Stop
                $serverarch_obj += New-Object psobject -Property @{ 'Name' = $server }
            }

            catch [System.Net.WebException], [System.Exception] {
                Write-Warning "No CimSession connection to $server"
                $serverarch_obj += New-Object psobject -Property @{ 'Name' = $("No CimSession connection to $server") }
            }
        }
    }
    END {

        $serverarch_obj
    }
}

function Get-ServerArch {
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        $Server
    )
    BEGIN {
        $serverarch_obj = @()
    }
    PROCESS {
        $objOption = New-CimSessionOption -Protocol Dcom -ErrorAction SilentlyContinue
        $objSession = New-CimSession -ComputerName $server -SessionOption $objOption -ErrorAction SilentlyContinue
        $WinOS = Get-CimInstance -CimSession $objSession -Namespace ROOT/cimv2 -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue
        $UpTime = New-TimeSpan -Start $WinOS.LastBootUpTime -End (get-date)
        $Model = (Get-CimInstance -CimSession $objSession -Namespace ROOT/cimv2 -ClassName Win32_ComputerSystem -ErrorAction SilentlyContinue).Model
        $IP = (Get-CimInstance -CimSession $objSession -Namespace ROOT/cimv2 -ClassName Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue |
            where { $_.ipaddress -like "1*" } | select -ExpandProperty ipaddress | select -First 1 -ErrorAction SilentlyContinue)
        $CPU = Get-CimInstance -CimSession $objSession -Namespace ROOT/cimv2 -ClassName Win32_Processor -ErrorAction SilentlyContinue


        $params = @{
            'Name'       = $server
            'Arch'       = $WinOS.OSArchitecture
            'OS'         = $WinOS.Caption
            'Model'      = $Model
            'CPU'        = ($CPU.Name | Select-Object -First 1)
            'IP'         = $IP
            'RAM'        = ([math]::round($WinOS.TotalVisibleMemorySize / 1MB)).ToString() + ' GB'
            'Cores'      = ($CPU.NumberOfCores).count
            'LPU'        = ($CPU.NumberOfLogicalProcessors).Count
            'LastBootUp' = $WinOS.LastBootUpTime.ToString("yyyy-MM-dd HH:mm")
            'UpTimeDays' = $UpTime.Days

        }
        $serverarch_obj += New-Object psobject -Property $params


    }
    END {
        $serverarch_obj
    }

}

function Get-SQLInfo {
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        $Servers
    )

    BEGIN {
        $SQLobj = @()

    }
    PROCESS {
        foreach ($server in $Servers) {


            $InstanceName = Invoke-Command -ComputerName $server -ErrorAction Continue -ScriptBlock {
                (get-itemproperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' -ErrorAction SilentlyContinue).InstalledInstances
            }


            if ($InstanceName) {
                $params = @{
                    'SQLInst' = $InstanceName
                }

                try {

                    $SQLversionQuery = Run-DBQuery -Database "$server\$InstanceName" -QueryString "select @@version as SQLVersion" -ErrorAction Stop

                    $params.add('SQLVer', $($SQLversionQuery.SQLversion))

                }

                catch [System.Net.WebException], [System.Exception] {

                    $errorMessage = $_.Exception.Message
                    $params.add('SQLVer', "Error$errorMessage")
                    Write-Warning "$errorMessage xx"

                }
                $SQLobj += New-Object psobject -Property $params
            }
            else {
                Write-Warning "$server is not a DB server"
            }
        }

    }
    END {
        #$SQLobj
    }
}

function Get-DiskInfo {
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        $Servers
    )

    BEGIN {
        $Diskobj = @()
    }
    PROCESS {
        foreach ($server in $Servers) {
            $objOption = New-CimSessionOption -Protocol Dcom -ErrorAction SilentlyContinue
            $objSession = New-CimSession -ComputerName $server -SessionOption $objOption -ErrorAction SilentlyContinue
            $allDisks = Get-CimInstance -CimSession $objSession -Namespace ROOT/cimv2 -ClassName Win32_Volume -ErrorAction SilentlyContinue |
            Where-Object { $_.Capacity -gt 1 } |
            select driveletter, capacity, freespace
            $params = @{ }
            foreach ($disk in $alldisks) {
                if (-not ([string]::IsNullOrEmpty($($disk.driveletter)))) {
                    $DisksizeGB = [math]::round($disk.capacity / 1GB)
                    $diskLetter = $disk.Driveletter.Replace(':', '')
                    $DiskUsed = [math]::round(($disk.capacity - $disk.freespace) / 1GB)
                    $DiskFree = [math]::round(($disk.freespace / 1GB))
                    $percentFree = "{0:P1}" -f ($DiskFree / $DisksizeGB)
                    $params.Add($($diskLetter), $("$disksizeGB GB `n($percentFree Free)"))
                }

            }
            $Diskobj += New-Object psobject -Property $params
        }
    }
    END {
        $Diskobj
    }
}