【问题标题】:Prevent application launch in C#防止在 C# 中启动应用程序
【发布时间】:2009-11-17 20:55:54
【问题描述】:

好的,我花了一个下午的时间进行研究,但没有找到答案。我试图阻止应用程序通过某种 dll 或后台应用程序启动。它将用于监控我所在机构的应用程序使用情况和许可证。我在这里找到了有关 WqlEventQuery 和 FileSystemWatcher 的线索。这些解决方案似乎都不适合我,因为:

使用 WqlEventQuery,我只能在进程创建后处理事件。使用记事本作为测试,记事本在我的逻辑关闭之前对我来说是可见和可访问的。我试图暂停/恢复线程(我知道这是不安全的,但我正在测试/播放)但这只是挂起窗口直到我的逻辑完成。

使用 FileSystemWatcher,我无法通过启动 .exe 获得任何事件,只能创建、重命名和删除文件。

这里的目标是根本不让应用程序启动,除非我的逻辑允许它启动。这可能吗?我想出的下一个最佳解决方案是强制某种类型的模式对话框,一旦对话框关闭,应用程序就会被终止,它不允许用户与任何东西进行交互。我在这里担心的是很好地杀死应用程序并在加载时处理具有高开销的应用程序,例如 Photoshop 或其他东西。这也会干扰我希望在获得许可证之前用户可以进入队列的功能。这是我最好的路线吗?还有其他建议吗?

谢谢

编辑:澄清这不是病毒或任何恶意。这与阻止访问黑名单或允许通过白名单访问无关。这个想法是针对某些应用程序逐个检查数据库,并查看是否有可用的许可证。如果有,让应用程序启动,如果没有,则显示一个对话框让用户知道。如果我们有足够的许可证来满足需求等,我们还将使用它来监控和跟踪。其中一个应用程序是 SPSS,它的许可证非常昂贵,但使用它的人非常有限。

【问题讨论】:

  • 这听起来像是病毒。 “哦,诺顿,你想开始吗?我不这么认为!”
  • 杀毒进程的杀戮也在我的脑海中浮现。
  • 这里的用例是什么?听起来像是非常讨厌的程序行为。
  • 抱歉,这不是病毒或任何恶意软件。这里的想法是我们拥有大约 300 台公共计算机,并且我们提供的某些应用程序的许可证有限。目前我们使用 VB 应用程序并将 .exe 文件名传递给它,如果没有可用的许可证(在数据库中检查),则阻止它启动。所有应用程序快捷方式都更改为调用此 VB。但是,如果应用程序是通过具有适当扩展名(即 .psd)的文件打开的,这将不起作用,我被要求研究解决此问题。这适用于桌面非常锁定的教育机构。
  • 如果唯一的问题是文件与程序关联并在未先打开应用程序的情况下启动,则重新配置关联以通过启动器应用程序然后更改可能更容易将任何参数传递给应用程序。只是一个想法。

标签: c# monitoring


【解决方案1】:

你能用吗

System.Diagnostics.Process.GetProcessesByName

循环查找进程?

如果您不使用过于激进的投票率,它可能会起作用。

【讨论】:

  • 是的,我可以使它和它的变体工作,但 WMIEvent 可能是更好的选择。只是想看看是否有任何方法可以完全阻止启动。
【解决方案2】:

您确实很接近,请查看 WMI 管理事件。 http://msdn.microsoft.com/en-us/library/ms186151%28VS.80%29.aspx

来自 Microsoft 的示例代码:http://msdn.microsoft.com/en-us/library/ms257355(VS.80).aspx

订阅适当的事件将为您的应用程序提供适当的信息以执行您所描述的操作。

【讨论】:

    【解决方案3】:

    不确定这是否是一个好的解决方案,但您可以执行一些操作,例如将密钥传递给main,这样如果密钥不存在或无效,应用程序就会关闭。然后,当您在代码中打开应用程序时,只需输入密钥。然后有人必须知道密钥才能启动应用程序。

    这是假设您可以访问相关应用程序的源代码,再次阅读您的问题后,我不太确定。

    【讨论】:

    • 我认为 OP 的目的是关闭流程或未经许可的(据公司所知)应用程序。这不适用于自定义代码可执行文件,您可以为其添加许可密钥策略。
    【解决方案4】:

    我假设您没有要阻止加载的应用程序的源代码...

    您是否考虑过使用系统策略?这将是阻止用户启动程序的最佳支持方式。

    您可以运行一项服务来强制终止任何未“列入白名单”的应用,但我不能说它的效果如何。

    【讨论】:

    • 无可用来源。我认为系统策略不足以满足我们的需求。
    【解决方案5】:

    我想知道您是否采取了错误的方法。过去有一个 Mac 应用程序会阻止访问桌面,并有按钮来启动一组应用程序。

    想法

    如果您有一个已批准应用程序的包装器,那么只允许您的包装器在计算机上运行怎么办?

    【讨论】:

    • 这实际上听起来像是一个有效的解决方案,您将 Key 逻辑集成到包装器中,如果包装器通过成功,它要么运行应用程序本身,要么调用 runas 以运行具有更高权限级别的进程.然后,您可以使用系统策略将常规用户从打开不在您的白名单中的进程列入黑名单。
    • 我没有投反对票,但我觉得这对我们的用户来说太过分了,他们不会支持它。我们在某种程度上是按照顾客的心血来潮运作的。
    • 还有应用程序从各自的文档类型启动的问题。
    • 还会涉及各种网络权限问题。这是一个棘手的问题。
    【解决方案6】:

    我希望有一些方法可以挂钩应用程序启动,但不能直接在这方面提供帮助。

    您可以通过检测应用程序的窗口打开并将其隐藏(将其移出屏幕)来改进您当前的方法,以便用户在您尝试关闭它时无法尝试与之交互。

    但是,另一种可能的方法(取决于您的情况)是编写应用程序启动器。这只是替代检查您的许可条件的应用程序的快捷方式,然后执行 Process.Start 以在该点启动真正的 .exe。这适用于任何应用程序。 (我使用这样的系统来启动具有专门环境设置的应用程序,它运行良好)

    您可以将此与您当前的方法结合起来,作为设法绕过您的启动器的“聪明”用户的后备方案。

    【讨论】:

    • 是的,您的第一个建议是我迄今为止提出的最好的建议。启动器的想法很好,但与我们已有的类似。主要问题是,任何时候打开我们要检查的应用程序的文档,启动器都不会捕获它。
    • 您可以覆盖文件关联来调用启动器,它所要做的就是将收到的命令行传递给启动器。启动器方法的主要问题在于,如果用户有足够的技术专业知识,就很容易绕过。
    【解决方案7】:

    如果我的理解是正确的,您想创建一个应用程序,该应用程序将阻止计算机用户启动除白名单之外的任何其他进程。

    如果是这种情况,请使用 System.Diagnostics.Process 监视进程的进程列表(在 while 循环中)(GetProcesses 方法提供所有正在运行的进程的列表)

    只要在进程启动时终止它。

    或者,如果您的机器装有 Windows 7(Windows 2008??),您可以使用 AppLocker。 http://www.microsoft.com/windows/enterprise/products/windows-7/features.aspx#applocker 让 Windows 阻止启动即可。

    【讨论】:

      【解决方案8】:

      您可能想看看这个产品:http://www.sassafras.com/licensing.html 我个人无法忍受,但那是因为它符合您的描述。可能会为您节省一些编码。

      【讨论】:

        【解决方案9】:

        您实际上可以编辑注册表,因此当您单击 psd 时,会调用您的启动器而不是 Photoshop。然后,您的启动器会检查许可证,如果有许可证,则使用文件路径启动 Photoshop。

        【讨论】:

          【解决方案10】:

          这是一个长镜头,但您可能会发现它很有帮助。

          感知类型和应用程序注册 http://msdn.microsoft.com/en-us/library/cc144150(VS.85).aspx

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            • 2023-03-30
            • 1970-01-01
            • 1970-01-01
            • 2013-02-13
            • 2011-10-25
            • 1970-01-01
            相关资源
            最近更新 更多