diff --git a/Modules/.gitignore b/Modules/.gitignore new file mode 100644 index 0000000..b9ee499 --- /dev/null +++ b/Modules/.gitignore @@ -0,0 +1,2 @@ +Config.psd1 +*git-ignore* \ No newline at end of file diff --git a/Modules/.psd1 b/Modules/.psd1 new file mode 100644 index 0000000..bb10006 Binary files /dev/null and b/Modules/.psd1 differ diff --git a/Modules/.psm1 b/Modules/.psm1 new file mode 100644 index 0000000..c7d149f --- /dev/null +++ b/Modules/.psm1 @@ -0,0 +1,33 @@ +#region get public and private function definition files. +$Public = @( + Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -Exclude "*.Tests.ps1" -ErrorAction SilentlyContinue +) +$Private = @( + Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -Exclude "*.Tests.ps1" -ErrorAction SilentlyContinue +) +#endregion + +#region source the files +foreach ($Function in @($Public + $Private)) { + $FunctionPath = $Function.fullname + try { + . $FunctionPath # dot source function + } catch { + Write-Error -Message "Failed to import function at $($FunctionPath): $_" + } +} +#endregion + +#region read in or create an initial config file and variable +#. "$PSScriptRoot\Config.ps1" # uncomment to source config parsing logic +#endregion + +#region set variables visible to the module and its functions only +$Date = Get-Date -UFormat "%Y.%m.%d" +$Time = Get-Date -UFormat "%H:%M:%S" +. "$PSScriptRoot\Colors.ps1" +#endregion + +#region export Public functions ($Public.BaseName) for WIP modules +Export-ModuleMember -Function $Public.Basename +#endregion diff --git a/Modules/Colors.ps1 b/Modules/Colors.ps1 new file mode 100644 index 0000000..e2f73ab --- /dev/null +++ b/Modules/Colors.ps1 @@ -0,0 +1,21 @@ +# Color variables for easy peasy splatting :-) +$Green = @{ + Background = 'Black' + Foreground = 'Green' +} +$Cyan = @{ + Background = 'Black' + Foreground = 'Cyan' +} +$Magenta = @{ + Background = 'Black' + Foreground = 'Magenta' +} +$Red = @{ + Background = 'Black' + Foreground = 'Red' +} +$Yellow = @{ + Background = 'Black' + Foreground = 'Yellow' +} diff --git a/Modules/Config.ps1 b/Modules/Config.ps1 new file mode 100644 index 0000000..3ea771d --- /dev/null +++ b/Modules/Config.ps1 @@ -0,0 +1,32 @@ +#region read in or create an initial config file and variable +$ConfigFile = "Config.psd1" + +if (Test-Path "$PSScriptRoot\$ConfigFile") { + try { + $Params = @{ + BaseDirectory = $PSScriptRoot + FileName = $ConfigFile + } + $Config = Import-LocalizedData @Params + foreach ($variable in $Config.keys) { + Write-Verbose "Setting $var variable." + New-Variable -Name "$variable" -Value $Config.$variable -Force + Export-ModuleMember -Variable $variable + } + } catch { + Write-Warning "Invalid configuration data in $ConfigFile." + Write-Warning "Please fill out or correct $PSScriptRoot\$ConfigFile." + Write-Verbose $_.Exception.Message + Write-Verbose $_.InvocationInfo.ScriptName + Write-Verbose $_.InvocationInfo.PositionMessage + } +} else { + @" +@{ + Variable = "" +} +"@ | Out-File -Encoding UTF8 -FilePath "$PSScriptRoot\$ConfigFile" + Write-Warning "Generated $PSScriptRoot\$ConfigFile." + Write-Warning "Please edit $ConfigFile and re-import module." +} +#endregion diff --git a/Modules/README.MD b/Modules/README.MD index 8190158..a110965 100644 --- a/Modules/README.MD +++ b/Modules/README.MD @@ -1 +1,4 @@ -Function module packages go here \ No newline at end of file +# Powershell Module + +*Module Description* + diff --git a/Modules/Tatux.Utils/Public/Invoke-NativeExpression.ps1 b/Modules/Tatux.Utils/Public/Invoke-NativeExpression.ps1 new file mode 100644 index 0000000..64e349d --- /dev/null +++ b/Modules/Tatux.Utils/Public/Invoke-NativeExpression.ps1 @@ -0,0 +1,18 @@ +function Invoke-NativeExpression { + param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)] + [string]$Expression + ) + + process { + $executable, $arguments = $expression -split ' ' + $arguments = $arguments | foreach { "'$_'" } + $arguments = $arguments -join ' ' + $command = $executable + ' ' + $arguments + + if ($command) { + Write-Verbose "Invoking '$command'" + Invoke-Expression -command $command + } + } +} \ No newline at end of file diff --git a/Modules/Tatux.Utils/Public/New-NTModuleTemplate.ps1 b/Modules/Tatux.Utils/Public/New-NTModuleTemplate.ps1 index 177836e..7adfafd 100644 --- a/Modules/Tatux.Utils/Public/New-NTModuleTemplate.ps1 +++ b/Modules/Tatux.Utils/Public/New-NTModuleTemplate.ps1 @@ -62,7 +62,7 @@ function New-NTModuleTemplate { Param ( [Parameter(Mandatory, ValueFromPipeline)] [string[]]$Names, - [System.IO.DirectoryInfo]$Path = $(Get-Item -Path .\).FullName, + [System.IO.DirectoryInfo]$Path = $PWD.Path, [string]$Author = $env:USER, [string]$CompanyName = "", [string]$Description = "Module Description", @@ -77,7 +77,6 @@ function New-NTModuleTemplate { $Colors = "$Templates\Colors.ps1" $GitIgnore = "$Templates\GitIgnore" } - process { foreach ($Name in $Names) { $Directories = @( @@ -87,30 +86,65 @@ function New-NTModuleTemplate { 'Public\Tests' 'Private\Tests' ) - foreach ($Directory in $Directories) { - New-Item -Name "$Path\$Name\$Directory" -ItemType 'Container' - Set-Content -Value "# $Name $Directory Functions" -Path "$Path\$Name\$Directory\README.md" - Write-Verbose "Generated $Path\$Name\$Directory." + $ParentPath = Join-Path -Path $Path -ChildPath $Name + try { + if (-not (Test-Path -Path $ParentPath)) { + Write-Verbose "Creating Module path: $ParentPath." + New-Item -Path $ParentPath -Type Directory -ErrorAction Stop + } } - - Set-Content -Value "# $Name Powershell Module" -Path "$Path\$Name\README.md" - Add-Content -Value "`n*$Description*`n" -Path "$Path\$Name\README.md" - - Copy-Item $Config "$Path\$Name\Config.ps1" - Write-Verbose "Copied $Config to $Path\$Name\Config.ps1." - + catch { + Write-Verbose "Failed to create Module path: $ParentPath." + $_ + break + } + try { + foreach ($Directory in $Directories) { + $FullPath = Join-Path -Path $ParentPath -ChildPath $Directory + if (-not (Test-Path -Path $FullPath)) { + Write-Verbose "Creating path: $FullPath." + New-Item -Path $FullPath -Type Directory -ErrorAction Stop + Write-Verbose "Created path: $FullPath." + } + $ReadmePath = Join-Path -Path $FullPath -ChildPath "README.md" + Set-Content -Value "# $Name $Directory" -Path $ReadmePath -ErrorAction Stop + } + } + catch { + Write-Verbose "Failed to create path: $FullPath." + $_ + break + } + + $ReadmePath = Join-Path -Path $Path -ChildPath "$Name\README.md" + Set-Content -Value "# $Name Powershell Module" -Path $ReadmePath + Add-Content -Value "`n*$Description*`n" -Path $ReadmePath + + $ConfigPath = Join-Path -Path $Path -ChildPath "$Name\Config.ps1" + if (Test-Path -Path $Config) { + Copy-Item $Config $ConfigPath + Write-Verbose "Copied $Config to $ConfigPath." + } + if ($UncommentConfig) { - (Get-Content $Module) -Replace ('\#\.\s', '. ') | - Set-Content "$Path\$Name\$Name.psm1" + $ModuleContent = Get-Content $Module + $ModulePath = Join-Path -Path $Path -ChildPath "$Name\$Name.psm1" + $ModuleContent -Replace ('\#\.\s', '. ') | Set-Content $ModulePath } else { - Copy-Item $Module "$Path\$Name\$Name.psm1" + $ModulePath = Join-Path -Path $Path -ChildPath "$Name\$Name.psm1" + if (Test-Path -Path $Module) { + Copy-Item $Module $ModulePath + } } - Write-Verbose "Copied $Module to $Path\$Name\$Name.psm1." - - Copy-Item $Colors "$Path\$Name\Colors.ps1" - Write-Verbose "Copied $Colors to $Path\$Name\Colors.ps1." - + Write-Verbose "Copied $Module to $ModulePath." + + $ColorsPath = Join-Path -Path $Path -ChildPath "$Name\Colors.ps1" + if (Test-Path -Path $Colors) { + Copy-Item $Colors $ColorsPath + Write-Verbose "Copied $Colors to $ColorsPath." + } + $Params = @{ Path = "$Path\$Name\$Name.psd1" Author = $Author @@ -126,9 +160,9 @@ function New-NTModuleTemplate { } New-ModuleManifest @Params Write-Verbose "Generated $Module manifest at $Path\$Name\$Name.psd1." - + Copy-Item $GitIgnore "$Path\$Name\.gitignore" Write-Verbose "Copied $GitIgnore to $Path\$Name\.gitignore." } } -} +} \ No newline at end of file diff --git a/Modules/Tatux.Win.Admin/.gitignore b/Modules/Tatux.Win.Admin/.gitignore new file mode 100644 index 0000000..b9ee499 --- /dev/null +++ b/Modules/Tatux.Win.Admin/.gitignore @@ -0,0 +1,2 @@ +Config.psd1 +*git-ignore* \ No newline at end of file diff --git a/Modules/Tatux.Win.Admin/Classes/README.md b/Modules/Tatux.Win.Admin/Classes/README.md new file mode 100644 index 0000000..1b51d1b --- /dev/null +++ b/Modules/Tatux.Win.Admin/Classes/README.md @@ -0,0 +1 @@ +# Tatux.Win.Admin Classes diff --git a/Modules/Tatux.Win.Admin/Classes/Taskbar.cs b/Modules/Tatux.Win.Admin/Classes/Taskbar.cs new file mode 100644 index 0000000..61d764d --- /dev/null +++ b/Modules/Tatux.Win.Admin/Classes/Taskbar.cs @@ -0,0 +1,33 @@ +using System; +using System.Runtime.InteropServices; + +public class Taskbar +{ + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern IntPtr FindWindow( + string lpClassName, + string lpWindowName); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); + + public static bool IsTaskbarLoaded() + { + var taskbarHandle = FindWindow("Shell_traywnd", ""); + var startButtonHandle = FindWindowEx(taskbarHandle, IntPtr.Zero, "Start", null); + return taskbarHandle != IntPtr.Zero && startButtonHandle != IntPtr.Zero; + } + + public static IntPtr GetTaskbarHandle() + { + var taskbarHandle = FindWindow("Shell_traywnd", ""); + var startButtonHandle = FindWindowEx(taskbarHandle, IntPtr.Zero, "Start", null); + return taskbarHandle; + } + public static IntPtr GetTaskbarStartHandle() + { + var taskbarHandle = FindWindow("Shell_traywnd", ""); + var startButtonHandle = FindWindowEx(taskbarHandle, IntPtr.Zero, "Start", null); + return startButtonHandle; + } +} \ No newline at end of file diff --git a/Modules/Tatux.Win.Admin/Colors.ps1 b/Modules/Tatux.Win.Admin/Colors.ps1 new file mode 100644 index 0000000..e2f73ab --- /dev/null +++ b/Modules/Tatux.Win.Admin/Colors.ps1 @@ -0,0 +1,21 @@ +# Color variables for easy peasy splatting :-) +$Green = @{ + Background = 'Black' + Foreground = 'Green' +} +$Cyan = @{ + Background = 'Black' + Foreground = 'Cyan' +} +$Magenta = @{ + Background = 'Black' + Foreground = 'Magenta' +} +$Red = @{ + Background = 'Black' + Foreground = 'Red' +} +$Yellow = @{ + Background = 'Black' + Foreground = 'Yellow' +} diff --git a/Modules/Tatux.Win.Admin/Config.ps1 b/Modules/Tatux.Win.Admin/Config.ps1 new file mode 100644 index 0000000..3ea771d --- /dev/null +++ b/Modules/Tatux.Win.Admin/Config.ps1 @@ -0,0 +1,32 @@ +#region read in or create an initial config file and variable +$ConfigFile = "Config.psd1" + +if (Test-Path "$PSScriptRoot\$ConfigFile") { + try { + $Params = @{ + BaseDirectory = $PSScriptRoot + FileName = $ConfigFile + } + $Config = Import-LocalizedData @Params + foreach ($variable in $Config.keys) { + Write-Verbose "Setting $var variable." + New-Variable -Name "$variable" -Value $Config.$variable -Force + Export-ModuleMember -Variable $variable + } + } catch { + Write-Warning "Invalid configuration data in $ConfigFile." + Write-Warning "Please fill out or correct $PSScriptRoot\$ConfigFile." + Write-Verbose $_.Exception.Message + Write-Verbose $_.InvocationInfo.ScriptName + Write-Verbose $_.InvocationInfo.PositionMessage + } +} else { + @" +@{ + Variable = "" +} +"@ | Out-File -Encoding UTF8 -FilePath "$PSScriptRoot\$ConfigFile" + Write-Warning "Generated $PSScriptRoot\$ConfigFile." + Write-Warning "Please edit $ConfigFile and re-import module." +} +#endregion diff --git a/Modules/Tatux.Win.Admin/Private/README.md b/Modules/Tatux.Win.Admin/Private/README.md new file mode 100644 index 0000000..26be526 --- /dev/null +++ b/Modules/Tatux.Win.Admin/Private/README.md @@ -0,0 +1 @@ +# Tatux.Win.Admin Private diff --git a/Modules/Tatux.Win.Admin/Private/Tests/README.md b/Modules/Tatux.Win.Admin/Private/Tests/README.md new file mode 100644 index 0000000..a19a27b --- /dev/null +++ b/Modules/Tatux.Win.Admin/Private/Tests/README.md @@ -0,0 +1 @@ +# Tatux.Win.Admin Private\Tests diff --git a/Modules/Tatux.Win.Admin/Public/README.md b/Modules/Tatux.Win.Admin/Public/README.md new file mode 100644 index 0000000..8bb3c59 --- /dev/null +++ b/Modules/Tatux.Win.Admin/Public/README.md @@ -0,0 +1 @@ +# Tatux.Win.Admin Public diff --git a/Modules/Tatux.Win.Admin/Public/Test-WindowsTaskbar.ps1 b/Modules/Tatux.Win.Admin/Public/Test-WindowsTaskbar.ps1 new file mode 100644 index 0000000..4f3195f --- /dev/null +++ b/Modules/Tatux.Win.Admin/Public/Test-WindowsTaskbar.ps1 @@ -0,0 +1,27 @@ +# This function determines if the Windows Taskbar is loaded using a c# class. +function Test-WindowsTaskbar { + begin { + try { + if (-not ([System.Management.Automation.PSTypeName]'Taskbar').Type) { + Add-Type -Path "$PSScriptRoot\..\Classes\Taskbar.cs" -ErrorAction Stop + } + + } + catch { + Write-Error "Failed to load Taskbar class." + $_ + break + } + } + process { + $taskbarStatus = [Taskbar]::IsTaskbarLoaded() + if ($taskbarStatus) { + Write-Verbose "Taskbar is visible." + $true + } + else { + Write-Verbose "Taskbar is not visible." + $false + } + } +} \ No newline at end of file diff --git a/Modules/Tatux.Win.Admin/Public/Tests/README.md b/Modules/Tatux.Win.Admin/Public/Tests/README.md new file mode 100644 index 0000000..a112d83 --- /dev/null +++ b/Modules/Tatux.Win.Admin/Public/Tests/README.md @@ -0,0 +1 @@ +# Tatux.Win.Admin Public\Tests diff --git a/Modules/Tatux.Win.Admin/README.md b/Modules/Tatux.Win.Admin/README.md new file mode 100644 index 0000000..494b3d4 --- /dev/null +++ b/Modules/Tatux.Win.Admin/README.md @@ -0,0 +1,4 @@ +# Tatux.Win.Admin Powershell Module + +*Module Description* + diff --git a/Modules/Tatux.Win.Admin/Tatux.Win.Admin.psd1 b/Modules/Tatux.Win.Admin/Tatux.Win.Admin.psd1 new file mode 100644 index 0000000..a3b30bb Binary files /dev/null and b/Modules/Tatux.Win.Admin/Tatux.Win.Admin.psd1 differ diff --git a/Modules/Tatux.Win.Admin/Tatux.Win.Admin.psm1 b/Modules/Tatux.Win.Admin/Tatux.Win.Admin.psm1 new file mode 100644 index 0000000..c7d149f --- /dev/null +++ b/Modules/Tatux.Win.Admin/Tatux.Win.Admin.psm1 @@ -0,0 +1,33 @@ +#region get public and private function definition files. +$Public = @( + Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -Exclude "*.Tests.ps1" -ErrorAction SilentlyContinue +) +$Private = @( + Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -Exclude "*.Tests.ps1" -ErrorAction SilentlyContinue +) +#endregion + +#region source the files +foreach ($Function in @($Public + $Private)) { + $FunctionPath = $Function.fullname + try { + . $FunctionPath # dot source function + } catch { + Write-Error -Message "Failed to import function at $($FunctionPath): $_" + } +} +#endregion + +#region read in or create an initial config file and variable +#. "$PSScriptRoot\Config.ps1" # uncomment to source config parsing logic +#endregion + +#region set variables visible to the module and its functions only +$Date = Get-Date -UFormat "%Y.%m.%d" +$Time = Get-Date -UFormat "%H:%M:%S" +. "$PSScriptRoot\Colors.ps1" +#endregion + +#region export Public functions ($Public.BaseName) for WIP modules +Export-ModuleMember -Function $Public.Basename +#endregion diff --git a/Modules/tatux.net/.gitignore b/Modules/tatux.net/.gitignore new file mode 100644 index 0000000..b9ee499 --- /dev/null +++ b/Modules/tatux.net/.gitignore @@ -0,0 +1,2 @@ +Config.psd1 +*git-ignore* \ No newline at end of file diff --git a/Modules/tatux.net/Classes/README.md b/Modules/tatux.net/Classes/README.md new file mode 100644 index 0000000..a7e17cf --- /dev/null +++ b/Modules/tatux.net/Classes/README.md @@ -0,0 +1 @@ +# tatux.net Classes Functions diff --git a/Modules/tatux.net/Colors.ps1 b/Modules/tatux.net/Colors.ps1 new file mode 100644 index 0000000..e2f73ab --- /dev/null +++ b/Modules/tatux.net/Colors.ps1 @@ -0,0 +1,21 @@ +# Color variables for easy peasy splatting :-) +$Green = @{ + Background = 'Black' + Foreground = 'Green' +} +$Cyan = @{ + Background = 'Black' + Foreground = 'Cyan' +} +$Magenta = @{ + Background = 'Black' + Foreground = 'Magenta' +} +$Red = @{ + Background = 'Black' + Foreground = 'Red' +} +$Yellow = @{ + Background = 'Black' + Foreground = 'Yellow' +} diff --git a/Modules/tatux.net/Config.ps1 b/Modules/tatux.net/Config.ps1 new file mode 100644 index 0000000..3ea771d --- /dev/null +++ b/Modules/tatux.net/Config.ps1 @@ -0,0 +1,32 @@ +#region read in or create an initial config file and variable +$ConfigFile = "Config.psd1" + +if (Test-Path "$PSScriptRoot\$ConfigFile") { + try { + $Params = @{ + BaseDirectory = $PSScriptRoot + FileName = $ConfigFile + } + $Config = Import-LocalizedData @Params + foreach ($variable in $Config.keys) { + Write-Verbose "Setting $var variable." + New-Variable -Name "$variable" -Value $Config.$variable -Force + Export-ModuleMember -Variable $variable + } + } catch { + Write-Warning "Invalid configuration data in $ConfigFile." + Write-Warning "Please fill out or correct $PSScriptRoot\$ConfigFile." + Write-Verbose $_.Exception.Message + Write-Verbose $_.InvocationInfo.ScriptName + Write-Verbose $_.InvocationInfo.PositionMessage + } +} else { + @" +@{ + Variable = "" +} +"@ | Out-File -Encoding UTF8 -FilePath "$PSScriptRoot\$ConfigFile" + Write-Warning "Generated $PSScriptRoot\$ConfigFile." + Write-Warning "Please edit $ConfigFile and re-import module." +} +#endregion diff --git a/Modules/tatux.net/Private/README.md b/Modules/tatux.net/Private/README.md new file mode 100644 index 0000000..a5df128 --- /dev/null +++ b/Modules/tatux.net/Private/README.md @@ -0,0 +1 @@ +# tatux.net Private Functions diff --git a/Modules/tatux.net/Private/Tests/README.md b/Modules/tatux.net/Private/Tests/README.md new file mode 100644 index 0000000..9e5938a --- /dev/null +++ b/Modules/tatux.net/Private/Tests/README.md @@ -0,0 +1 @@ +# tatux.net Private\Tests Functions diff --git a/Modules/tatux.net/Public/Get-NTTCPConnectionInfo.ps1 b/Modules/tatux.net/Public/Get-NTTCPConnectionInfo.ps1 new file mode 100644 index 0000000..3b018c9 --- /dev/null +++ b/Modules/tatux.net/Public/Get-NTTCPConnectionInfo.ps1 @@ -0,0 +1,185 @@ +<# + .SYNOPSIS + Using the legacy 'netstat' to parse information about TCP connections on a host + + .DESCRIPTION + Gather details from netstat about TCP connection an a Windows host, this should be as backward compatible as possible to allow the widest application. + + .PARAMETER DisplayExecutable + Displays the executable involved in creating each connection or listening port. In some cases well-known executables host multiple independent components, and in these cases the sequence of components involved in creating the connection or listening port is displayed. In this case the executable name is in [] at the bottom, on top is the component it called, and so forth until TCP/IP was reached. Note that this option can be time-consuming and will fail unless you have sufficient permissions. + + .PARAMETER ResolveAddress + Resolves the remote hosts DNS name if possible + + .PARAMETER IgnoreLoopback + Displays only locally assigned address connection info + + .PARAMETER ComputerName + A remote host to run the command on + + .EXAMPLE + PS C:\> Get-NTTCPConnectionInfo + + .OUTPUTS + object, object +#> +function Get-NTTCPConnectionInfo { + [CmdletBinding(DefaultParameterSetName = 'Default', + ConfirmImpact = 'None')] + [OutputType([object], ParameterSetName = 'Default')] + [OutputType([object], ParameterSetName = 'Executable')] + [OutputType([object])] + param + ( + [Parameter(ParameterSetName = 'Executable')] + [Alias('b')] + [switch]$DisplayExecutable, + [Parameter(ParameterSetName = 'Default')] + [Parameter(ParameterSetName = 'Executable')] + [Alias('f')] + [switch]$ResolveAddress, + [Parameter(ParameterSetName = 'Default')] + [Parameter(ParameterSetName = 'Executable')] + [switch]$IgnoreLoopback, + [Parameter(ParameterSetName = 'Default')] + [Parameter(ParameterSetName = 'Executable')] + [Alias('cn')] + [string]$ComputerName = 'localhost' + ) + + BEGIN { + # Creating the properties for the switches. + # Main Properties + $MainProps = [ordered]@{ + protocol = "" + localaddress = "" + remoteaddress = "" + state = "" + } + + # Executable properties + $ExecutableProps = [ordered]@{ + process = "" -as [System.Diagnostics.Process] + } + # Limit default properties to display on the process output + # so we can maintain the object integrity whiles being selective about default values + $defaultDisplaySet = "ProcessName", "ID" + $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet', [string[]]$defaultDisplaySet) + # We add this to the process object to apply our limiting + $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet) + } + PROCESS { + switch ($PSCmdlet.ParameterSetName) { + "Executable" { + if ($ResolveAddress) { + $MainProps = $MainProps + $ExecutableProps + try { + netstat -p tcp -o -f | ForEach-Object -Process { + if ([string]::IsNullOrEmpty($_)) { continue } + $NTTCPObj = New-Object system.collections.arraylist + $_.split('') | Foreach-Object -Process { + if ([string]::IsNullOrEmpty($_) -eq $false) { + $NTTCPObj.Add($_) | Out-Null + } + } + $obj = New-Object System.Management.Automation.PSObject -Property $MainProps + + # Getting Process info + $Process = Get-Process -Id $NTTCPObj[5] | Select-Object -Property * + + $Process | Add-Member MemberSet PSStandardMembers $PSStandardMembers + $obj.protocol = $NTTCPObj[0] + $obj.localaddress = $NTTCPObj[1] + $obj.remoteaddress = $NTTCPObj[2] + $obj.state = $NTTCPObj[3] + $Obj.process = $Process + $obj + } + } + catch { + $_ + } + } + else { + $MainProps = $MainProps + $ExecutableProps + try { + netstat -p tcp -o | ForEach-Object -Process { + if ([string]::IsNullOrEmpty($_)) { continue } + $NTTCPObj = New-Object system.collections.arraylist + $_.split('') | Foreach-Object -Process { + if ([string]::IsNullOrEmpty($_) -eq $false) { + $NTTCPObj.Add($_) | Out-Null + } + } + $obj = New-Object System.Management.Automation.PSObject -Property $MainProps + + # Getting Process info + $Process = Get-Process -Id $NTTCPObj[5] | Select-Object -Property * + + $Process | Add-Member MemberSet PSStandardMembers $PSStandardMembers + $obj.protocol = $NTTCPObj[0] + $obj.localaddress = $NTTCPObj[1] + $obj.remoteaddress = $NTTCPObj[2] + $obj.state = $NTTCPObj[3] + $Obj.process = $Process + $obj + } + } + catch { + $_ + } + } + } + "Default" { + if ($ResolveAddress) { + try { + netstat -p tcp -f | ForEach-Object -Process { + if ([string]::IsNullOrEmpty($_)) { continue } + $NTTCPObj = New-Object system.collections.arraylist + $_.split('') | Foreach-Object -Process { + if ([string]::IsNullOrEmpty($_) -eq $false) { + $NTTCPObj.Add($_) | Out-Null + } + } + $obj = New-Object System.Management.Automation.PSObject -Property $MainProps + $obj.protocol = $NTTCPObj[0] + $obj.localaddress = $NTTCPObj[1] + $obj.remoteaddress = $NTTCPObj[2] + $obj.state = $NTTCPObj[3] + $obj + } + } + catch { + $_ + } + } + else { + try { + netstat -p tcp | ForEach-Object -Process { + if ([string]::IsNullOrEmpty($_)) { continue } + $NTTCPObj = New-Object system.collections.arraylist + $_.split('') | Foreach-Object -Process { + if ([string]::IsNullOrEmpty($_) -eq $false) { + $NTTCPObj.Add($_) | Out-Null + } + } + $obj = New-Object System.Management.Automation.PSObject -Property $MainProps + $obj.protocol = $NTTCPObj[0] + $obj.localaddress = $NTTCPObj[1] + $obj.remoteaddress = $NTTCPObj[2] + $obj.state = $NTTCPObj[3] + $obj + } + } + catch { + $_ + } + } + } + Default { } + } + } + END { + + } +} diff --git a/Modules/tatux.net/Public/README.md b/Modules/tatux.net/Public/README.md new file mode 100644 index 0000000..2f70b8f --- /dev/null +++ b/Modules/tatux.net/Public/README.md @@ -0,0 +1 @@ +# tatux.net Public Functions diff --git a/Modules/tatux.net/Public/Tests/README.md b/Modules/tatux.net/Public/Tests/README.md new file mode 100644 index 0000000..e5dca58 --- /dev/null +++ b/Modules/tatux.net/Public/Tests/README.md @@ -0,0 +1 @@ +# tatux.net Public\Tests Functions diff --git a/Modules/tatux.net/README.md b/Modules/tatux.net/README.md new file mode 100644 index 0000000..5429c55 --- /dev/null +++ b/Modules/tatux.net/README.md @@ -0,0 +1,4 @@ +# tatux.net Powershell Module + +*Admin network based tools, providing backwards compatibility for older OS types* + diff --git a/Modules/tatux.net/tatux.net.psd1 b/Modules/tatux.net/tatux.net.psd1 new file mode 100644 index 0000000..675c3b7 --- /dev/null +++ b/Modules/tatux.net/tatux.net.psd1 @@ -0,0 +1,132 @@ +# +# Module manifest for module 'tatux.net' +# +# Generated by: Nigel Tatschner +# +# Generated on: 11/01/2021 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'tatux.net' + +# Version number of this module. +ModuleVersion = '0.0.1' + +# Supported PSEditions +# CompatiblePSEditions = @() + +# ID used to uniquely identify this module +GUID = '699172df-81aa-4d37-b4e9-a26e6c4e8bdf' + +# Author of this module +Author = 'Nigel Tatschner' + +# Company or vendor of this module +CompanyName = 'Tatux Solutions' + +# Copyright statement for this module +Copyright = '(c) 2021 Nigel Tatschner. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'Admin network based tools, providing backwards compatibility for older OS types' + +# Minimum version of the PowerShell engine required by this module +# PowerShellVersion = '' + +# Name of the PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# ClrVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +RequiredModules = @('tatux.utils') + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +# NestedModules = @() + +# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. +FunctionsToExport = '*' + +# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. +CmdletsToExport = '*' + +# Variables to export from this module +VariablesToExport = '*' + +# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. +AliasesToExport = '*' + +# DSC resources to export from this module +# DscResourcesToExport = @() + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + # Tags = @() + + # A URL to the license for this module. + # LicenseUri = '' + + # A URL to the main website for this project. + # ProjectUri = '' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + # ReleaseNotes = '' + + # Prerelease string of this module + # Prerelease = '' + + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false + + # External dependent modules of this module + # ExternalModuleDependencies = @() + + } # End of PSData hashtable + +} # End of PrivateData hashtable + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + diff --git a/Modules/tatux.net/tatux.net.psm1 b/Modules/tatux.net/tatux.net.psm1 new file mode 100644 index 0000000..771d2cf --- /dev/null +++ b/Modules/tatux.net/tatux.net.psm1 @@ -0,0 +1,34 @@ +#region get public and private function definition files. +$Public = @( + Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -Exclude "*.Tests.ps1" -ErrorAction SilentlyContinue +) +$Private = @( + Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -Exclude "*.Tests.ps1" -ErrorAction SilentlyContinue +) +#endregion + +#region source the files +foreach ($Function in @($Public + $Private)) { + $FunctionPath = $Function.fullname + try { + . $FunctionPath # dot source function + } + catch { + Write-Error -Message "Failed to import function at $($FunctionPath): $_" + } +} +#endregion + +#region read in or create an initial config file and variable +#. "$PSScriptRoot\Config.ps1" # uncomment to source config parsing logic +#endregion + +#region set variables visible to the module and its functions only +$Date = Get-Date -UFormat "%Y.%m.%d" +$Time = Get-Date -UFormat "%H:%M:%S" +. "$PSScriptRoot\Colors.ps1" +#endregion + +#region export Public functions ($Public.BaseName) for WIP modules +Export-ModuleMember -Function $Public.Basename +#endregion diff --git a/PSApps/AdminTools/.gitignore b/PSApps/AdminTools/.gitignore new file mode 100644 index 0000000..6d4ced6 --- /dev/null +++ b/PSApps/AdminTools/.gitignore @@ -0,0 +1,7 @@ +*.TempPoint.* +*.Export.* +*.psprojs +*.RestorePoint.* +*.Run.ps1 +*.Package.ps1 +CustomMenu.inf \ No newline at end of file diff --git a/PSApps/AdminTools/AdminTools.psproj b/PSApps/AdminTools/AdminTools.psproj new file mode 100644 index 0000000..89c33ea --- /dev/null +++ b/PSApps/AdminTools/AdminTools.psproj @@ -0,0 +1,13 @@ + + 2.1 + 68045061-8d0e-4d53-9174-9e26bdcadc2b + 0 + + + Startup.pss + MainForm.psf + Globals.ps1 + ChildForm.psf + .gitignore + + \ No newline at end of file diff --git a/PSApps/AdminTools/ChildForm.psf b/PSApps/AdminTools/ChildForm.psf new file mode 100644 index 0000000..afd4537 --- /dev/null +++ b/PSApps/AdminTools/ChildForm.psf @@ -0,0 +1,161 @@ + + bea9cc3b-f121-40e9-901e-87e34be96ecb + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAB4iSURBVHhe7d3Xc57nfedhTw6yp5ujHG+yf0N2 +9mQzk8lM7PFmE2dndzZjJ7EjxZsoUbMcSZSsSLYUy46aFXXLalRhJ0WwgSQAovcOkCgs6AB7lWWn +bH573w8JCrJoi5bpSNR9fWauAQG8ePACOri/7wuQ+owkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk +SZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk +SZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk +SZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk +SZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk +SZIkSZIkSZIkSZIkSZIkSZL06enVX/mVX+n+z7/5m9233Xpb96pV93bfddcqAOC6cU/3N+79Rvf/ ++P3Pd/+HX/3V7nS2Zz+7dPjv/+xnPxs/eG1NdI9Oxfjs6TgwfRIAuE6MzZxKTsa+9r64/favxa/9 +2n+MS8f8T+83f+M3ul989a0YOHIqGgenor7vYDQAANeVfH53ji1G1+Bk/MEf/sGHD4Bbb72tu3tk +KpqHpqNp4DAAcJ1q7D8Ug0dOxutvrv/wAXDvPd/oPrx4PvYNHInmQQDgetWYRsDIzJlYt2Hrhw+A +e1bd031o4Ww0DU5FyxAAXJ9aR6ajbXQm2kaugXSda37NJF+z7Vpd89I1Vn4P8ggYTQNgzbrNHz4A +VuUBsHiu+hFA6/D7tY3OXTJbvWwdna+0XdI6MvuBjwGAf2/t6Zxq6J6Mt2raYvWmpli9ufkjey19 +/Nt1femaM1HfPRFvbW39ha+ZP35r/UB1zbrO8Xjz7ZZrcj9r9g1WI2D5+5BHwP7Zs1c/AA6nAdAy +vHJVpAM/LZSWnpFo6R5KhtOf90dT11A0dvRHY+dgNHePROvAZDUMLn8cAHwMusbm06HaGjv29Udz +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 +gQwAACiQAQAABTIAAKBABgAAFMgAAIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTI +AACAAhkAAFAgAwAACmQAAECBDAAAKJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwA +ACiQAQAABTIAAKBABgAAFMgAAIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTIAACA +AhkAAFAgAwAACmQAAECBDAAAKJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwAACiQ +AQAABTIAAKBABgAAFMgAAIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTIAACAAhkA +AFAgAwAACmQAAECBDAAAKJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwAACiQAQAA +BTIAAKBABgAAFMgAAIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTIAACAAhkAAFAg +AwAACmQAAECBDAAAKJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwAACiQAQAABTIA +AKBABgAAFMgAAIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTIAACAAhkAAFAgAwAA +CmQAAECBDAAAKJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwAACiQAQAABTIAAKBA +BgAAFMgAAIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTIAACAAhkAAFAgAwAACmQA +AECBDAAAKJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwAACiQAQAABTIAAKBABgAA +FMgAAIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTIAACAAhkAAFAgAwAACmQAAECB +DAAAKJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwAACiQAQAABTIAAKBABgAAFMgA +AIACGQAAUCADAAAKZAAAQIEMAAAokAEAAAUyAACgQAYAABTIAACAAhkAAFAgAwAACmQAAECBDAAA +KJABAAAFMgAAoEAGAAAUyAAAgAIZAABQIAMAAApkAABAgQwAACiQAQAABTIAAKBABgAAFMgAAIAC +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 +AAB8PPKj3vyId3x8vPoxwPXi+PHj1X1f+XXkp+Gvp68j//PL+RmHlV/HSgYAAL9U+dFzfjSdH4le +D/J9zU/5fxq+jp92+GcGAAAUyAAAgAIZAABQIAMAAApkAABAga7pADh1Jv9jCRcvCgB8cuXz+poN +gMPpQkeOJvklAPDJlc7riYWLh/8vPAAOpBWRlwQA8Ml3+fz+KAPgQBoAy+sBALj+7E+uegCsWnVP +77v/FrF4IUkfBABcnxaSdyNiS83ODx8AN9xw4+DmrTti7fot1WIAAK5fW2p2xEN///CHDwBJkiRJ +kiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJ +kiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJ +kiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJ +kiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJ +kiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiTpE9lnPvP/AW4rgZqR25UH +AAAAAElFTkSuQmCC +
1XaAR1o2BggAACODCAAAAAAABADNk11v2jAUhu8n7T9YvthVxEeBULRgqaRDmmgHIoxdTk5yBl4dH2Q7W7Nf +P4eA1Ba2pJX2oaCIJOfxeX3yJJjHXyGxhr1+RUhQXRBb7GBMo8JYyFqfhErxu2lNUWfV2SPnHnlk +DdoIVON+q1MeHglzaXMNYwW51Vx6ZJHHUiQzKFZ4B2ocD4d8kAz87qjXh87liBLFM9f5i1vvKs2E +WiFKQ0myFTLVDqAhKqvLe/u8LvFC4w60LQ7kVW4xSriEa5GBKtO4Ut8j3V7QPpbWobeYAmVT16mW +CaUAZSPxwwGXnQuP9Ed+LXTL9UYoyvquvPrVIh/cmbLHY6mFIsu1XaAR1o2BstAlBb3gbo71G1vB +vaVs34z8otu7b26hQ/kN8vRpvs/lzaC9Lzsy9X5NcmtR/XHD4n2b+ex3bp1RRCVb1JRN0NHuM1iK +zfZ0lqfcteASN0swLi1l81kD5AYTXr03v1cq4ncbQJUmx701ACpzhwOPXJx+IGes4PF7lcI9ZU3S +VA694dnubaMwHw2EmO3ctmMJJbwE10wLtaFspXNotsRamJzLyBYSJjy5C1GWb+wsH7QrH/9TO0Ou +EpB/x9CQ5wbMmkuRHrSbcmmajPyx21XmZ/k97A5e4nfjTi92vPM8xxsH+reeP7g4/jXsJ5sO5XgG +CAAA
+ + 0 + +
\ No newline at end of file diff --git a/PSApps/AdminTools/Globals.ps1 b/PSApps/AdminTools/Globals.ps1 new file mode 100644 index 0000000..bcf59ed --- /dev/null +++ b/PSApps/AdminTools/Globals.ps1 @@ -0,0 +1,34 @@ +#-------------------------------------------- +# Declare Global Variables and Functions here +#-------------------------------------------- + + +#Sample function that provides the location of the script +function Get-ScriptDirectory +{ +<# + .SYNOPSIS + Get-ScriptDirectory returns the proper location of the script. + + .OUTPUTS + System.String + + .NOTES + Returns the correct path within a packaged executable. +#> + [OutputType([string])] + param () + if ($null -ne $hostinvocation) + { + Split-Path $hostinvocation.MyCommand.path + } + else + { + Split-Path $script:MyInvocation.MyCommand.Path + } +} + +#Sample variable that provides the location of the script +[string]$ScriptDirectory = Get-ScriptDirectory + + diff --git a/PSApps/AdminTools/MainForm.psf b/PSApps/AdminTools/MainForm.psf new file mode 100644 index 0000000..fe8ca13 --- /dev/null +++ b/PSApps/AdminTools/MainForm.psf @@ -0,0 +1,399 @@ + + e53b79ec-8f1e-4f02-944d-aeefaba53ab2 + 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 +lP0AAAAASUVORK5CYII= +
pKZs1pDDXwUAACODCAAAAAAABAC1lEFP4zAQhe9I+x8sn6O22ba0lVpLSwAJLYWKFPaIHGcEpo6nsp2F8Otx +kkYgmlVyWcWyYvk9z8vkS5a3yQsIZ9mPE0KW9YK4Yg8rGhfWQTb4I3WKr3ZwiSar54C0bQXkAYyV +qFeTwai8AhLlyuUGVhpyZ7gKyCZPlBS/odjiDvQqmc34VExPw8V4AqP5ghLNM195zaUuz6REPEuV +Gi+lEWpnUFlaJfVZNwb3YFxx8PzKHcaCKziXGegyh5fOAxLOlsNG2mVdYwqUXfpKnZ5ISdAulu/e +MJ4vAjKezDtNa26epKZsGpDD6LTc+JmypiGd8thx4zZopfMNoCzyGcHEwgDoTu8W3lxdirTXuvjr +jzuIr5Gnn7key+VyWAkadTdLZ7lzqP87TUlVJuJKRSVNXWC18KHFMxrKblDDUVeO5dcoeN3+8KcH +Izwd9TA1aEwCchg9TDUcLc/Xw1ujG45Dj26fgFueXOkU3ijrpa5YKjORKlQ7Uce+ewsRZnvfv0RB +ecgd+KJG6ifKtibv035/xIO0OVexKxSccbGLUJWv71/+r1j7z1rsWlv6WG19Y3xYQ17/PD8Xza1l +H1hxOChfBQAA
+ + 0 + +
\ No newline at end of file diff --git a/PSApps/AdminTools/Startup.pss b/PSApps/AdminTools/Startup.pss new file mode 100644 index 0000000..2dbbd9f --- /dev/null +++ b/PSApps/AdminTools/Startup.pss @@ -0,0 +1,39 @@ + + + + Param ([String]$Commandline) + + #-------------------------------------------------------------------------- + #TODO: Add initialization script here (Load modules and check requirements) + + + #-------------------------------------------------------------------------- + + if((Show-MainForm_psf) -eq 'OK') + { + + } + + $script:ExitCode = 0 #Set the exit code for the Packager +} + + +]]> + \ No newline at end of file diff --git a/Scripts/Copy-StartUpItems.ps1 b/Scripts/Copy-StartUpItems.ps1 new file mode 100644 index 0000000..e69de29 diff --git a/Scripts/FirstLogonScript.bat b/Scripts/FirstLogonScript.bat new file mode 100644 index 0000000..e69de29 diff --git a/Scripts/TestStartBarAsSystem.ps1 b/Scripts/TestStartBarAsSystem.ps1 new file mode 100644 index 0000000..4a29719 --- /dev/null +++ b/Scripts/TestStartBarAsSystem.ps1 @@ -0,0 +1,19 @@ +# Using the Tatux.Win.Admin module and the Test-WindowsTaskbar function, we can determine if the taskbar is visible as a Scheduled task running as system +Import-Module 'D:\Nerd Stuff\Dev Stuff\Git_Repos\Get-PowerShell\Modules\Tatux.Win.Admin\Tatux.Win.Admin.psm1' + +Start-Transcript -Path 'D:\Nerd Stuff\Dev Stuff\TestStartBarAsSystem.txt' -Append +$count = 0 +$EndTime = (Get-Date).AddSeconds(30) +while ((Get-Date) -lt $EndTime) { + $count++ + $taskbarStatus = Test-WindowsTaskbar + if ($taskbarStatus) { + Write-Host "[$($count)]Taskbar is visible." + } + else { + Write-Host "[$($count)]Taskbar is not visible." + } + Start-Sleep -Seconds 1 + +} +Stop-Transcript \ No newline at end of file