Один экземпляр приложения для нескольких учетных записей пользователей Windows

Я использовал решение Mutex, чтобы запретить одновременное открытие более одного экземпляра моего приложения.

но когда я использую «Переключить пользователя» в Windows и открываю другого пользователя и пытаюсь открыть приложение, оно открывается нормально и не может обнаружить, что оно работает в другой учетной записи.

как я могу решить что-то подобное и запретить открытие приложения среди вошедших в систему учетных записей пользователей Windows

я использую такой код

Dim onlyInstance As Boolean = False
_mutex = New Mutex(True, "Application Name", onlyInstance)
If Not onlyInstance Then
   MessageBox.Show("Application is already running.", "Error.")
   System.Diagnostics.Process.GetCurrentProcess.Kill()
   System.Diagnostics.Process.GetCurrentProcess.WaitForExit()
End If

person mkalashy    schedule 15.10.2012    source источник


Ответы (4)


Если вы сделаете свой мьютекс глобальным, то он будет виден всем пользователям:

mutexName = String.Format("Global\\{{{0}}}", "Application Name"); 

Из документации:

Именованный системный мьютекс может иметь два уровня видимости. Если его имя начинается с префикса «Global\», то мьютекс виден во всех сеансах терминального сервера. Если его имя начинается с префикса «Локальный\», мьютекс виден только в сеансе сервера терминалов, где он был создан. В этом случае отдельный мьютекс с тем же именем может существовать в каждом из других сеансов терминального сервера на сервере. Если вы не укажете префикс при создании именованного мьютекса, он принимает префикс «Локальный\». В сеансе сервера терминалов два мьютекса, имена которых различаются только своими префиксами, являются отдельными мьютексами, и оба видны всем процессам в сеансе сервера терминалов. То есть имена префиксов "Global\" и "Local\" описывают область действия имени мьютекса относительно сеансов сервера терминалов, а не относительно процессов.

person stuartd    schedule 15.10.2012
comment
На самом деле это противоположно тому, о чем просит плакат. - person Justin; 15.10.2012

Техника, которую я использовал в течение 30 лет, заключается в том, что приложение просто пытается открыть (и удерживать открытым) известный файл для монопольного доступа при запуске, а затем выйти, если оно не может открыть этот файл.

Я знаю, что это очень низкотехнологично и ретро, ​​но это просто, всегда поддерживается и работает буквально везде. Я успешно использовал его в производственном коде на более чем полудюжине ОС и более чем на дюжине различных языков программирования.

person RBarryYoung    schedule 15.10.2012

Я не думаю, что другие пользователи, не являющиеся администраторами, могут видеть процессы других пользователей.

Я предлагаю написать службу Windows, которая работает в системном пространстве. Затем ваша программа может подключиться к нему и определить, запускать ее или нет.

person Daniel A. White    schedule 15.10.2012

Взгляните на это решение для приложений WPF. Оно использует мьютекс для установления уникальности, но также использует WCF для разрешить новому экземпляру обмениваться данными с основным экземпляром.

person Bob Vale    schedule 15.10.2012