NN.MrfkCommands.psm1

#Region './Private/Register-Autofill.ps1' 0
$Splat = @{
    "CommandName" = "New-MrfkShippingLabel"
    "ParameterName" = "location"
    "ScriptBlock" = {
        param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)

        $AllLocationNames = (Get-SnipeLocations).name | Sort-Object
        $AllLocationNames.Where({
            $_ -like "$wordToComplete*"
        }).ForEach({
            "`"$_`""
        })
    }
}
Register-ArgumentCompleter @Splat
#EndRegion './Private/Register-Autofill.ps1' 16
#Region './Public/Get-MrfkAdmCreds.ps1' 0
function Get-MrfkAdmCreds {
    param (
        [string]$admCredsPath = "$env:USERPROFILE\.creds\MRFK\adm_creds.xml"
    )

    if (!(Test-Path $admCredsPath)) {
        New-MrfkAdmCreds
    }
    
    Import-Clixml $admCredsPath
}
#EndRegion './Public/Get-MrfkAdmCreds.ps1' 12
#Region './Public/Get-MrfkComputerInfo.ps1' 0
function Get-MrfkComputerInfo {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory,ParameterSetName="Get computer by hostname")]$Hostname,
        [Parameter(Mandatory,ParameterSetName="Get computers by username")]$Username,
        $MECMNameSpace = "root/SMS/site_PS1",
        $MECMHost = "sccm-ps.intern.mrfylke.no",
        $DC = "dc01.intern.mrfylke.no"
    )

    begin {
        $RequiredModulesNameArray = @("NN.WindowsSetup")
        $RequiredModulesNameArray.ForEach({
            if (Get-InstalledModule $_ -ErrorAction SilentlyContinue) {
                Import-Module $_ -Force
            } else {
                Install-Module $_ -Force
            }
        })

        #Install RSAT
        Install-RSAT
    }

    process {
        $ComputerExportArr = New-Object -TypeName System.Collections.ArrayList

        $splat = @{
            "Credential" = Get-MrfkAdmCreds
            "ComputerName" = $MECMHost
            "ErrorAction" = "Stop"
        }
        $CimSession = New-CimSession @splat

        switch ($PsCmdlet.ParameterSetName) {
            "Get computer by hostname" {
                [array]$HostnameArr = $Hostname
            }
            "Get computers by username" {
                $splat = @{
                    "Query" = "Select * from SMS_R_System where LastLogonUserName = `"$Username`""
                    "Namespace" = $MECMNameSpace
                    "CimSession" = $CimSession
                }
                [array]$HostnameArr = (Get-CimInstance @splat).Name
            }
        }

        $HostnameArr.ForEach({
            $splat = @{
                "Query" = "Select * from SMS_R_System where name = `"$_`""
                "Namespace" = $MECMNameSpace
                "CimSession" = $CimSession
            }
            $MecmComputer = Get-CimInstance @splat
            
            $splat = @{
                "Query" = @"
select distinct SMS_G_System_PROCESSOR.*
from SMS_R_System
inner join SMS_G_System_PROCESSOR
on SMS_G_System_PROCESSOR.ResourceID = SMS_R_System.ResourceId
where ResourceId = $($MecmComputer.ResourceId)
"@

                "Namespace" = $MECMNameSpace
                "CimSession" = $CimSession
            }
            $CPUInfo = Get-CimInstance @splat
            
            $splat = @{
                "Query" = @"
Select * from SMS_G_System_Computer_System_Product
where ResourceId = $($MecmComputer.ResourceId)
"@

                "Namespace" = $MECMNameSpace
                "CimSession" = $CimSession
            }
            $ModelInfo = Get-CimInstance @splat
            
            $ADComputer = Get-ADComputer $_
            
            $splat = @{
                "Filter" = {objectclass -eq "msFVE-RecoveryInformation"}
                "SearchBase" = $ADComputer.DistinguishedName
                "Properties" = "msFVE-RecoveryPassword"
                "Credential" = Get-MrfkAdmCreds
                "Server" = $DC
            }
            $BitlockerRecoveryKeys = (Get-ADObject @splat)."msFVE-RecoveryPassword"
            
            if ($MecmComputer.agentname) {
                $HeartbeatIndex = $MecmComputer.agentname.IndexOf("Heartbeat Discovery")
                $LastHeartbeat = $MecmComputer.agenttime[$HeartbeatIndex]
            }
            
            $null = $ComputerExportArr.Add(
                [PSCustomObject]@{
                    "Hostname" = $_
                    "LastLoggedOnUser" = $MecmComputer.LastLogonUserName
                    "MACAddresses" = $MecmComputer.MACAddresses
                    "Model" = $ModelInfo.Name
                    "CPUName" = $CPUInfo.Name
                    "SN" = $ModelInfo.IdentifyingNumber
                    "LastHeartbeat" = $LastHeartbeat
                    "BitlockerRecoveryKeys" = $BitlockerRecoveryKeys
                }
            )
        })
        $ComputerExportArr
    }
}
#EndRegion './Public/Get-MrfkComputerInfo.ps1' 112
#Region './Public/Get-MrfkUserInfo.ps1' 0
function Get-MrfkUserInfo {
    [CmdletBinding()]
    param (
        [Parameter(ParameterSetName="username")][string]$Username,
        [Parameter(ParameterSetName="displayname")][string]$DisplayName,
        [Parameter(ParameterSetName="mobilephone")][string]$MobilePhone,
        [switch]$IncludeComputerInfo,
        [switch]$ExpandComputerInfo
    )

    begin {
        $RequiredModulesNameArray = @("NN.WindowsSetup")
        $RequiredModulesNameArray.ForEach({
            if (Get-InstalledModule $_ -ErrorAction SilentlyContinue) {
                Import-Module $_ -Force
            } else {
                Install-Module $_ -Force
            }
        })

        #Install RSAT
        Install-RSAT -WUServerBypass
    }

    process {
        switch ($PsCmdlet.ParameterSetName) {
            "username" {
                $filter = "SamAccountName -like `"$Username`""
            }
            "displayname" {
                $filter = "DisplayName -like `"$DisplayName`""
            }
            "mobilephone" {
                $filter = "MobilePhone -like `"$MobilePhone`""
            }
        }

        #Install required modules
        $RequiredModulesNameArray = @('NN.MrfkCommands')
        $RequiredModulesNameArray.ForEach({
            if (Get-InstalledModule $_ -ErrorAction SilentlyContinue) {
                Import-Module $_ -Force
            } else {
                Install-Module $_ -Force -Repository PSGallery
            }
        })

        #Get userinfo of the ADusers
        $ADUser = Get-ADUser -filter $filter -Properties MobilePhone,DisplayName | Select-Object @(
            "DisplayName","Name","SamAccountName","MobilePhone",
            "UserPrincipalName","Enabled","DistinguishedName"
        )

        #Pick an ADUser if we get multiple hits on the search query
        if ($ADUser -is [array]) {
            $splat = @{
                "Title" = "Found multiple hits on the input. Please select the user."
                "OutputMode" = "Single"
            }
            $ADUser = $ADUser | Out-GridView @splat
        }

        if (!$ADUser) {
            Write-Error -ErrorAction "Stop" -Message "Please select a user before continuing."
        }

        if ($IncludeComputerInfo) {
            $ComputerExportArr = Get-MrfkComputerInfo -Username $ADUser.SamAccountName
            if (!$ExpandComputerInfo) {
                $ADUser | Add-Member -MemberType NoteProperty -Name "Computers" -Value $ComputerExportArr
            }
        }

        #Post output
        $ADUser
        if ($ExpandComputerInfo) {
            $ComputerExportArr
        }
    }
}
#EndRegion './Public/Get-MrfkUserInfo.ps1' 81
#Region './Public/New-MrfkAdmCreds.ps1' 0
function New-MrfkAdmCreds {
    param (
        [string]$admCredsPath = "$env:USERPROFILE\.creds\MRFK\adm_creds.xml"
    )

    #Create parent folders for the file
    $admCredsDir = $admCredsPath.Substring(0, $admCredsPath.lastIndexOf('\'))
    if (!(Test-Path $admCredsDir)) {
        $null = New-Item -ItemType Directory $admCredsDir
    }
    
    #Create adm_creds file
    Get-Credential -Message "Enter your mrfk admin credentials" | Export-Clixml $admCredsPath
}
#EndRegion './Public/New-MrfkAdmCreds.ps1' 15
#Region './Public/New-MrfkShippingLabel.ps1' 0
function New-MrfkShippingLabel {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)][ValidateScript({
            $_ -in (Get-SnipeLocations).name
        })][string]$location,
        [Parameter(Mandatory)][string]$displayname,
        [int]$copies = 1,
        [string]$mobile,
        [string]$PrinterNetworkPath = "\\sr-safecom-sla1\PR-STORLABEL-SSDSK"
    )
    
    begin {
        $RequiredModulesNameArray = @("NN.SnipeIT","NN.WindowsSetup")
        $RequiredModulesNameArray.ForEach({
            if (Get-InstalledModule $_ -ErrorAction SilentlyContinue) {
                Import-Module $_ -Force
            } else {
                Install-Module $_ -Force
            }
        })

        #Install RSAT
        Install-RSAT -WUServerBypass
    }
    
    process {
        #Get the selected locations address
        $locationResult = Get-SnipeLocations -name $location

        $locationName = $locationResult.address
        $address = $locationResult.address2
        $postalCode = $locationResult.zip
        $city = $locationResult.city

        if (!$mobile) {
            #Search AD for phonenumber
            [string]$mobile = (Get-ADUser -Filter {DisplayName -like $displayname} -Properties mobile).mobile
        }

        if ($location) {
            #Get current default printer
            $defaultPrinter = (Get-CimInstance -Class Win32_Printer).where({$_.Default -eq $true}).Name

            #Set printer named PR-STORLABEL-SSDSK to default printer
            if (!(Get-Printer -Name $PrinterNetworkPath -ErrorAction SilentlyContinue)) {
                (New-Object -ComObject WScript.Network).AddWindowsPrinterConnection($PrinterNetworkPath)
            }
            (New-Object -ComObject WScript.Network).SetDefaultPrinter($PrinterNetworkPath)

            #Create new Word document
            $WordObj = New-Object -ComObject Word.Application
            $null = $WordObj.Documents.Add()

            #Set page size and margins
            $WordObj.Selection.PageSetup.PageHeight = "192mm"
            $WordObj.Selection.PageSetup.PageWidth = "102mm"
            $WordObj.Selection.PageSetup.TopMargin = "12,7mm"
            $WordObj.Selection.PageSetup.BottomMargin = "12,7mm"
            $WordObj.Selection.PageSetup.LeftMargin = "12,7mm"
            $WordObj.Selection.PageSetup.RightMargin = "12,7mm"

            #Insert content
            $WordObj.Selection.Font.Bold = 1
            $WordObj.Selection.TypeText("Mottaker:
            "
)
            $WordObj.Selection.Font.Bold = 0
            $WordObj.Selection.TypeText("$displayname
            $mobile"
)
            $WordObj.Selection.TypeParagraph()
            $WordObj.Selection.Font.Bold = 1
            $WordObj.Selection.TypeText("Addresse:
            "
)
            $WordObj.Selection.Font.Bold = 0
            $WordObj.Selection.TypeText("$locationName
            $address
            $postalCode $city"
)

            (1..$copies).ForEach({
                #Send To Default Printer
                $WordObj.PrintOut()
            })

            #Change default printer back to the previous value
            (New-Object -ComObject WScript.Network).SetDefaultPrinter("$defaultPrinter")

            #Close File without saving
            $WordObj.ActiveDocument.Close(0)
            $WordObj.quit() 
        }
    }
}
#EndRegion './Public/New-MrfkShippingLabel.ps1' 93