Используем мобильный для входа в систему

26 Мар
2012

Совсем недавно на блоге увидел забавное изобретение, USB-ключ, определяемый как HID устройство, которое входило в систему автоматический, захотелось что то подобное, но под рукой был только сотовый (Samsung SGH-X820).



Учитывая что у меня два пользователя ПК, мне порой приходиться блокировать своего пользователя, но об этом я не всегда вспоминаю, и USB-ключ был бы для меня просто замечательным, но судьба решила иначе.

Первым делом я полез узнавать как определить что это именно тот телефон, в диспетчере устройств он определялся как Samsung Mobile USB port (COM3), а так как телефон было видно лишь через Samsung PC Studio, простая проверка на наличия файла в усб носителе мне не подходила. Долгий поиски по гуглу привели меня на а-чат, где я нашел Advanced Serial Data Logger (я его называю com-сниффер), о настройке данного приложения говорить не буду, там нет не чего сложного, при подключенном телефоне и включений PC suite в COM3 не чего не происходило(долго я думал почему), как оказалось всё происходило в невидимом для дисп.устройств порте COM4, где меня сразу привлекла команда:

AT+CGMM


на что мобильный отвечал

AT+CGMMSGH-X820


Перечитав пару статей по работе с COM портами в C#, и получив достижение Lonely в VS2010, я отыскал WinApi функцию блокировки пользователя:

 
[DllImport("user32.dll", SetLastError = true)]
static extern bool LockWorkStation();



Добавил на форму таимер и в событий Tick:

 try
{
var port1 = new SerialPort("COM4")
{
BaudRate = 115200,
Parity = Parity.None,
DataBits = 8,
StopBits = StopBits.One,
Handshake = Handshake.RequestToSend,
DtrEnable = true,
RtsEnable = true,
NewLine = Environment.NewLine
};
port1.Open();
port1.WriteLine("AT+CGMM");
port1.ReadLine();
var te = port1.ReadLine();
if (te.IndexOf("SGH-X820", StringComparison.Ordinal) > 0)
{
//LogIn();
}
else
{
LogOut();
}
port1.Close();
}
catch (Exception)
{
LogOut();
}


Поясняю:
port1 наш порт, через который мы будем общаться с телефоном.

Важно: скорость передачи и остальные параметры должны быть такие же как и у телефона, в противном случае они не «найдут» друг-друга! Узнать их можно в диспетчере устройств (смотреть COM3).

Событие при соединений телефона я так и не сделал, но при отсоединение его от компа, я блокировал своего пользователя, а так как я порой убегаю не глядя на результат, я решил добавить это в цикл while:

private void LogOut()
{
while (!LockWorkStation())
{
Thread.Sleep(100);
}
}


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



загрузка...

Комментарии:

Наверх