Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 阻止用户使用PowerShell打开已存在的程序_Windows_Powershell_Powershell 7.0_Powershell 6.0 - Fatal编程技术网

Windows 阻止用户使用PowerShell打开已存在的程序

Windows 阻止用户使用PowerShell打开已存在的程序,windows,powershell,powershell-7.0,powershell-6.0,Windows,Powershell,Powershell 7.0,Powershell 6.0,我想阻止用户使用PowerShell在Windows中运行另一个已运行程序/服务的实例。 例如:我打开了记事本,然后在几分钟内我想禁用打开记事本的选项,因为它已经在运行 到目前为止,我可以检测程序是否打开,如果没有,我可能会为用户打开它(附加代码) 但是,如何禁用用户打开同一实例的另一个实例的选项 这方面的任何线索都会有帮助。由于Windows没有阻止启动可执行文件多个副本的功能,因此您有两种选择: 时不时地轮询进程列表。终止应用程序的额外实例 创建应用程序的包装,并使用互斥锁防止多个副本 第一

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

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


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


这方面的任何线索都会有帮助。

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

  • 时不时地轮询进程列表。终止应用程序的额外实例
  • 创建应用程序的包装,并使用互斥锁防止多个副本
  • 第一种选择有它的警告。如果启动其他副本,则检测这些副本平均需要轮询间隔的一半。此外,要终止哪些进程?老大?最小的?还有其他标准吗

    第二个问题可以通过只启动应用程序本身轻松解决

    唯一真正的解决方案是在应用程序本身中实现单个实例特性。游戏经常这样做。对于业务软件,如果有一个原因说明运行多个实例是有用的,那么要小心用户会讨厌你。是的,尤其是在这个用例中

    作为基于互斥体的发射器的一个例子,考虑以下函数

    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
    部分绕过限制。请记住,包装器阻止启动包装器的多个实例,而不是do stuff。

    您不能。Windows中没有这样的策略,甚至在AppLocker中也没有。这可以通过应用程序代码来实现——如果您有源代码的话——通过添加互斥锁并检查它是否被获取。如果是,请退出程序,否则继续。@vonPryz感谢您的回复。在这种情况下,我是否可以某种程度上冻结系统,使其无法在相同的时间内打开另一个程序?(就像系统被挂起一样)如果你没有应用程序的源代码,你可以编写一个小程序作为实际应用程序的启动程序。然后,启动器包含互斥检查。但是,只要运行实际的程序,就可以很容易地避免这种情况。“你到底在这里干什么?”vonPryz,你能详细说明一下吗?我是PowerShell脚本新手。我将总结一个关于在PowerShell中使用包装器的示例。同时,提问并解释更多关于用例的细节。我很确定可能有更好的解决方案,但这取决于你的想法。很抱歉回复晚了。我确实按照您在解决方案1中的建议进行了变通。这当然不允许打开另一个实例,但是如果用户尝试使用管理权限运行应用程序,则无法停止该应用程序的运行。“任何对这方面的帮助都是小菜一碟。”阿尔法狙击手既然你不想解释这个问题,那么猜测是否有解决方案也没有意义。
    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
    }