AssetInventory.psm1

Function Get-AssetInventory {
    <#
        .Synopsis
            Retrieves asset information including software inventory, installed windows updates,
            system information, and hardware information.
        .Description
            The Get-AssetInventory cmdlet is a workflow that retrieves information from the computer the script is running on.
        .Example
            Get-AssetInventory
            Returns a full inventory of software, updates, and system information from the local computer as a powershell object.
            Get-AssetInventory -ComputerName remotecomputer
            Returns a full inventory from a remote computer, it will prompt for credentials.
            Get-AssetInventory -AsJson
            Returns the inventory information formatted in JSON.
        .Parameter ComputerName
            The computer to run the cmdlet against, if it is not supplied, or is localhost or 127.0.0.1, the cmdlet will run locally.
        .Parameter AsJson
            A switch to specify the output should be in JSON instead of a PSObject
        .Parameter Credentials
            The credentials to run the cmdlet with
        .Inputs
            None
        .Outputs
            [object],[string]
        .Notes
            NAME: Get-AssetInventory
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 3.0
    #>


    [CmdletBinding(DefaultParameterSetName="JSON")]
    Param
    ( 
        [Parameter(Position=0)] 
        $ComputerName = "localhost",
        [Parameter(Position=1, ParameterSetName="JSON")]
        [switch] $AsJson = $false, 
        [Parameter(Position=1, ParameterSetName="XML")]
        [switch] $AsXML = $false,
        [Parameter(Position=2)]
        [switch] $IgnorePing = $false,
        [Parameter(Position=3)]
        [PSCredential]$Credential = $null
    )

    $total = 16
    $completed = 0

    if ($ComputerName.ToLower() -eq "localhost" -or $ComputerName -eq "127.0.0.1" -or $ComputerName.ToLower() -eq $env:COMPUTERNAME.ToLower())
    {
        $systemInfo = Get-ComputerSystemInformation
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )

        $disk =Get-DiskInformation
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $bios =Get-BIOS
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )

        $cpu = Get-CPU 
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $os = Get-OperatingSystem
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $network = Get-NetworkAdapters
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $bit32 = Get-32BitSoftware
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $bit64 = Get-64BitSoftware
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $wsus = Get-MicrosoftUpdates
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $reboots = Get-PendingReboots
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $usb = Get-USBDevices
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $memory = Get-MemoryStatistics
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )    
    
        $services = Get-SystemServices
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )    
    
        $tcp = Get-TCPPorts
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )    
    
        $udp = Get-UDPPorts
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
        $features = Get-WindowsFeatures
        $status = (++$completed).ToString() + " of " + $total.ToString()
        Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )  
    }
    else
    {
        if ((Ping-Host -ComputerName $ComputerName) -or $IgnorePing)
        {
            if ($Credential -eq $null)
            {
                $Credential = Get-Credential
            }

            $session = New-PSSession -ComputerName $ComputerName -Credential $Credential

            $session = New-PSSession -ComputerName $ComputerName -Credential $Credential
            Invoke-Command -Session $session -ScriptBlock {Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process}
        
            $systemInfo = Invoke-Command -Session $session -ScriptBlock ${function:Get-ComputerSystemInformation} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )

            $disk = Invoke-Command -Session $session -Scriptblock ${function:Get-DiskInformation} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $bios = Invoke-Command -Session $session -Scriptblock ${function:Get-BIOS} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )

            $cpu = Invoke-Command -Session $session -Scriptblock ${function:Get-CPU} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $os = Invoke-Command -Session $session -Scriptblock ${function:Get-OperatingSystem} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $network = Invoke-Command -Session $session -Scriptblock ${function:Get-NetworkAdapters} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $bit32 = Invoke-Command -Session $session -Scriptblock ${function:Get-32BitSoftware} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $bit64 = Invoke-Command -Session $session -Scriptblock ${function:Get-64BitSoftware} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $wsus = Invoke-Command -Session $session -Scriptblock ${function:Get-MicrosoftUpdates} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $reboots = Invoke-Command -Session $session -Scriptblock ${function:Get-PendingReboots} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $usb = Invoke-Command -Session $session -Scriptblock ${function:Get-USBDevices} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $memory = Invoke-Command -Session $session -Scriptblock ${function:Get-MemoryStatistics} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )    
    
            $services = Invoke-Command -Session $session -Scriptblock ${function:Get-SystemServices} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )    
    
            $tcp = Invoke-Command -Session $session -Scriptblock ${function:Get-TCPPorts} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )    
    
            $udp = Invoke-Command -Session $session -Scriptblock ${function:Get-UDPPorts} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )
    
            $features = Invoke-Command -Session $session -Scriptblock ${function:Get-WindowsFeatures} 
            $status = (++$completed).ToString() + " of " + $total.ToString()
            Write-Progress -Activity "Collecting Information" -Status $status -PercentComplete ( ($completed / $total) * 100 )   
        }
    }

    $result = New-Object -TypeName PSObject -Property @{"System Info" = $systemInfo; "Disks" = $disk; "BIOS" = $bios; "CPU" = $cpu; 
            "Operating System" = $os; "Network Adapters" = $network; "Software (32 bit)" = $bit32; "Software (64 bit)" = $bit64;
            "Windows Updates" = $wsus; "Pending Reboots" = $reboots; "USB Devices" = $usb; "Memory" = $memory; 
            "Services" = $services;"TCP Ports" = $tcp;"UDP Ports"=$udp; "Windows Features" = $features}

    if ($AsJson)
    {
        return ConvertTo-Json -InputObject $result
    }
    else
    {
        if ($AsXML) 
        {
            return ConvertTo-Xml -InputObject $result -Depth 2 -As String
        }
        else
        {
            return $result
        }        
    }
}

Function Ping-Host()
{
    <#
        .Synopsis
            Tests connectivity to a host with a single ping.
        .Description
            The Ping-Host cmdlet sends one ping to the remote host to check for connectivity.
        .Example
            Ping-Host -ComputerName remotehost
            Returns true or false depending on the ping result.
        .Parameter ComputerName
            The name of the host to ping.
        .Inputs
            None
        .Outputs
            [bool]
        .Notes
            NAME: Ping-Host
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>

    Param (
        [Parameter(Position=0,Mandatory=$true)]
        [string]$ComputerName
    )
    return Test-Connection -Quiet -Count 1 -ComputerName $ComputerName
}

Function Test-RegistryEntry ()
{
    <#
        .Synopsis
            Tests the existence of a registry value
        .Description
            The Test-RegistryEntry cmdlet test the extistence of a registry value (property of a key).
        .Example
            Test-RegistryEntry -Key "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing" -PropertyName PendingFileRenameOperations
            Returns true or false depending on the existence of the property
        .Parameter Key
            The registry key to test for containing the property.
        .Parameter PropertyName
            The property name to test for.
        .Inputs
            None
        .Outputs
            [bool]
        .Notes
            NAME: Test-RegistryEntry
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    Param (
        [Parameter(Position=1, Mandatory=$true)]
        [string]$Key,
        [Parameter(Position=2, Mandatory=$true)]
        [string]$PropertyName
    )

    Get-ItemProperty -Path $Key -Name $PropertyName -ErrorAction SilentlyContinue | Out-Null
    return $?
}

Function Get-UDPPorts()
{
    <#
        .Synopsis
            Gets the open UDP Ports on the host
        .Description
            The Get-UDPPorts cmdlet uses netstat to get the open UDP ports, and outputs the ports, the listening local address, and the process using the port.
        .Example
            Get-UDPPorts
            Outputs the open udp ports on the system and the processes associated with them.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-UDPorts
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Invoke-Expression -Command "netstat -ano" | Select-String -Pattern "\s+(UDP)" | Select-Object -Property @{Name="Data";Expression={$_.Line.Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)}} | Where-Object { $_.Data[1] -notmatch "^\[::"} | ForEach-Object {
        
        $localAddress = $_.Data[1].Substring(0, $_.Data[1].LastIndexOf(":"))
        $port = $_.Data[1].Substring($_.Data[1].LastIndexOf(":") + 1)
        $processId = $_.Data[3]
        $processName = Get-Process -Id $processId | Select-Object -ExpandProperty Name
        return New-Object -TypeName PSObject -Property @{"Local Address"=$localAddress;"Port"=$port;"Process Id"=$processId;"Process Name"=$processName}
    }
}
    
Function Get-TCPPorts()
{
    <#
        .Synopsis
            Gets the open TCP Ports on the host
        .Description
            The Get-UDPPorts cmdlet uses Get-NetTCPConnection to get the open TCP ports, and outputs the ports, the listening local address, and the process using the port.
        .Example
            Get-TCPPorts
            Outputs the open tcp ports on the system and the processes associated with them.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-TCPPorts
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    Get-NetTCPConnection -ErrorAction SilentlyContinue | Where-Object {$_.State -eq "Listen" -and $_.LocalAddress -notmatch "^::"} | Select-Object -Property @{Name="Local Address";Expression={$_.LocalAddress}}, 
        @{Name="Port";Expression={$_.LocalPort}},
        @{Name="Process Id";Expression={$_.OwningProcess}},
        @{Name="Process Name";Expression={Get-Process -Id $_.OwningProcess | Select-Object -ExpandProperty Name}}        
} 
    
Function Get-SystemServices()
{
    <#
        .Synopsis
            Gets all services on the host
        .Description
            The Get-SystemServices cmdlet uses Get-Service to get the services on the system.
        .Example
            Get-SystemServices
            Produces the same output as Get-Service, but sets the error action to silently continue.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-SystemServices
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-Service -ErrorAction SilentlyContinue | Select-Object -Property Name,DisplayName,@{Name="Status";Expression={$_.Status.ToString()}}         
}   
    
Function Get-USBDevices()
{
    <#
        .Synopsis
            Gets installed usb devices on the system
        .Description
            The Get-USBDevices cmdlet retrieves USB devices from WMI.
        .Example
            Get-USBDevices
            Returns the installed USB devices
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-USBDevices
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_USBControllerDevice -ErrorAction SilentlyContinue | ForEach-Object { [wmi]($_.Dependent)} | Select-Object -Property Name,Description,DeviceID,HardwareID,
    Service,Present,Status,Manufacturer,@{Name="Install Date";Expression={$_.InstallDate}}
}  

Function Get-PendingReboots()
{
    <#
        .Synopsis
            Identifies any sub system that has a required pending reboot
        .Description
            The Get-PendingReboots cmdlet checks Windows Update, Component Based Servicing, File Rename Operations, Computer Rename, and the CCM Client for pending reboots.
        .Example
            Get-PendingReboots
            Returns the status of each component and if they have a pending reboot.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-PendingReboots
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    $cbsReboot = $false
    $sccmReboot = $false

    $wmi_os = Get-WmiObject -Class Win32_OperatingSystem -Property BuildNumber -ErrorAction SilentlyContinue | Select-Object -ExpandProperty BuildNumber
    $wuReboot = Test-Path -Path "HKLM:\\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired"

    #if OS is Vista/2008 or greater
    if ([Int32]$wmi_os -ge 6001)
    {
          $cbsReboot = (Get-ChildItem -Path "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing" | Select-Object -ExpandProperty Name | Where-Object {$_ -contains "RebootPending"}) -ne $null
    }

    $fileRenameReboot = Test-RegistryEntry -Key "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager" -PropertyName "PendingFileRenameOperations" 

    $computerRenameReboot = (Get-ItemProperty -Path "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ActiveComputerName" -Name ComputerName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ComputerName) -ne 
        (Get-ItemProperty -Path "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName" -Name ComputerName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ComputerName)

    try
    {
        $sccmClientSDK = Invoke-WmiMethod -Class CCM_ClientUtilities -Name "DetermineIfRebootPending" -Namespace "ROOT\\ccm\\ClientSDK" -ErrorAction Stop
        $sccmReboot = $sccmClientSDK.IsHardRebootPending -or $sccmClientSDK.RebootPending
    }
    catch {}

    return New-Object -TypeName PSObject -Property @{"Windows Update"= $wuReboot;"Component Based Servicing"=$cbsReboot;"File Rename"=$fileRenameReboot;"Computer Rename"=$computerRenameReboot;"CCM Client"=$sccmReboot}
}

Function Get-MicrosoftUpdates()
{
    <#
        .Synopsis
            Gets all of the Microsoft Updates installed through the Windows Update Agent.
        .Description
            The Get-MicrosoftUpdates cmdlet checks the installed Microsoft Updates using the Microsoft.Update.Session COM object. It does
            not report on updates that were installed manually or outside of WUA. The cmdlet will report on the action and status of each update.
        .Example
            Get-MicrosoftUpdates
            Returns all Microsoft Update operations on the machine.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-MicrosoftUpdates
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    [regex]$Regex = ï¿½KB\d*�

    $session = New-Object -ComObject Microsoft.Update.Session
    $searcher = $session.CreateUpdateSearcher()
    $history = $searcher.GetTotalHistoryCount()
    $searcher.QueryHistory(1, $history) | Select-Object -Property @{Name="Hot Fix ID";Expression={$Regex.Match($_.Title).Value}},
    Title,
    @{Name="Operation";Expression={switch($_.Operation) {
        1 {"Install"};
        2 {"Uninstall"};
        3 {"Other"}
    }}
    },
    @{Name="Status";Expression={switch($_.ResultCode) {
        1 {"In Progress"};
        2 {"Succeeded"};
        3 {"Succeeded With Errors"};
        4 {"Failed"};
        5 {"Aborted"};
        }}
    },
    @{Name="Date";Expression={(Get-Date($_.Date) -Format FileDateTimeUniversal).ToString()}}
}

Function Get-64BitSoftware()
{
    <#
        .Synopsis
            Gets all 64 bit software installed on the computer.
        .Description
            The Get-64BitSoftware cmdlet gets all of the software registered at "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" that has a DisplayName property.
        .Example
            Get-64BitSoftware
            Returns all of the installed 64 bit software installed.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-64BitSoftware
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


     return Get-ChildItem -Path "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" -ErrorAction SilentlyContinue | Get-ItemProperty | Where-Object {$_.DisplayName} | Select-Object -Property @{Name="Name"; Expression={$_.DisplayName}},
        @{Name="Version";Expression={$_.DisplayVersion}},
       Publisher,
        @{Name="Install Date"; Expression={ (Get-Date ($_.InstallDate.Substring(4,2) + "/" + $_.InstallDate.Substring(6,2) + "/" + $_.InstallDate.Substring(0, 4)) -Format FileDateUniversal).ToString()}},
        @{Name="Install Source";Expression={$_.InstallSource}},
        @{Name="Install Location";Expression={$_.IntallLocation}},
        @{Name="Uninstall String";Expression={$_.UninstallString}}

}

Function Get-32BitSoftware()
{
    <#
        .Synopsis
            Gets all 32 bit software installed on the computer.
        .Description
            The Get-32BitSoftware cmdlet gets all of the software registered at "HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall" that has a DisplayName property.
        .Example
            Get-32BitSoftware
            Returns all of the installed 64 bit software installed.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-64BitSoftware
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-ChildItem -Path "HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall" -ErrorAction SilentlyContinue | Get-ItemProperty | Where-Object {$_.DisplayName} | Select-Object -Property @{Name="Name"; Expression={$_.DisplayName}},
        @{Name="Version";Expression={$_.DisplayVersion}},
       Publisher,
        @{Name="Install Date"; Expression={ (Get-Date ($_.InstallDate.Substring(4,2) + "/" + $_.InstallDate.Substring(6,2) + "/" + $_.InstallDate.Substring(0, 4)) -Format FileDateUniversal).ToString()}},
        @{Name="Install Source";Expression={$_.InstallSource}},
        @{Name="Install Location";Expression={$_.IntallLocation}},
        @{Name="Uninstall String";Expression={$_.UninstallString}}

}

Function Get-NetworkAdapters()
{
    <#
        .Synopsis
            Gets information on network adapters that have an active IP address.
        .Description
            The Get-NetworkAdapters cmdlet retrieves information on every active network adapter retrieved from WMI with an assigned IP address.
        .Example
            Get-NetworkAdapters
            Returns information on active network adapters.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-NetworkAdapters
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue | Where-Object {$_.IPAddress -match '\S+'} | Select-Object @{Name="DHCP Enabled"; Expression={$_.DHCPEnabled}},
        IPAddress,
        @{Name="Default Gateway"; Expression={$_.DefaultIPGateway}},
        @{Name="DNS Domain"; Expression={$_.DNSDomain}},
        Description,
        Index           
}

Function Get-MemoryStatistics()
{
    <#
        .Synopsis
            Gets current information on system memory usage and availability.
        .Description
            The Get-MemoryStatistics cmdlet get information of the total, used, and free memory on the system from the Win32_OperatingSystem WMI class.
        .Example
            Get-MemoryStatistics
            Returns information on current memory usage and availability.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-MemoryStatistics
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue | Select-Object -Property @{Name="Total Physical Memory (MB)"; Expression={$_.TotalVisibleMemorySize/1MB}},
        @{Name="Free Physical Memory (MB)";Expression={$_.FreePhysicalMemory/1MB}},
        @{Name="Used Physical Memory (MB)";Expression={($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/1MB}},
        @{Name="Total Virtual Memory (MB)";Expression={$_.TotalVirtualMemorySize/1MB}},
        @{Name="Free Virtual Memory (MB)";Expression={$_.FreeVirtualMemory/1MB}},
        @{Name="Used Virtual Memory (MB)";Expression={($_.TotalVirtualMemorySize - $_.FreeVirtualMemory)/1MB}}
}

Function Get-OperatingSystem()
{
    <#
        .Synopsis
            Gets information about the currently installed operating system.
        .Description
            The Get-OperatingSystem cmdlet retrieves information from Win32_OperatingSystem about the OS.
        .Example
            Get-OperatingSystem
            Returns information on the installed OS.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-OperatingSystem
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue | Select-Object -Property @{Name="Build Number";Expression={$_.BuildNumber}},
        @{Name="Name"; Expression={$_.Caption}},
        CurrentTimeZone,
        @{Name="Install Date"; Expression={(Get-Date($_.ConvertToDateTime($_.InstallDate)) -Format FileDateTimeUniversal).ToString()}},
        @{Name="Boot Time"; Expression={(Get-Date($_.ConvertToDateTime($_.LastBootUpTime)) -Format FileDateTimeUniversal).ToString()}},
        Manufacturer,
        @{Name="Architecture";Expression={$_.OSArchitecture}},
        @{Name="Serial Number";Expression={$_.SerialNumber}},
        @{Name="Service Pack";Expression={$_.ServicePackMajorVersion.ToString() + "." + $_.ServicePackMinorVersion.ToString()}},
        @{Name="System Device"; Expression={$_.SystemDevice}},
        @{Name="System Directory";Expression={$_.SystemDirectory}},
        @{Name="System Drive";Expression={$_.SystemDrive}},
        Version,
        @{Name="Windows Directory";Expression={$_.WindowsDirectory}} 
}

Function Get-CPU()
{
    <#
        .Synopsis
            Gets information about the CPU on the host.
        .Description
            The Get-CPU cmdlet retrieves information from Win32_Processor about the CPUs on the host.
        .Example
            Get-CPU
            Returns information on the CPUs on the host.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-CPU
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_Processor -ErrorAction SilentlyContinue | Select-Object -Property Name,ProcessorId,MaxClockSpeed,CurrentClockSpeed,NumberOfCores,DeviceID,CurrentVoltage,SocketDesignation,Status,ThreadCount,AddressWidth,DataWidth,Architecture       
}

Function Get-BIOS()
{
    <#
        .Synopsis
            Gets information about the BIOS on the host.
        .Description
            The Get-BIOS cmdlet retrieves information from Win32_BIOS.
        .Example
            Get-BIOS
            Returns information on the BIOS.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-BIOS
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_BIOS -ErrorAction SilentlyContinue | Select-Object -Property "Name","SerialNumber","Version"
}

Function Get-DiskInformation()
{
    <#
        .Synopsis
            Gets information about the attached disks on the system.
        .Description
            The Get-DiskInformation cmdlet retrieves total and free space on disks from Win32_LogicalDisk where "DriveType=3".
        .Example
            Get-DiskInformation
            Returns information on the attached disks.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-DiskInformation
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction SilentlyContinue | Select-Object DeviceID,
        @{Name="Free Space (MB)";Expression={$_.FreeSpace/1MB}},
        @{Name="Size (MB)";Expression={$_.Size/1MB}}    
}

Function Get-ComputerSystemInformation()
{
    <#
        .Synopsis
            Gets general information about the host.
        .Description
            The Get-ComputerSystemInformation cmdlet retrieves basic information about the host.
        .Example
            Get-ComputerSystemInformation
            Returns general information about the system.
        .Inputs
            None
        .Outputs
            [object]
        .Notes
            NAME: Get-ComputerSystemInformation
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    return Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue | Select-Object Name,Domain,Manufacturer,Model
}

Function Get-DnsInformation()
{
    <#
        .Synopsis
            Gets information from DNS about the specified computer.
        .Description
            The Get-DNSInformation cmdlet retrieves DNS entries.
        .Example
            Get-DnsInformation -ComputerName remotecomputer
            Returns all IP addresses associated with the specified computer.
        .Parameter ComputerName
            The host to look up in DNS.
        .Inputs
            None
        .Outputs
            [string[]]
        .Notes
            NAME: Get-DnsInformation
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    Param (
        [Parameter(Position=0,Mandatory=$true)]
        [string]$ComputerName = "localhost"
    )

    $temp = $ErrorActionPreference
    $ErrorActionPreference = 'SilentlyContinue'
    $IPAddresses = [System.Net.Dns]::GetHostAddresses($ComputerName) | Select-Object -ExpandProperty IPAddressToString
    $ErrorActionPreference = $temp
    return $IPAddresses
}

Function Get-WindowsFeatures
{
    <#
        .Synopsis
            Gets information about installed windows features.
        .Description
            The Get-WindowsFeatures cmdlet retrieves the installed features.
        .Example
            Get-WindowsFeatures
            Returns all installed windows features
        .Inputs
            None
        .Outputs
            [string[]]
        .Notes
            NAME: Get-WindowsFeatures
            AUTHOR: Michael Haken
            LASTEDIT: 12/3/2015
        #Requires -Version 2.0
    #>


    $os = Get-WmiObject -Class Win32_OperatingSystem 

    if ($os.ProductType -ne 1)
    {
        return Get-WindowsFeature | Where-Object {$_.Installed -eq $true} | Select-Object Name
    }
    else
    {
        return $null
    }
}