簡體   English   中英

阻止用戶使用 PowerShell 打開已經存在的程序

[英]Stop user from opening an already program using PowerShell

我想阻止用戶使用 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 沒有阻止啟動多個可執行文件副本的功能,因此您有兩個選擇:

  1. 不時輪詢進程列表。 終止應用程序的額外實例
  2. 為應用程序創建一個包裝器並使用互斥鎖來防止多個副本

第一個選項有其警告。 如果啟動額外的副本,平均需要一半的輪詢間隔來檢測這些副本。 更重要的是,哪些進程將被終止? 最年長的? 最小的? 其他一些標准?

只需啟動應用程序本身即可輕松繞過第二個。

唯一真正的解決方案是在應用程序本身中實現單實例功能。 游戲經常這樣做。 對於商業軟件,請注意用戶會討厭您,如果運行多個實例的原因只有一個。 是的,特別是如果那個用例是荒謬的

作為基於互斥鎖的啟動器的示例,請考慮以下函數

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部分來繞過限制。 請記住,包裝防止啟動包裝的多個實例,而不是對做的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM