我正在應用程序中實施許可。授權 - 防止Windows終端服務服務器上的相同登錄
如何阻止用戶在Windows終端服務器上多次使用相同的登錄。
有沒有在Windows終端服務器將特定參數傳遞給Win32_Process的方法?
如果有的話,我可以從中讀取,不允許第二次登錄。
或者必須有一個像中央Windows服務,從我的EXE需要開始之前需要身份驗證的東西。
有什麼建議嗎?
我正在應用程序中實施許可。授權 - 防止Windows終端服務服務器上的相同登錄
如何阻止用戶在Windows終端服務器上多次使用相同的登錄。
有沒有在Windows終端服務器將特定參數傳遞給Win32_Process的方法?
如果有的話,我可以從中讀取,不允許第二次登錄。
或者必須有一個像中央Windows服務,從我的EXE需要開始之前需要身份驗證的東西。
有什麼建議嗎?
做到這一點,最好的辦法是使用全局Mutex:
bool owned;
using (var mutex = new Mutex(true, @"Global\SingleUserNameLogon-" + CurrentUserName, out owned))
{
if (!owned)
{
MessageBox.Show("This program can only be run by one person at a time!");
closeTheForm();
}
//Put the rest of your program here
}
這將創建一個名爲Global\SingleUserNameLogon-Bhoomi
互斥體,如果該程序檢測到另一個程序已經創建一個互斥與確切名稱就會調用closeTheForm()
功能。
通過在互斥體名稱前加上Global\
,它將檢查計算機上的所有會話是否具有相同名稱的互斥鎖,而不僅僅是應用運行的會話。
有一點需要注意的是,一旦互斥體被處置,另一個程序可以運行,因此您可能不需要將互斥體放在using
語句中,而是將其保留爲您在構造函數中創建的窗體的局部變量,關閉。
經過大量的搜索後,我想出了一個自定義解決方案。
解決辦法是這樣的:
當用戶打開了EXE,用戶名附加到文本(窗口標題)的exe的,是這樣的:
this.text = CURRENTUSERNAME;
當exe文件加載它會檢查所有正在運行的進程是這樣的:
Process[] processlist = Process.GetProcesses();
foreach (Process theprocess in processlist)
{
if (theprocess.ProcessName == "SingleUserNameLogon" || theprocess.ProcessName == "SingleUserNameLogon.exe")
if(CurrentUserName == theprocess.MainWindowTitle)
{
closeTheForm();
}
}
這是一個定製的解決方案。
歡迎任何其他優雅的解決方案。