Я пытаюсь удалить экран входа в Windows (winlogon) из исполняемого файла, запущенного из службы. Служба автоматически запускается с окнами и ждет команд с другого компьютера. Когда он получит команду, он запустит exe, который запустит cmd.exe под конкретным именем пользователя.
Услуга уже присутствует. У меня есть работа по написанию этого исполняемого файла. В настоящее время я написал исполняемый файл (CmdLogin), который запускает cmd.exe под другим пользователем через вызовы LogonUserW, ImpersonateUser и CreateProcessWithLogonW. Я указываю lpDesktop как "WinSta0\Default". Единственный улов заключается в том, что служба должна запускаться под учетной записью администратора (но это другая проблема).
Это отлично работает при вызове из командной строки (даже в Windows 7). Это также работает при вызове со службы, когда пользователь вошел в систему и просматривал свой рабочий стол (как и при отладке на том же компьютере). Однако, как я уже говорил, мое реальное требование заключается в том, чтобы это работало даже при отображении экрана входа в Windows. В настоящее время exe дает правильный код выхода, но окно не появляется. Однако, когда пользователь входит в систему, он видит окно cmd на рабочем столе.
Одним из решений, которое я нашел, было использование "WinSta0\WinLogon" для lpDesktop вместо Default. Я еще должен попробовать это. Тем не менее, похоже, что он отобразит cmd-окно прямо над экраном входа. Мне действительно нужно на самом деле эмулировать вход пользователя в winlogon и показывать его фактический рабочий стол (и окно cmd).
Я огляделся и обнаружил пакеты уведомлений GINA и Winlogon. Они кажутся излишним, и я не уверен, что это даже решит цель здесь. Более того, они устарели в Windows Vista, что заставляет меня думать, что есть лучший и более простой способ решить эту проблему.
Любые предложения о том, что я должен использовать для достижения этого? Для записи исполняемый файл находится в С# с вызовами API с использованием P/Invoke. Я открыт для использования C dll, который я могу вызвать из этого приложения С#.
Спасибо,
Хусайн
GINA перешла в Vista/2008 с помощью Credential Providers (недоступно в управляемом коде).
Я не знаю, как делать то, что вам нужно, но, возможно, это ключ к дальнейшему продвижению по тропе.
И для записи это кажется неправильным способом решения проблемы. Я просто не вижу, как вам нужно будет запускать командную строку под автозагрузкой... Почему бы не написать службу для выполнения своих задач и запустить ее под набором специальных учетных данных службы?
У меня нет фона на вашей проблеме, но это описание заставляет меня дрожать.: -)
[Обновление] Ну, в ответ на ваш комментарий. Я бы сказал, что поиск замены GINA для <= Windows 2003 или пользовательского поставщика учетных данных для Vista/2008 + будет лучшим вариантом.
Вы можете предоставить пользовательскую проверку подлинности в своем хранилище учетных данных, а затем разрешить или запретить вход в систему по своему усмотрению.