Windows 阻止用户使用PowerShell打开已存在的程序
我想阻止用户使用PowerShell在Windows中运行另一个已运行程序/服务的实例。Windows 阻止用户使用PowerShell打开已存在的程序,windows,powershell,powershell-7.0,powershell-6.0,Windows,Powershell,Powershell 7.0,Powershell 6.0,我想阻止用户使用PowerShell在Windows中运行另一个已运行程序/服务的实例。 例如:我打开了记事本,然后在几分钟内我想禁用打开记事本的选项,因为它已经在运行 到目前为止,我可以检测程序是否打开,如果没有,我可能会为用户打开它(附加代码) 但是,如何禁用用户打开同一实例的另一个实例的选项 这方面的任何线索都会有帮助。由于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
}