阻止用户使用 PowerShell 打开已经存在的程序
Stop user from opening an already program using PowerShell
我想停止用户运行另一个已经运行program/service 在 Windows 中使用 PowerShell。
例如: 我打开了记事本,然后在几分钟内我想禁用打开记事本的选项,因为它已经是 运行.
截至目前,我可以检测程序是否打开,如果没有,我可能会为用户打开它(附加代码)。
$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 没有阻止启动可执行文件的多个副本的功能,您有两个选择:
- 不时轮询进程列表。终止应用程序的额外实例
- 为应用程序创建一个包装器并使用互斥锁来防止多个副本
第一个选项有其注意事项。如果启动了额外的副本,则平均需要一半的轮询间隔来检测这些副本。更重要的是,要终止哪些进程?最年长的?最小的?其他一些标准?
第二个可以通过启动应用程序本身轻松绕过。
唯一真正的解决方案是在应用程序本身中实施 single-instance 功能。游戏经常这样做。对于商业软件,当心用户会 讨厌 你,如果有一个单一的原因 运行 多个实例会被使用。是的,特别是如果那个用例 would be absurd.
作为 mutex-based 启动器的示例,请考虑以下函数
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.
我想停止用户运行另一个已经运行program/service 在 Windows 中使用 PowerShell。
例如: 我打开了记事本,然后在几分钟内我想禁用打开记事本的选项,因为它已经是 运行.
截至目前,我可以检测程序是否打开,如果没有,我可能会为用户打开它(附加代码)。
$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 没有阻止启动可执行文件的多个副本的功能,您有两个选择:
- 不时轮询进程列表。终止应用程序的额外实例
- 为应用程序创建一个包装器并使用互斥锁来防止多个副本
第一个选项有其注意事项。如果启动了额外的副本,则平均需要一半的轮询间隔来检测这些副本。更重要的是,要终止哪些进程?最年长的?最小的?其他一些标准?
第二个可以通过启动应用程序本身轻松绕过。
唯一真正的解决方案是在应用程序本身中实施 single-instance 功能。游戏经常这样做。对于商业软件,当心用户会 讨厌 你,如果有一个单一的原因 运行 多个实例会被使用。是的,特别是如果那个用例 would be absurd.
作为 mutex-based 启动器的示例,请考虑以下函数
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.