首页 > 解决方案 > 从 Windows 托盘生成 PowerShell 管理控制台

问题描述

我需要每天多次打开各种本地管理 PowerShell 控制台。如果我让一个控制台整天打开,那很好,但如果关闭,我的策略控制的管理员密码通常已经过期,所以如果我以后必须打开另一个控制台,我必须进入请求过程以获取管理员密码,并为我的工作环境每隔一小时重新请求一次,这会浪费很多时间。

我真的很喜欢放在托盘中并且永远不会关闭的东西,但它可以产生多个进程,所有这些都具有我启动它的本地管理员权限。这样,我可以在早上请求一个本地管理员密码,然后使用该密码打开这个系统托盘进程或工具,然后我可以从无需每小时重新请求管理员密码,从而浪费大量时间和生产力。

也许这可能是一个 PowerShell 脚本,或者某个人知道的可以充当系统托盘/通知区域中的应用程序启动器的工具,我可以将其重用于 PowerShell 控制台或其他应用程序等。甚至可以通过创建 PowerShell 来完成永远不会关闭的控制台(不知何故(!)虽然我不知道如何做到这一点,也许右上角的“x”或在控制台中键入“退出”不会关闭它,而是只会将该控制台最小化回系统托盘准备好在我需要时弹出管理员权限)。

我还没有发现任何东西可以实现这一点,但它在我的工作环境中将非常有用(可能对于其他需要浪费时间在他们让我们跳过的官僚障碍上的 DevOps / Sys Admin 类型)和在这方面将不胜感激。

标签: powershellconsolelaunchersystem-trayapp-launcher

解决方案


您可以使用 Forms 轻松创建系统托盘图标,并且可以以管理员身份运行它以获得正确的权限:

# Load Assemblies
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$MyIcon = [Drawing.Icon]::ExtractAssociatedIcon((Get-Command powershell).Path)

# Create Primary form
$objForm = New-Object System.Windows.Forms.Form
$objForm.Visible = $false
$objForm.WindowState = "minimized"
$objForm.ShowInTaskbar = $false
$objForm.add_Closing({ $objForm.ShowInTaskBar = $False })
#
$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon
$objNotifyIcon.Icon = $MyIcon
$objNotifyIcon.Text = "TrayUtility"
$objNotifyIcon.Visible = $true
#
$objContextMenu = New-Object System.Windows.Forms.ContextMenu
#
# Build the context menu
# Create Menu Item
$ToggleMenuItem1 = New-Object System.Windows.Forms.MenuItem
$ToggleMenuItem1.Index = 1
$ToggleMenuItem1.Text = "Menu Item 1"
$ToggleMenuItem1.add_Click({
    # Action when selected
})

# Create an Exit Menu Item
$ExitMenuItem = New-Object System.Windows.Forms.MenuItem
$ExitMenuItem.Index = 5
$ExitMenuItem.Text = "E&xit"
$ExitMenuItem.add_Click({
    $objForm.Close()
    $objNotifyIcon.visible = $false
})
# Add the Menu Items to the Context Menu
$objContextMenu.MenuItems.Add($ToggleMenuItem1) | Out-Null
$objContextMenu.MenuItems.Add($ExitMenuItem) | Out-Null
#
# Assign the Context Menu
$objNotifyIcon.ContextMenu = $objContextMenu
$objForm.ContextMenu = $objContextMenu

# Show the Form - Keep it open
$objForm.ShowDialog() | Out-Null
$objForm.Dispose()

很确定我已经在某处看到了启动 PS 管理窗口然后使用显示/隐藏而不是每次都尝试启动新窗口的代码-您可以将控制合并到图标右键单击菜单中试一试并在此处发布代码所以,如果你被卡住了。


推荐阅读