4

我开发了一个 C# Windows 窗体应用程序,它作为系统托盘图标在后台运行,并在单击它时执行一些操作。它应该在Windows启动并持续运行时启动,并且不允许没有管理员权限的普通用户关闭它。

做这个的最好方式是什么?我最初打算通过任务计划程序在 LocalSystem 帐户上运行它,但后来我(艰难地)了解了Session 0 隔离(即应用程序将运行但它的 UI 元素不显示)。当我使用登录用户运行它时,即使它运行提升,用户仍然可以通过任务管理器将其关闭(无需提升)。

有什么方法可以让 LocalSystem 的进程访问 UI?我有一个在会话 1 中运行的 LocalSystem 的 winlogon 和一个 csrss 进程,所以我想它可以完成,我只是不知道怎么做。或者是否有更简单的方法来禁止用户通过任务管理器关闭他们自己的进程?我能想到的唯一其他选择是创建一个额外的 Windows 服务,如果应用程序正在运行,它会继续轮询,如果有人杀死它,它会立即再次启动它——但这看起来非常笨拙(而且,我希望它在它运行时保持死态)自行崩溃,以避免单个错误导致进程创建无限循环)。

4

2 回答 2

2

Deponds 为什么他们不能关闭它。自然的方式是创建一个服务,由一个高权限帐户启动,然后让桌面应用程序显示它在做什么。

如果他们应该看到某些东西,但不要因为他们没有运行服务监视器应用程序。(并向服务确认消息),给他们发一封电子邮件,给他们的老板发一封电子邮件,给自己发一封,然后去对他们大喊大叫......

比试图盖回这罐蠕虫的盖子要容易得多。

确保桌面应用程序正在运行的一个好方法是简单地安排它运行每个 X,但如果它已经运行或者设置了一些错误的 flkag,则立即退出。

不值得编写一个服务来检查它是否仍然存在,因为他们也可以杀死它,除非你想让它成为他们无法杀死的服务。:(

你试图对此过于严厉。添加某种审计,以便您可以看到它死亡或被关闭,监控它并处理任何不良报告。这要容易得多,并且可以让管理人员做一些事情......

于 2012-01-04T18:45:37.657 回答
1

您可以在用户的​​登录会话中运行管理进程。一种方法是让主进程(系统服务)复制自己的令牌,使用 SetTokenInformation 更改与令牌关联的会话,然后调用 CreateProcessAsUser。lpStartupInfo 参数可用于将进程与特定的窗口站和桌面相关联。可能需要先明确更改窗口站和桌面的权限。

然而,从安全的角度来看,这是一个坏主意,因为 GUI 应用程序容易受到来自同一桌面上其他进程的恶意消息的攻击(“粉碎攻击”)。

在用户自己的上下文中运行该进程但对其应用 ACL 会更安全。这可以使用 CreateProcess 或 CreateProcessAsUser 的 lpProcessAttributes 参数或使用 SetSecurityInfo 函数来完成。我从来没有试过这个,但理论上它应该阻止用户使用任务管理器来关闭进程。

如果您是从用户的上下文创建进程,那么用户将是所有者,因此有足够知识的人可以更改权限以终止进程。如果您需要阻止这个漏洞,使用特权主进程中的 CreateProcessAsUser (令牌可以从用户会话中的现有进程之一复制)应该(再次,理论上)意味着用户不是进程所有者。

另一个潜在问题:如果您收听指示用户正在注销(以便退出)的消息,则可能会伪造这样的消息。如果您不这样做,那么您需要在用户注销时找到其他退出方式。您可能需要在这里进行实验,我不确定系统会如何反应。

于 2012-01-05T00:44:09.467 回答