Как мне сделать для меня сервисный вход в Windows?

У меня здесь базовая настройка, никаких доменов или чего-то особенного. Я могу заставить программу получать сообщение с моего телефона, чтобы запускать события и т. Д.

Как приложение C # может работать в фоновом режиме перед входом в систему? (Сначала попробую как сервис ...)

И как эта программа может инициировать вход в Windows? Это было бы личное приложение, поэтому я не особо беспокоюсь о безопасности.

какой-то псевдокод (да, я знаю, что это небезопасно):

LogOnWindows(string WindowsUserName, string WindowsPassword)
{
  if (Environment.GetEnvironmentVariable(USERNAME) == null)
  {
    LogonWindows(WindowsUserName, WindowsPassword);
  }
}

Я проверил вызов API LogOnUser для Windows, но, похоже, он регистрирует пользователя в фоновом режиме ...


person Andrew Mock    schedule 22.12.2011    source источник
comment
служба не может этого сделать.   -  person Daniel A. White    schedule 22.12.2011
comment
AFAIK, окна не позволяют программе входить в систему от имени пользователя ... кроме, возможно, поставщика биометрических данных ...   -  person Adam    schedule 22.12.2011


Ответы (3)


Есть много-много веских причин для обеспечения безопасности, по которым приложению очень и очень сложно это сделать. Как сказал бы Раймонд Чен, «представьте, может ли какое-нибудь приложение это сделать».

Правильный способ сделать это (что, вероятно, доставит НАМНОГО больше проблем, чем вам захочется иметь дело) - создать замену GINA. Вы можете найти пример здесь.

Но опять же, остановитесь, подумайте и подумайте о значении простого утверждения: «Я хочу, чтобы приложение могло входить в систему как кто угодно без взаимодействия с пользователем». Это было возможно в Windows 9x, и эта функция была удалена по дизайну. Подумай об этом.

person Stu    schedule 23.12.2011

Если служба всегда должна запускаться от имени данного пользователя (т. Е. Ей не нужно менять пользователей в ответ на запросы), тогда вы должны просто установить учетные данные указанного пользователя на вкладке «Вход в систему» ​​службы и не беспокоиться о программном изменении реквизиты для входа.

В противном случае вам нужно использовать API LogonUser и передать токен из этого API в новый экземпляр WindowsIdentity, а затем использовать метод Impersonate для этого нового удостоверения. Есть хорошая статья о том, что здесь задействовано здесь.

Также забыл упомянуть: если вы работаете в качестве службы, ваш метод использования Environment.GetEnvironmentVariable не будет получать информацию о пользователе службы, а не информацию об интерактивном пользователе (технически, в зависимости от ОС, может быть несколько одновременных интерактивных пользователей).

person competent_tech    schedule 22.12.2011

Единственный способ, которым я видел это в прошлом, - это реализовать что-то похожее на VNC, где вы управляете вводом с клавиатуры и мыши из службы. Хорошей отправной точкой было бы рассмотрение исходного кода UltraVNC или чего-то подобного. (Внимание, написано на C ++ и не для слабонервных).

РЕДАКТИРОВАТЬ: Если вам нравится неуправляемый код (C ++ или аналогичный), это можно было бы проще реализовать, используя одно из опубликованных предложений здесь.

person M.Babcock    schedule 22.12.2011