Intro
如果以 SYSTEM 用户身份运行,则可以使用 PowerShell 向当前活动登录用户显示 toast 通知会话 0无需请求用户的凭据。
“背景说明”中有两种解决方案
背景说明
请注意,本节是为这篇文章的所有观众而写的,而不仅仅是最初的提问者。
SYSTEM
指的是同义词NT Authority\SYSTEM
and Local System
.
许多 Windows 服务作为SYSTEM
用户,尽管其他人以权限较低的用户身份运行,例如LOCAL SERVICE
and NETWORK SERVICE
.
对于每个登录用户,都会创建一个从 1 开始编号的 Windows 会话,其中包含用户的窗口。
一个额外的后台会话称为会话 0还创建了 Windows 服务和用户模式驱动程序在其中运行的文件。更多信息请访问以下链接。
会话、桌面和 Windows 工作站 https://techcommunity.microsoft.com/t5/ask-the-performance-team/sessions-desktops-and-windows-stations/ba-p/372473#
除以下服务外的所有服务每用户服务 run in 会话 0.
如果您正在使用此类脚本的服务,我建议您考虑使用以下两种替代方案之一:
创建一个第一节某些服务已经完成的子流程。
Use the Windows Task Scheduler
而是在与当前活动用户相同的会话中运行主脚本或通知脚本。该计划任务可以设置为在事件发生时触发。
请注意以下安全警告。 Powershell 5 中的脚本可以被中断,从而将控制权交给用户。对于 Powershell 6 及更高版本,可通过使用非交互式选项禁用此行为。
解决方案注释
下面提出两种解决方案来解决原始问题。两者都使用干预程序来移动会话 0 to 第一节.
两者都会短暂闪烁一个 PowerShell 窗口,这会让用户感到不安并且很难隐藏。下面的链接提供了一些隐藏技巧。
如何在不显示窗口的情况下运行 PowerShell 脚本 https://stackoverflow.com/questions/1802127/how-to-run-a-powershell-script-without-displaying-a-window
以下键入的解决方案需要不带空格的路径。如果给出,则必须使用完整路径。您必须编辑这些路径以适应。
包括测试方法。
第一个解决方案需要PSExec.exe
程序。它是一部分PSTools
可通过以下链接获取。它还用于测试这两种解决方案。
PSTools https://learn.microsoft.com/en-us/sysinternals/downloads/pstools
第二种解决方案需要ServiceUI.exe
程序。它是Microsoft Deployment Toolkit (MDT)
可通过以下链接获取。
Microsoft 部署工具包 (MDT) https://www.microsoft.com/en-au/download/details.aspx?id=54259
The ServiceUI.exe
程序被埋在MDT
安装目录如下。
Microsoft Deployment Toolkit\Templates\Distribution\Tools\x64\ServiceUI.exe
我把它复制到E:\Programs\MDT\ServiceUI.exe
使其在 PowerShell 中使用起来更简单
需要脚本
气球测试.ps1
$Miliseconds=50000
$Text="Hi"
$Title="Test"
Add-Type -AssemblyName System.Windows.Forms
$global:balloon = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Info
$balloon.BalloonTipText = "$Text"
$balloon.BalloonTipTitle = "$Title"
$balloon.Visible = $true
$balloon.ShowBalloonTip($Miliseconds)
我是谁会话.ps1
whoami
$Session=(Get-Process -PID $pid).SessionID
echo "Session=$Session"
测试设置
Start a cmd.exe
窗口作为Administrator
.
以下命令将提供 SYSTEM 用户会话 0PowerShell执行环境如图所示。
E:\Programs\PSTools\psexec -s powershell.exe -file e:\test\WhoAmISession.ps1
解决方案1:PSExec.exe
显示 Toast 通知PowerShell
如果运行为SYSTEM
用户在Session 0
使用以下命令。如果当前活跃登录用户正在使用,这将显示 Toast 通知Session 1
。其他会议需要进行一些修改。
E:\Programs\PSTools\psexec -s -i 1 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file e:\test\BalloonTest.ps1
要测试启动"cmd.exe"
窗口作为"Administrator"
并输入以下命令。如果当前活跃登录用户正在使用,这将显示 Toast 通知Session 1
如图所示。
E:\Programs\PSTools\psexec -s powershell.exe E:\Programs\PSTools\psexec -s -i 1 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file e:\test\BalloonTest.ps1
解决方案2:ServiceUI.exe
显示 Toast 通知PowerShell
如果运行为SYSTEM
用户在Session 0
使用以下命令。这将向当前活动登录用户显示 Toast 通知。
E:\Programs\MDK\ServiceUI.exe C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file e:\test\BalloonTest.ps1
要测试启动"cmd.exe"
窗口作为"Administrator"
并输入以下命令。这将向当前活动登录用户显示 Toast 通知,如图所示。
E:\Programs\PSTools\psexec -s powershell.exe E:\Programs\MDK\ServiceUI.exe C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file e:\test\BalloonTest.ps1