Как я могу сделать сервис входа в систему Windows для меня? - PullRequest
1 голос
/ 22 декабря 2011

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

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

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

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

0 голосов
/ 23 декабря 2011

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

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

0 голосов
/ 22 декабря 2011

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

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

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

...