2017-01-11 12 views
0

Моя программа защищена аппаратным USB токен, и я хочу добиться:Windows, блокировка USB-порт для каждого пользователя в C++

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

Так что, если первый пользователь запускает программное обеспечение, я хотел бы заблокировать порт USB, так что только этот пользователь сможет получить к нему доступ. Программное обеспечение написано на C++ и работает в Windows> 7 или Windows Server> 2008

Любые идеи?

+0

Я не думаю, что вы можете сделать это в окнах. Или даже Linux без доступа root. Вы можете использовать пару [глобальных мьютексов] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686931 (v = vs.85) .aspx), чтобы делать то, что вы просите. Один из них, названный «MySoft», указывает на то, что работает другой экземпляр; другой, названный «MySoft.username», указывает, что он принадлежит этому пользователю (поэтому вполне нормально создавать больше экземпляров). –

+0

В качестве альтернативы, токен USB может быть спроектирован так, чтобы быть «заявленным» конкретным пользователем (SID), дополнительные запросы того же пользователя будут успешными, в то время как другие пользователи потерпят неудачу. –

+0

Проблема с сохранением идентификатора пользователя на токене USB - это то, что остается, когда программное обеспечение выходит из строя. Тогда токен будет недействительным :( – choosyg

ответ

1

Как предложил Джонатон, вы можете использовать объект глобальных имен. Проверьте пример глобальной общей памяти: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx

Когда начинается процесс, он должен

  1. получить GetUserName (возможно также GetCurrentProcessId).
  2. открытой имени совместно используемой памяти, как «Global \\ MyAppRunningInstances»
  3. Анализировать каждую строку значений, как: Имя, ProcessId, сердцебиение-временной метки ...
  4. Если он находит еще один процесс с другим именем пользователя, проверить сердцебиение timestamp, может быть, он давно разбился :) (если этот процесс был не единственным, разделение памяти не будет уничтожено)
  5. Если отметка времени означает, что процесс «чужой» запущен, вы можете выйти из текущего процесса с помощью сообщение о том, что существует еще один сеанс пользователя.
  6. Если никаких «чужеродных» процессов не обнаружено, добавьте/отредактируйте запись для текущего пользователя.
  7. ли периодическое обновление пульса с отметкой времени