diff --git a/Private/BatchInvokes.ps1 b/Private/BatchInvokes.ps1 index 174eb7b..adcdfa5 100644 --- a/Private/BatchInvokes.ps1 +++ b/Private/BatchInvokes.ps1 @@ -52,9 +52,11 @@ function Get-PCBatchInvoke { #Adapter $adapter = ($win32_networkadapterconfiguration | Where-Object {$_.IpEnabled -Match "True"} | Select-Object -Expand Description) + <# if($adapter -is [array]){ $adapter = $adapter[0] } + #> #UserName $Username = $PCInfo.CSUserName diff --git a/Private/PCMonitor.ps1 b/Private/PCMonitor.ps1 new file mode 100644 index 0000000..d16adf2 --- /dev/null +++ b/Private/PCMonitor.ps1 @@ -0,0 +1,115 @@ +function Invoke-PCMonitor { + param( + [string[]] $comps + ) + # Ask to notify + $notify = $(Read-Host "Notify with pop-up window? (y/N)") -match "^[yY]" + if ($notify) { + Add-Type -AssemblyName PresentationFramework + } + $sleepTime = $(Read-Host "Checkin interval in seconds (Default: 300 [5 min])") + if (-not ($sleepTime)) { $sleepTime = 300 } + $dogs = @() + # Initialize computer sessions + foreach ($comp in $comps) { + Write-Progress -Activity "Initializing sessions" -Status $comp -PercentComplete ($dogs.Length/$comps.Length) + $dog = [WatchDog]::new($comp) + $null = $dog.Update() + $dogs += $dog + } + Write-Progress -Activity "Initializing sessions" -Completed + while ($true) { + $change = $false + foreach ($dog in $dogs) { + $msg = $dog.ReportChange() + if ($msg) { + $change = $true + if ($notify) { + $null = [System.Windows.MessageBox]::Show($msg) + } + Write-Host "$msg" + } + } + # Update date and time so user knows script hasn't frozen + if (-not ($change)) { + $date = Get-Date -Format "[MM/dd/yy HH:mm:ss]" + Write-Host -NoNewline "$date `r" + } + Start-Sleep $sleepTime + } +} + +class WatchDog { + [string]$Hostname + [System.Management.Automation.Runspaces.PSSession]$Session + [string]$LastUser + WatchDog() { $this.Init(@{})} + WatchDog([hashtable]$Properties) { $this.Init($Properties)} + WatchDog([string]$Hostname) { $this.Init(@{Hostname = $Hostname})} + [void] Init([hashtable]$Properties){ + foreach ($prop in $Properties.Keys) { + $this.$prop = $Properties.$prop + } + } + [string] ToString() { + return ` + "Hostname: $($this.Hostname) `n" + + "Status: $(if ($this.Session) { 'Online' } else { 'Offline' }) `n" + + "User: $($this.LastUser) `n" + } + [WatchDog] Copy() { + $props = @{} + foreach ($prop in $this.PSObject.Properties) { + $props.$($prop.Name) = $prop.Value + } + return [WatchDog]$props + } + # Returns true if a value was updated + [bool] Update() { + $old = $this.Copy() + if (-not (Test-Connection -ComputerName $this.Hostname -Count 1)) { + $this.Session = $null + return ($old.Session) + } + if (-not ($this.Session)) { + $this.Session = New-PSSession -ComputerName $this.Hostname -SessionOption (New-PSSessionOption -NoMachineProfile) + } + $this.LastUser = $(Invoke-Command -Session $this.Session {Get-ComputerInfo}).CSUserName + if($null -eq $this.LastUser){ + + $this.LastUser = (Invoke-Command -Session $this.Session -ScriptBlock {Get-Process Explorer -IncludeUsername | Where-Object { $_.Username -notlike "*SYSTEM" }} ).Username + + if($null -ne $this.LastUser){ + $this.LastUser = "$($this.LastUser) (RDP/Inactive)" + } + else{ + $this.LastUser = $null + } + } + return (($this.Session -ne $old.Session) -or ($this.LastUser -ne $old.LastUser)) + } + # Returns a message describing any changes + [string] ReportChange() { + $old = $this.Copy() + if (-not ($this.Update())) { return $null } + $date = Get-Date -Format "[MM/dd/yy HH:MM:ss]" + if ($old.Session -ne $this.Session) { + if ($old.Session -and $this.Session) { + return "$date $($this.Hostname) | Session re-established" + } elseif ($this.Session) { + return "$date $($this.Hostname) | Online" + } else { + return "$date $($this.Hostname) | Offline" + } + } elseif ($old.LastUser -ne $this.LastUser) { + if ($old.LastUser -and $this.LastUser) { + return "$date $($this.Hostname) | $($old.LastUser) logged off and $($this.LastUser) logged on" + } elseif ($old.LastUser) { + return "$date $($this.Hostname) | $($old.LastUser) logged off" + } else { + return "$date $($this.Hostname) | $($this.LastUser) logged on" + } + } + return $null + } +} \ No newline at end of file diff --git a/Private/UserProfileBackup.ps1 b/Private/UserProfileBackup.ps1 index 12edf29..dbc22eb 100644 --- a/Private/UserProfileBackup.ps1 +++ b/Private/UserProfileBackup.ps1 @@ -112,7 +112,6 @@ $SourceRoot = "\\$Computer\c$\Users\$User" $BackupDestination = "\\SHSCMGSRMC\ProfileBackup" $Destination = "\\SHSCMGSRMC\ProfileBackup\$DestinationFileName" - $CopiedUserDesktop = Join-Path -Path $Destination -ChildPath "Desktop" #region BACKUP if($ConfirmUser -eq 'y'){ @@ -155,6 +154,7 @@ Write-Warning "Invalid input please restart script" return } + #Creates a log file New-Item -Path $Destination\backuplog.txt -Force | Write-Verbose $log = Join-Path -Path $Destination -ChildPath backuplog.txt @@ -171,6 +171,7 @@ #Cleans up Citrix Shortcuts Write-Host "Removing Citrix Shortcuts from backup" + $CopiedUserDesktop = Join-Path -Path $Destination -ChildPath "Desktop" $Shortcuts = Get-ChildItem -Path $CopiedUserDesktop -Filter *.lnk foreach($Shortcut in $Shortcuts){ diff --git a/Public/Get-PC.ps1 b/Public/Get-PC.ps1 index 2420214..b957c96 100644 --- a/Public/Get-PC.ps1 +++ b/Public/Get-PC.ps1 @@ -4,7 +4,7 @@ #region Module Import Block -$ErrorActionPreference = 'SilentlyContinue' +#$ErrorActionPreference = 'SilentlyContinue' #DevStage can take either Dev or Prod as values $devStage = 'Dev' #Locations for dev build and prod build @@ -93,6 +93,7 @@ Function Get-PC { [switch]$InstallNet35, [switch]$Jobsprinters, [Switch]$LogOffUser, + [Switch]$Monitor, [Switch]$NextPrinterName, [switch]$Orion, [Switch]$PatchNotes, @@ -529,7 +530,7 @@ Function Get-PC { Get-InstallNet35 $comp continue } - + #Checks if there is a WinRM service error #TODO Re-evaluate where we want the WSNetwork test #$WSNetworkTest = Test-WSMan -ComputerName $comp @@ -543,6 +544,7 @@ Function Get-PC { if ($adTest) { Write-Warning "$comp is either disabled or off the domain" } + Write-Progress -Activity "Looking up computer in AD" -Completed } #Direct SCCM Queries @@ -580,6 +582,12 @@ Function Get-PC { } } + + # Monitor list of PCs for change in online status or + if ($Monitor) { + Invoke-PCMonitor $getPCComputers + return + } #This is the get-pc of get-pc. It collects all the data from the computers and puts it in an array to be outputed $outPutArray += Get-PCBatchInvoke($getPCComputers)