Как программно взаимодействовать с Winlogon?

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

Эта статья https://technet.microsoft.com/en-us/library/dn751047(v=ws.11).aspx объясняет рабочий процесс аутентификации при входе в Windows на следующем изображении:  рабочий процесс аутентификации

Как видно выше, на шаге 5 пользователь вводит учетные данные в пользовательский интерфейс входа в систему. Я хочу добиться, чтобы служба Windows ввела учетные данные, а winlogon выполнил вход.

Для этого не существует API Winlogon. Как видно из других вопросов, использование функции winapi LogonUser успешно выполняет аутентификацию и возвращает токен, но не переключается на рабочий стол приложения, а пользовательский интерфейс входа в систему остается на экране.

Большинство статей и ответов SO намекают на поставщиков учетных данных, но все образцы поставщиков учетных данных требуют взаимодействия пользователя с пользовательским интерфейсом входа в систему.

Обновление: я вижу, что некоторые пользователи не совсем поняли вопрос и предлагают обходные пути, которые в моем случае бесполезны. Рабочий процесс, которого я пытаюсь достичь, выглядит следующим образом:

  1. Служба Windows запускается при загрузке Windows (готово).
  2. Та же служба Windows имеет веб-службу и принимает HTTP-запросы через API (готово).
  3. Пользователь предоставляет учетные данные службе через API с другого устройства (готово).
  4. Предоставленные учетные данные используются для входа на рабочую станцию.
    4.1 Предоставленные учетные данные используются также для разблокировки рабочей станции в случае блокировки (WinKey + L).
  5. (Необязательно) Служба предоставляет учетные записи Windows через API.
  6. (Необязательно) Пользователь может указать службе, какую учетную запись он хочет использовать для входа в систему.

На данный момент меня интересуют шаги 4 и 4.1.


person Dog    schedule 30.12.2017    source источник
comment
Я надеюсь, что это невозможно, если это так, кажется ужасной дырой в безопасности.   -  person SoronelHaetir    schedule 31.12.2017
comment
Это потребует изменения механизма аутентификации Windows. Найдите GINA в MSDN. Однако обойти или изменить механизм тоже не рекомендуется. Сказав это, служба, имеющая права входа в систему, должна иметь это в политике, но не запускать процесс входа в систему - это был бы серьезный сбой безопасности, который заставил бы сисадминов подняться на руки, а пентестеров посмеяться ...   -  person t0mm13b    schedule 31.12.2017
comment
Я знаю о возможностях GINA, он устарел из Windows Vista. Его заменили поставщики учетных данных, и я не думаю, что они охватывают этот вариант использования. Кроме того, я определенно не хочу другого процесса входа в систему. По соображениям безопасности он должен быть интегрирован с существующим winlogon.   -  person Dog    schedule 31.12.2017
comment
@SoronelHaetir: Где конкретно вы видите ужасную дыру в безопасности?   -  person IInspectable    schedule 31.12.2017
comment
программно разблокировать рабочую станцию ​​. Не могли бы вы объяснить, почему вы хотите это сделать? Это немного пахнет проблемой XY.   -  person zett42    schedule 31.12.2017
comment
Пытаюсь разблокировать компьютер через службу Windows. Поэтому либо найдите способ программного взаимодействия с winlogon, либо другой способ с использованием метода winapi LogonUser и используйте токен аутентификации для переключения на рабочий стол приложения. Любой другой метод приветствуется, если он позволяет службе успешно разблокировать станцию.   -  person Dog    schedule 31.12.2017
comment
Первая дыра в безопасности, которую я вижу, заключается в том, что для такой возможности потребуется каким-то образом хранить учетные данные вне winlogin.   -  person SoronelHaetir    schedule 01.01.2018
comment
Никто ничего не сказал о хранении учетных данных. Учетные данные предоставляются службе Windows кем-то, кто их знает, а служба Windows передает их Winlogon.   -  person Dog    schedule 01.01.2018
comment
@SoronelHaetir: Это требование полностью выдумано. Этого не существует. И даже если вы сохраните пароль, это все равно можно будет сделать без ущерба для безопасности. Неучтенные пароли хранятся в зашифрованных разделах файлов web.config, например, чтобы разрешить веб-службам доступ к защищенным базам данных.   -  person IInspectable    schedule 01.01.2018
comment
На самом деле это выглядит ужасно ... Зачем начинать интерактивный сеанс входа в систему, если пользователя нет? Как вы предотвратите взлом разблокированной рабочей станции кем-либо, стоящим рядом с ней? Самое главное, мне действительно хотелось бы знать, почему вы пытаетесь достичь этого, поскольку это кажется неправильным решением любой проблемы. Это еще до того, как мы перейдем к модели безопасности, которая предотвращает взаимодействие многих служб с сеансом рабочего стола пользователя.   -  person Basic    schedule 02.01.2018
comment
Для тех, кто голосует против этого вопроса, не могли бы вы также указать реальную причину этого, помимо предположений? Я не единственный, кто пытается этого добиться: stackoverflow.com/questions/6975206 / Если все сделано правильно, то это даже не дыра в безопасности.   -  person Dog    schedule 02.01.2018
comment
Team Viewer может войти на рабочий стол из заблокированных окон (Win + L), поэтому я предполагаю, что это возможно. Может быть, ты узнаешь, как они это сделали.   -  person Sal    schedule 03.01.2018
comment
Слышал об этом тоже, очень интересовался, как им это удалось. Но, видимо, некоторые здесь пытаются набрать репутацию, закрыв вопрос.   -  person Dog    schedule 03.01.2018
comment
Я думаю, что более серьезный вопрос заключается в том, зачем вам интерактивный процесс?   -  person Ctznkane525    schedule 03.01.2018
comment
Ответ здесь, это дубликат: stackoverflow.com/questions/32372027/   -  person Jeremy Thompson    schedule 08.01.2018
comment
Должен ли быть сервис, инициирующий это действие? А нельзя просто создать учетную запись и настроить ее на автоматический вход?   -  person Damien_The_Unbeliever    schedule 09.01.2018
comment
@JeremyThompson, вопрос может повторяться, но ответ не решает проблему. Не работает, если рабочая станция заблокирована (WinKey + L), работает только при загрузке. Он также не позволяет выбрать учетную запись пользователя, если существует несколько учетных записей пользователей.   -  person Dog    schedule 09.01.2018
comment
@Damien_The_Unbeliever Я обновил вопрос сценарием.   -  person Dog    schedule 09.01.2018
comment
msdn.microsoft.com/en -us / library / windows / desktop /   -  person Luca    schedule 11.01.2018
comment
msdn.microsoft.com/en -us / library / windows / desktop /   -  person Luca    schedule 11.01.2018
comment
@Luca GINA устарела с Windows Vista.   -  person Dog    schedule 11.01.2018
comment
@wonderdog см. вторую ссылку для перспективы или более поздней версии.   -  person Luca    schedule 11.01.2018
comment
@Luca Спасибо за ссылку, но, как я сказал в первоначальном ответе, я думаю, что поставщики учетных данных - это всего лишь способ добавить дополнительные учетные данные, которые будут представлены пользовательским интерфейсом входа в систему. Они используются на шаге 3 схемы, а не на шаге 5. Я пробовал работать с поставщиками учетных данных в течение нескольких недель, но мне не удалось этого добиться.   -  person Dog    schedule 11.01.2018
comment
Просто из любопытства: что будет делать сервис после разблокировки? Что должно произойти, если несколько пользователей вошли в систему и заблокировали свои рабочие столы?   -  person Emond Erno    schedule 15.01.2018


Ответы (6)


Просто при прохождении ... Но разве среди примеров Microsoft нет поставщика учетных данных, который принимает асинхронный ввод? Я определенно написал такую, которая регистрирует пользователя, который сканирует приемлемый отпечаток пальца, независимо от того, какая плитка отображается. Для меня это означает, что взаимодействие с LogonUI должно быть не более чем неявным, но, возможно, я что-то упускаю.

Но, возможно, нет. Хотя я не сомневаюсь, что намерение состоит в том, что асинхронный ввод будет исходить от пользователя, действующего на оборудовании, как при сканировании пальца, я обычно не вспоминаю об этом. Если это не так, тогда у вас может быть свой программный вариант в виде представления учетных данных, как если бы они были собраны асинхронно - не с устройства, которое явно подключено к компьютеру, а с вашего побочного канала HTTP, неизвестно что.

Итак, можете ли вы сделать так, чтобы провайдер учетных данных прослушивал RPC от вашей службы для уведомления об учетных данных, которые ваша служба собрала через свой побочный канал? Или пусть ваша служба прослушивает RPC от вашего поставщика учетных данных, чтобы узнать, какие учетные данные еще доступны? Возможно, я не удивлюсь, если одно направление будет закрыто - даже из соображений безопасности - но я подумал, что одно или другое можно заставить работать.

Стоит ли вам хотеть что-то из этого, я не хочу вдаваться в подробности.

person Geoff Chappell    schedule 16.01.2018

Не то чтобы я потворствовал этому, но просто предлагаю вам решение проблемы. И он не взаимодействует программно с процессом WinLogon. Он программно работает над этим.

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

Специально установите эти regkeys

HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ AutoAdminLogin HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ DefaultUserName HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ DefaultPassword

* Изменить *

Помогает с 4. Не помогает с 4.1. Если вы не хотите перезагрузиться, чтобы разблокировать, в чем я сомневаюсь.

Другая альтернатива, которая звучит многообещающе \ заслуживает изучения, упоминается в более старом вопросе https://stackoverflow.com/a/35173886/4640588

person MrMikeJJ    schedule 15.01.2018
comment
Не помогает с 4.1, который на самом деле важнее, чем 4, поскольку поведение пользователя обычно заключается в выполнении разблокировки чаще, чем входа в систему. Это решение также убивает перспективы для шагов 5 и 6. - person Dog; 18.01.2018

Я написал для этого коммерческое решение под названием SasLibEx. SasLibEx - это библиотека, предназначенная для разработчиков, изначально поддерживающая c / c ++ и delphi.

SasLibEx умеет:

  • Имитация Ctrl Alt Del (последовательность безопасного внимания)
  • Отмена Ctrl Alt Del
  • Заблокировать рабочую станцию
  • Разблокировать рабочую станцию ​​(без учетных данных)
  • Отключить Ctrl Alt Del
  • Снова включить Ctrl Alt Del
  • Отменить ожидающий запрос UAC
  • Рабочий стол заблокирован

См. https://www.remkoweijnen.nl/blog/tag/saslibex/.

person Remko    schedule 16.01.2018

У меня были почти те же требования к фреймворку на основе селена, который я создаю. Короче говоря, мне нужно было запустить приложение на станции Windows пользователя (WinSTA0), а это означало, что пользователь должен был войти в виртуальную машину.

Я уже создал проект с менеджером учетных данных и использовал его для достижения следующего рабочего процесса:

  • Запустите виртуальную машину, скопируйте компоненты с помощью Powershell
  • Установите CredManager, перезагрузите виртуальную машину.
  • Cred Manager создает случайного пользователя, сохраняет его в базе данных
  • Авторизоваться с этим пользователем
  • Пользователь имеет автозапуск в реестре приложения, и приложение запускает веб-сервер, с которым можно связаться для запуска сеансов селена.

Если я правильно понимаю ваши требования, вам нужно будет создать диспетчер учетных данных, который будет предоставлять сервер (http, именованные каналы и т. Д.) Для связи с учетными данными для автоматического входа - здесь нет необходимости тратить время на пользовательский интерфейс. Используйте метод Advice в вашей ITestWindowsCredentialProvider реализации, чтобы запустить сервер, и UnAdvice, чтобы остановить его.

Я бы посоветовал вам в этом помочь:

  • Используйте внешнюю службу ведения журнала (например, app-insights), чтобы получать отзывы о вашей службе и упрощать отладку.
  • Используйте виртуальную машину в качестве хорошей практики, поскольку критический сбой в Winlogon сделает компьютер бесполезным.
  • Используйте try catch на более высоком уровне для всех ваших методов в реализации COM-компонента, чтобы проглотить исключение, чтобы сохранить сбои Winlogon

Кроме того, для большей картины вы должны иметь в виду, что все эти процессы имеют разный доступ (и время жизни для компонентов COM) к станциям Windows, рабочим столам и запускаются от имени разных пользователей. Однако я не думаю, что это будет иметь большое значение для вас.

Вы можете найти базовый код диспетчера учетных данных здесь: https://github.com/phaetto/windows-credentials-provider

person Alexander Mantzoukas    schedule 02.03.2018

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

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

Мой собственный провайдер учетных данных также имеет функцию автоматического входа в систему / разблокировки в некоторых случаях использования.

person Alexander    schedule 10.10.2018

Программный обход / вход в систему от имени пользователя пугает с точки зрения кибербезопасности.

Я не уверен, что вы пытаетесь сделать, но почему бы вместо этого не развернуть задачу запуска для выполнения работы с использованием учетной записи службы на компьютере?

Вы можете настроить его для запуска, даже если пользователь не вошел в систему в указанное время / событие. Если это не сработает, не могли бы вы немного подробнее описать свой сценарий?

person Emmanuel Ferran    schedule 08.01.2018
comment
У меня уже есть служба, работающая в фоновом режиме. Его цель - разблокировать станцию, больше ничего делать не нужно. - person Dog; 09.01.2018