微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决阻止用户使用PowerShell打开已经存在的程序

我想停止使用Windows在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没有阻止启动可执行文件的多个副本的功能,因此您有两个选择:

  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部分来解决限制。请记住,包装器阻止启动包装器的多个实例,而不是启动包装材料

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?