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

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

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

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

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

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

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

3 ответа

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

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

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

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

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

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

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

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

Другие вопросы по тегам