From 59cf4a3d7dbc8c4f48976841aae5810fe151250d Mon Sep 17 00:00:00 2001 From: Dan Franciscus Date: Wed, 10 Jul 2019 11:24:06 -0400 Subject: [PATCH] Added a lot of stuff --- CHANGELOG.md | 8 + Chocolatey-tools.psd1 | 2 +- functions/Get-ChocoSourcePackages.ps1 | 16 ++ functions/Invoke-RebootPrompt.ps1 | 24 +++ functions/Start-ChocoRemoteMgmt.ps1 | 208 ++++++++++++++++++++++++++ 5 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 functions/Get-ChocoSourcePackages.ps1 create mode 100644 functions/Invoke-RebootPrompt.ps1 create mode 100644 functions/Start-ChocoRemoteMgmt.ps1 diff --git a/CHANGELOG.md b/CHANGELOG.md index a047adf..bed267b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Chocolatey-tools Release History +## 0.4.5 - 7/10/2019 + +### Added + +* Start-ChocoRemotemgmt - A Winforms GUI that can install,uninstall,upgrade,view, see outdated packages on remote Chocolatey clients +* Get-ChocoSourcepackages - Helper function for getting packages from multiple Chocolatey sources for Start-ChocoRemotemgmt +* Invoke-RebootPrompt - Helper function for prompting to reboot a machine remotely in Start-ChocoRemotemgmt + ## 0.4.3 - 6/5/2019 ### Fixed diff --git a/Chocolatey-tools.psd1 b/Chocolatey-tools.psd1 index 816a120..7287d65 100644 --- a/Chocolatey-tools.psd1 +++ b/Chocolatey-tools.psd1 @@ -12,7 +12,7 @@ RootModule = 'Chocolatey-tools.psm1' # Version number of this module. -ModuleVersion = '0.4.4' +ModuleVersion = '0.4.5' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/functions/Get-ChocoSourcePackages.ps1 b/functions/Get-ChocoSourcePackages.ps1 new file mode 100644 index 0000000..ef9388c --- /dev/null +++ b/functions/Get-ChocoSourcePackages.ps1 @@ -0,0 +1,16 @@ +<# + .SYNOPSIS + Outputs all package names for one or multiple Chocolatey sources. + .EXAMPLE + Get-ChocoSourcePackages -Sources repo1,repo2 + #> + function Get-ChocoSourcePackages { + [CmdletBinding()] + param( + [Parameter(Mandatory=$true)] + [string[]]$Sources + ) + $Sources | ForEach-Object { + choco list --source=$_ -r | ForEach-Object {$_.split("|")[0]} + } | Sort-Object -Unique +} \ No newline at end of file diff --git a/functions/Invoke-RebootPrompt.ps1 b/functions/Invoke-RebootPrompt.ps1 new file mode 100644 index 0000000..2d7b3fa --- /dev/null +++ b/functions/Invoke-RebootPrompt.ps1 @@ -0,0 +1,24 @@ + <# + .SYNOPSIS + Used in Start-ChocoRemotemgmt to prompt if a user wants to reboot a computer. + #> +Function Invoke-RebootPrompt { +param( + $Message = "Click OK to reboot", + $Title = "Continue or Cancel" +) + Add-Type -AssemblyName System.Windows.Forms | Out-Null + $MsgBox = [System.Windows.Forms.MessageBox] + $Decision = $MsgBox::Show($Message,$Title,"OkCancel", "Information") + If ($Decision -ne "Cancel") { + $outputBox.Text = "" + try { + $outputBox.Text = ("Rebooting " + $ComputerList.Text) + Restart-Computer -ComputerName $ComputerList.Text -Force -ErrorAction stop + } + catch { + $ErrorMessage = $_.Exception.Message + $outputBox.Text = $ErrorMessage + } + } +} \ No newline at end of file diff --git a/functions/Start-ChocoRemoteMgmt.ps1 b/functions/Start-ChocoRemoteMgmt.ps1 new file mode 100644 index 0000000..063b7ed --- /dev/null +++ b/functions/Start-ChocoRemoteMgmt.ps1 @@ -0,0 +1,208 @@ + #requires -modules Invoke-CommandAs + <# + .SYNOPSIS + Starts a Winforms GUI for remote management of Chocolatey clients. + .EXAMPLE + In this example, we query Active Directory for all computers which will populate the list of computers. + We also use the function Get-ChocoSourcePackages to pull all packages from Chocolatey sources configured on the local computer. + + Start-ChocoRemotemgmt -ComputerName (Get-ADComputer -Filter | Select-Object -ExpandProperty Name) -Packages (Get-ChocoSourcePackages -Sources repo1,repo2) + #> +function Start-ChocoRemoteMgmt { + [CmdletBinding()] + param ( + [Parameter(Mandatory=$true)] + [string[]]$ComputerName, + [Parameter(Mandatory=$true)] + [string[]]$Packages + ) + Add-Type -AssemblyName System.Windows.Forms + [System.Windows.Forms.Application]::EnableVisualStyles() + + $Form = New-Object system.Windows.Forms.Form + $Form.Text = "Chocolatey Remote Management" + $Form.TopMost = $true + $Form.Width = 757 + $Form.Height = 570 + + $ComputerNameLabel = New-Object system.windows.Forms.Label + $ComputerNameLabel.Text = "Computer Name" + $ComputerNameLabel.AutoSize = $true + $ComputerNameLabel.Width = 25 + $ComputerNameLabel.Height = 10 + $ComputerNameLabel.location = new-object system.drawing.point(28,23) + $ComputerNameLabel.Font = "Microsoft Sans Serif,12" + + $Form.controls.Add($ComputerNameLabel) + + $ComputerList = New-Object system.windows.Forms.TextBox + $ComputerList.Width = 180 + $ComputerList.Height = 20 + $ComputerList.location = new-object system.drawing.point(28,55) + $ComputerList.Font = "Microsoft Sans Serif,12" + $ComputerList.AutoCompleteSource = 'CustomSource' + $ComputerList.AutoCompleteMode='SuggestAppend' + $ComputerList.AutoCompleteCustomSource=$Autocomplete + $ComputerName | ForEach-Object {$ComputerList.AutoCompleteCustomSource.AddRange($_) } + $Form.controls.Add($ComputerList) + + $PackageList = New-Object system.windows.Forms.ListBox + $PackageList.Text = "PackageList" + $PackageList.Width = 325 + $PackageList.Height = 129 + $PackageList.Font = "Microsoft Sans Serif,12" + $PackageList.location = new-object system.drawing.point(241,54) + $Packages | ForEach-Object { $PackageList.Items.Add($_) | Out-Null } + $Form.controls.Add($PackageList) + + $PackagesList = New-Object system.windows.Forms.Label + $PackagesList.Text = "Packages" + $PackagesList.AutoSize = $true + $PackagesList.Width = 25 + $PackagesList.Height = 10 + $PackagesList.location = new-object system.drawing.point(240,23) + $PackagesList.Font = "Microsoft Sans Serif,12" + $Form.controls.Add($PackagesList) + + $ShowCurrentUser = New-Object system.windows.Forms.Button + $ShowCurrentUser.Text = "Show Current User" + $ShowCurrentUser.Width = 148 + $ShowCurrentUser.Height = 34 + $ShowCurrentUser.location = new-object system.drawing.point(28,149) + $ShowCurrentUser.Font = "Microsoft Sans Serif,10" + $Form.controls.Add($ShowCurrentUser) + $ShowCurrentUser.add_Click({ + $outputBox.Text = ("Find current user on " + $ComputerList.Text) + if (!(Test-Connection -ComputerName $ComputerList.text -Count 2)){ + $outputBox.Text = "Computer is not online" + } + else { + $CurrentUser = Invoke-Command -ComputerName $ComputerList.text -Scriptblock { + (Get-WMIObject -class Win32_ComputerSystem).username + } + $outputBox.Text = $CurrentUser + if (!$CurrentUser ) { + $outputBox.Text = "No user is logged on" + } + } + }) + + $InstallPackage = New-Object system.windows.Forms.Button + $InstallPackage.Text = "Install" + $InstallPackage.Width = 95 + $InstallPackage.Height = 34 + $InstallPackage.location = new-object system.drawing.point(240,185) + $InstallPackage.Font = "Microsoft Sans Serif,10" + $Form.controls.Add($InstallPackage) + $InstallPackage.add_Click({ + $outputBox.Text = "" + $outputBox.Text = ("Installing " + $PackageList.SelectedItem + " on " + $ComputerList.Text) + Write-output "Installing" + $chocoutput = Invoke-CommandAs -AsSystem -ComputerName $ComputerList.Text -ScriptBlock { + choco install $args[0] -y -r + Write-output "Done" + $outputBox.Text = $chocoutput + } +}) + + $Outdatepackage = New-Object system.windows.Forms.Button + $Outdatepackage.Text = "Show Outdated" + $Outdatepackage.Width = 107 + $Outdatepackage.Height = 34 + $Outdatepackage.location = new-object system.drawing.point(458,185) + $Outdatepackage.Font = "Microsoft Sans Serif,10" + $Form.controls.Add($Outdatepackage) + $Outdatepackage.add_Click({ + $outputBox.Text = "" + $outputBox.Text = ("Finding outdated packages" + $PackageList.SelectedItem + " on " + $ComputerList.Text) + Write-output "Listing installed packages" + $chocoutput = Invoke-CommandAs -AsSystem -ComputerName $ComputerList.Text -ScriptBlock { + choco outdated -r --ignore-unfound --ignore-pinned | Out-String + } + Write-output "Done" + $outputBox.Text = $chocoutput + }) + + $ListPackage = New-Object system.windows.Forms.Button + $ListPackage.Text = "Show Installed" + $ListPackage.Width = 107 + $ListPackage.Height = 34 + $ListPackage.location = new-object system.drawing.point(343,235) + $ListPackage.Font = "Microsoft Sans Serif,10" + $Form.controls.Add($listPackage) + $ListPackage.add_Click({ + $outputBox.Text = "" + $outputBox.Text = ("Finding installed packages" + $PackageList.SelectedItem + " on " + $ComputerList.Text) + Write-output "Listing installed packages" + $chocoutput = Invoke-CommandAs -AsSystem -ComputerName $ComputerList.Text -ScriptBlock { + choco list -lo -r | Out-String } + Write-output "Done" + $outputBox.Text = $chocoutput + }) + + $UpgradePackage = New-Object system.windows.Forms.Button + $UpgradePackage.Text = "Upgrade" + $UpgradePackage.Width = 95 + $UpgradePackage.Height = 34 + $UpgradePackage.location = new-object system.drawing.point(240,235) + $UpgradePackage.Font = "Microsoft Sans Serif,10" + $Form.controls.Add($UpgradePackage) + $UpgradePackage.add_Click({ + $outputBox.Text = "" + $outputBox.Text = ("Upgrading " + $PackageList.SelectedItem + " on " + $ComputerList.Text) + Write-output "Installing" + $chocoutput = Invoke-CommandAs -AsSystem -ComputerName $ComputerList.Text -ScriptBlock { + choco upgrade $args[0] -y -r + } + Write-output "Done" + $outputBox.Text = $chocoutput + }) + + $UninstallPackage = New-Object system.windows.Forms.Button + $UninstallPackage.Text = "Uninstall" + $UninstallPackage.Width = 107 + $UninstallPackage.Height = 34 + $UninstallPackage.location = new-object system.drawing.point(343,185) + $UninstallPackage.Font = "Microsoft Sans Serif,10" + $Form.controls.Add($UninstallPackage) + $UninstallPackage.add_Click({ + $outputBox.Text = "" + $outputBox.Text = ("Uninstalling " + $PackageList.SelectedItem + " on " + $ComputerList.Text) + Write-output "Uinstalling" + $chocoutput = Invoke-CommandAs -AsSystem -ComputerName $ComputerList.Text -ScriptBlock { + choco uninstall $args[0] -y -f -r } -ArgumentList $PackageList.SelectedItem + Write-output "Done" + $outputBox.Text = $chocoutput + }) + + $RebootComputer = New-Object system.windows.Forms.Button + $RebootComputer.Text = "Reboot" + $RebootComputer.Width = 75 + $RebootComputer.Height = 34 + $RebootComputer.location = new-object system.drawing.point(28,95) + $RebootComputer.Font = "Microsoft Sans Serif,10" + $Form.controls.Add($RebootComputer) + $RebootComputer.add_Click({ + Invoke-RebootPrompt + }) + + $outputBox = New-Object System.Windows.Forms.TextBox + $OutputBox.location = new-object system.drawing.point(28,284) + $outputBox.Size = New-Object System.Drawing.Size(400,200) + $outputBox.MultiLine = $True + $outputBox.ScrollBars = "Vertical" + $outputBox.Font = "Microsoft Sans Serif,12" + $Form.Controls.Add($outputBox) + + $Output = New-Object system.windows.Forms.Label + $Output.Text = "Output" + $Output.AutoSize = $true + $Output.Width = 25 + $Output.Height = 10 + $Output.location = new-object system.drawing.point(28,252) + $Output.Font = "Microsoft Sans Serif,12" + $Form.controls.Add($Output) + + [void]$Form.ShowDialog() + $Form.Dispose() +} \ No newline at end of file