【问题标题】:Stop user from opening an already program using PowerShell阻止用户使用 PowerShell 打开已经存在的程序
【发布时间】:2020-10-07 13:48:58
【问题描述】:

我想停止用户使用 PowerShell 在 Windows 中运行已经运行的程序/服务的另一个实例。
例如:我打开了记事本,然后在几分钟内我想禁用打开记事本的选项,因为它已经在运行。

到目前为止,我可以检测程序是否打开,如果没有,我可能会为用户打开它(附代码)。

$processName = Get-Process notepad -ErrorAction SilentlyContinue

if ( $processName ) {
    Write-Host 'Process is already running!'
    #stop another instance of notepad to be opened, since it is already running
}
else {
    $userChoice = Read-Host 'Process is not running, should I start it? (Y/N)  '

    if ($userChoice -eq 'Y') {
        Start-Process notepad
    }
    else {
        Write-Host 'No Problem!'
    }
}


但是,如何禁用用户打开另一个相同实例的选项?

任何相同的线索都会有所帮助。

【问题讨论】:

  • 你不能。 Windows 中没有这样的策略,甚至 AppLocker 中也没有。这可以通过应用程序代码来完成——如果你有源代码——通过添加一个互斥体并检查它是否被获取。如果是则退出程序,否则继续。
  • @vonPryz 感谢您的回复。在那种情况下,我可以以某种方式冻结系统在相同的时间内打开另一个程序吗? (就像系统挂了一样)
  • 如果您没有应用程序的源代码,您可以编写一个小程序作为实际应用程序的启动器。然后启动器包含互斥检查。但这可以通过运行实际程序很容易地规避。你的practical use case 到底是什么?
  • @vonPryz 你能详细说明一下吗?我是 PowerShell 脚本的新手。
  • 我将总结一个关于在 Powershell 中使用包装器的示例。同时,edit 问题并解释了有关用例的更多详细信息。我很确定可能会有更好的解决方案,但这取决于你really are after

标签: windows powershell powershell-7.0 powershell-6.0


【解决方案1】:

由于 Windows 没有阻止启动可执行文件的多个副本的功能,因此您有两种选择:

  1. 不时轮询进程列表。终止应用程序的额外实例
  2. 为应用程序创建一个包装器并使用互斥锁来防止多个副本

第一个选项有其注意事项。如果启动了其他副本,则平均需要一半的轮询间隔来检测这些副本。更何况,要终止哪些进程?最年长的?最年轻的?其他一些标准?

只需启动应用程序本身即可轻松绕过第二个。

唯一真正的解决方案是在应用程序本身中实现单实例功能。游戏经常这样做。对于商业软件,请注意用户会你,如果有一个原因可以使用运行多个实例。是的,特别是如果那个用例would be absurd

作为基于互斥锁的启动器的示例,考虑以下函数

function Test-Mutex {
    $mtx = new-object System.Threading.Mutex($false, "SingleInstanceAppLauncher")

    if(-not $mtx.WaitOne(0, $false)) {
        write-host "Mutex already acquired, will not launch second instance!"
        read-host "Any key"
        return
    }
    write-host "Running instance #1"
    read-host "Any key"
    # Do stuff
}

与解决方案 2 警告一样,任何用户都可以通过执行 do suff 部分来绕过限制。请记住,包装器会阻止启动 wrapper 的多个实例,而不是关于 do stuff

【讨论】:

  • 抱歉回复晚了。我确实按照您在解决方案 1 中的建议进行了解决。这当然不允许打开另一个实例,但是如果用户尝试使用管理权限运行应用程序,则它无法阻止应用程序运行。任何相同的帮助都将是锦上添花。
  • @AlphaSniper 既然你不想解释actual use case,那么猜测是否有解决方案也没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2012-08-16
  • 2023-04-11
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多