Powershell:作为本地系统运行时向登录用户发送 toast 通知

2024-03-24

我有一个作为本地系统运行的脚本,它执行一些操作,包括检查用户是否已登录,如果是,它会运行 PowerShell 代码片段来显示 toast 通知,如下所示。

如果 PS 以当前用户身份运行,则可以正常工作。如果它作为 LocalSystem 运行,则当前用户看不到 toast,因为输出发送到会话 0(对于本地系统帐户)。

如果作为本地系统运行,是否可以向登录用户显示 toast 通知without请求用户的凭据?

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)

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.

如果您正在使用此类脚本的服务,我建议您考虑使用以下两种替代方案之一:

  1. 创建一个第一节某些服务已经完成的子流程。

  2. 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell:作为本地系统运行时向登录用户发送 toast 通知 的相关文章

随机推荐

  • 像alert()函数一样停止页面执行

    当我写作时alert Hello 页面执行停止并等待批准才能继续 我有一个div设置为使用 HTML 显示为虚假警报 thisdiv有一个 确定 按钮 我希望页面停止执行 就像警报一样 直到用户单击 确定 是否可以 你不能 只有特殊的内置程
  • 如何将消息从 Flutter 传递到 Native?

    如果需要与特定 API 硬件组件交互 您如何将信息从 Flutter 传递回 Android Native 代码 是否有任何事件通道可以以其他方式发送信息或类似于回调的方式 The 平台频道 https flutter io platfor
  • 使用不同的密钥对同一文档中的 Xml 元素进行签名

    业务场景 更新可以包含包 包可以包含更改 每个包裹都必须经过某人的批准 批准后 不得更改套餐 要执行更新 必须具有 100 批准的软件包 发展思路 所有数据均保存为 XML 文件 Xml 包 元素将在批准后签署 Problem 无论我尝试什
  • 如何在 Mvccontrib 网格模型中使用自定义列?

    我正在使用 ASP NET MVC 3 Mvccontrib 网格 如下所示 Html Grid Model Columns column gt column For x gt x UserId Named ID column For x
  • Jenkins 插件的 .hpi 和 .jpi 有什么区别?

    我以两种方式安装了 Jenkins 插件 即手动保留 hpi文件位于 Jenkins 主目录中 并从 Jenkins 前端安装 管理 Jenkins gt 管理插件 我在这里注意到的是当我手动安装插件时 下载为 hpi文件 它以扩展名安装
  • 使用 Javascript 获取脚本文件的内容

    我的网页中有以下脚本元素 使用 JavaScript 我希望能够检索脚本文件的内容 我知道我可以使用 ajax 请求来获取数据 但随后我会从本地已有的服务器获取一些内容 所以我更愿意做的是从 DOM 中检索内容 如果可能的话 或具有相同结果
  • 用于分析 .NET 程序函数执行时间的工具

    有哪些工具可用于通过测量函数执行时间并生成图表来可视化调用图中各个点所花费的时间来分析 NET 程序 这会让你付出代价 但是Ants 性能分析器 http www red gate com products ants performance
  • 为什么允许空对象上的扩展方法?

    允许在空对象上调用扩展方法有什么意义 这使我不必要地检查扩展方法中的空对象 AFAIK 我无法理解这一点 请解释 扩展方法是 C 语言的语法糖 它们被编译为 ILCode 中的普通静态方法调用 静态方法在编译时不知道任何有关参数的信息
  • 在 R 中,如何在点 sf 对象上运行 st_convex_hull 函数?

    我正在尝试在 R 中获得点特征的凸包 library tmap library sf nc lt st centroid st read system file shape nc shp package sf qtm nc ch lt st
  • 前台服务被操作系统杀死

    我有一个前台服务 它从服务器下载一些数据 问题是有时操作系统杀死了我的前台服务 但服务的通知不会被删除 关于如何在服务不再存在时删除通知的任何想法 None
  • 棘手的 Django GenericRelation 查询

    假设我有一些代表现实生活中的对象的模型 Person Chair Room 我也有一个 收藏 模型 它代表这些模型的一些记录的集合 每个模型都可以是多个集合中的成员 因此 我还创建了一个 会员资格 model 表示一个对象是集合的成员 它的
  • Firestore 文档参考数组

    我的 Firestore 数据库具有以下结构 products Collection procuct 1 Document title url videos Collection video 1 Document title product
  • 如何在 mac osx 上安装 Python docx 模块

    我正在尝试生成 docx使用 Python 的文件 我搜索了网络和帖子 发现了一个模块 https github com mikemaccana python docx blob master README markdown https g
  • 当 Android 的 PreferenceActivity 的 isValidFragment() 被调用时?

    对于我正在开发的某些应用程序 对于 API 级别 19 的设备 我遇到了异常 Caused by java lang RuntimeException Subclasses of PreferenceActivity must overri
  • 当属性是对象时命名查询?

    我想在 JPA 中进行此查询 SELECT FROM happyDB users U WHERE U party as user 1 AND U party party id 2 这工作正常 但我的问题是我有Party只能作为一个对象 而不
  • 由 Android 应用程序和网站共享的关系数据库 - 最简单的方法

    我有一个项目 我将开发一个 Android 应用程序和一个网站 他们都应该共享相同的数据库 我正在尝试探索所有选项 但我真的很困惑 这是我的要求 1 我需要一个非常简单且EASY方式 我并不是想学习 我只是想学习 我只是想把事情做好 2 数
  • microk8s 连接到端口 16443 被拒绝

    我收到以下错误消息 root master 1 microk8s kubectl get no The connection to the server 127 0 0 1 16443 was refused did you specify
  • 使用 Storyboard 与编程方式进行 iOS 开发的速度?

    作为初级 iOS 开发人员 哪种方法可以实现更快 更高效的开发 这个问题没有正确的答案 对于使用 Xcode 进行开发 2 3 年的人来说 旧的编程方式更高效 而且故事板感觉很陌生 这就是我个人的处境 对于今天刚刚开始使用 Xcode 或
  • 如何向 NSDate 添加 1 天?

    基本上就如标题所说 我想知道如何添加 1 天NSDate 所以如果是 21st February 2011 它将变成 22nd February 2011 或者如果是 31st December 2011 它将变成 1st January
  • Powershell:作为本地系统运行时向登录用户发送 toast 通知

    我有一个作为本地系统运行的脚本 它执行一些操作 包括检查用户是否已登录 如果是 它会运行 PowerShell 代码片段来显示 toast 通知 如下所示 如果 PS 以当前用户身份运行 则可以正常工作 如果它作为 LocalSystem