Удаление экрана входа в Windows через сервис - PullRequest
2 голосов
/ 18 июня 2009

Я пытаюсь удалить экран входа в систему Windows (winlogon) из исполняемого файла, запущенного из службы. Служба будет запускаться автоматически с Windows и ждать команд с другого компьютера. Когда он получает команду, он запускает исполняемый файл, который запускает 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, что заставляет меня думать, что есть лучший и более аккуратный метод для решения этой проблемы.

Любые предложения о том, что я должен использовать для достижения этой цели? Напомним, что исполняемый файл находится в C # с вызовами API с использованием P / Invoke. Я открыт для использования C dll, который я тоже могу вызывать из этого приложения C #.

Спасибо,
Хусайн

1 Ответ

2 голосов
/ 07 июля 2009

GINA была заменена в Vista / 2008 провайдерами учетных данных (недоступно в управляемом коде).

Я не знаю, как делать то, что вам нужно, но, возможно, это ключ, чтобы идти дальше по тропе.

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

У меня нет предыстории по вашей проблеме, но это описание заставляет меня вздрогнуть. : -)

[Update] Ну, в ответ на ваш комментарий. Я бы сказал, что написание замены GINA для <= Windows 2003 или поставщика пользовательских учетных данных для Vista / 2008 + будет выглядеть как ваш лучший вариант. </p>

Вы можете предоставить пользовательскую аутентификацию по его хранилищу учетных данных, а затем разрешить или запретить вход в систему по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...