Как настроить кнопку для открытия приложения на экране входа в Windows

Это мой первый вопрос.

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

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

введите здесь описание изображения

введите здесь описание изображения

Вот чего я хочу добиться

Если есть что-то, что может помочь мне, это будет приветствоваться.


person Bob White    schedule 25.09.2019    source источник
comment
Похоже, вы можете найти демо-версию этого программного обеспечения. Используйте инструмент создания снимков реестра и узнайте, где эта программа регистрируется.   -  person Anders    schedule 25.09.2019
comment
веб-сайт для демонстрации не работает.   -  person Bob White    schedule 25.09.2019
comment
Я предполагаю, что для запуска приложения используется метод HRESULT PasswordResetCredential::SetSelected(BOOL* pbAutoLogon).   -  person Bob White    schedule 25.09.2019
comment
На самом деле это может быть не приложение, весь пользовательский интерфейс может быть частью поставщика учетных данных - во всяком случае, так это должно быть сделано. Но я считаю, что если вы запустите приложение из поставщика учетных данных (через CreateProcess или любым другим способом), оно будет видно пользователю.   -  person Harry Johnston    schedule 27.09.2019
comment
В Provider::SetUsageScenario перечислите свои учетные данные в случае CPUS_LOGON. Увеличьте pdwCount в GetCredentialCount, чтобы задать количество отображаемых плиток. Перечислите учетные данные в getCredentialAt. То, что вы делаете в этих учетных данных, не имеет значения. Как сказал @Harry_Johnston, вы можете практически загрузить любой графический интерфейс (экран входа в Windows просто является рабочим столом, специально заблокированным для пользователей лямбда). Сделайте в нем свои вещи, затем вызовите событие CredentialsChanged, чтобы вернуться к экрану выбора плитки. - Пришлось передать детали, такие как загрузка изображения плитки и т. Д. Из-за ограничения размера комментария.   -  person Kianii    schedule 27.09.2019
comment
Почти все настроено так, как вы просите. Я читаю эти блоги. technet.microsoft.com/aho/2009/11/14/ Я не знаю, где открыть приложение и спрятать все МЕ. мне нужно просто нажать на плитку, а затем открыть приложение.   -  person Bob White    schedule 27.09.2019
comment
Я бы сделал это в Credential::SetSelected, как вы упомянули. Я никогда не работал с классическими учетными данными поведения... поэтому убедитесь, что нет проблем с загрузкой вашего интерфейса, прежде чем возвращать S_OK. Может быть полностью прозрачным... особенно если ваш IU скрывает тайлы.   -  person Kianii    schedule 27.09.2019
comment
вы можете увидеть, где я вызываю свое приложение github.com/azufre/ CredentialProvider/blob/ работает. но когда он выбирает плитку и блокирует экран, через несколько минут он сам открывает приложение.   -  person Bob White    schedule 27.09.2019
comment
system(start) не приостанавливает текущий поток, который продолжает работать, и возвращает S_OK. Что вы хотите сделать, так это не возвращаться, пока ваше приложение работает. И даже это может не дать вам ожидаемого результата. В случае, если ваши учетные данные формально хотят, чтобы вы вернулись, вам нужно будет запустить поток приложения перед функцией и использовать SetEvent/WaitForSingleObject, чтобы решить, следует ли отображать пользовательский интерфейс.   -  person Kianii    schedule 27.09.2019
comment
Я не хочу отображать IU. какой метод я должен использовать?   -  person Bob White    schedule 27.09.2019
comment
Давайте продолжим это обсуждение в чате.   -  person Bob White    schedule 27.09.2019
comment
То, что они, кажется, делают в первоначальном примере, который вы нам дали, просто отображают какой-то пользовательский интерфейс, чтобы скрыть экран входа в систему. В вашем случае программа полностью изолирована от кода учетных данных.   -  person Kianii    schedule 30.09.2019
comment
Да, я хочу получить это. Я прошу об этом.   -  person Bob White    schedule 30.09.2019
comment
Используя system(start), они, вероятно, не используют одно и то же адресное пространство. Я не думаю, что вы можете что-то с этим поделать. За исключением кода TestStartApp.exe. Зависит от того, чем оно написано.   -  person Kianii    schedule 30.09.2019
comment
да, я сделал это. но есть еще кое-что, с чем нужно столкнуться. Я открыл приложение, но если экран получает фоновую блокировку, приложение запускается, это похоже на то, что событие Credential::SetSelected запускается по умолчанию.   -  person Bob White    schedule 30.09.2019
comment
Согласны ли мы с тем, что приведенный ниже код не изменился. Особенно следующее: Credential::SetSelected --› *pbAutoLogon по-прежнему имеет значение FALSE Provider::GetCredentialCount --› *pdwDefault по-прежнему установлено значение CREDENTIAL_PROVIDER_NO_DEFAULT, а *pbAutoLogonWithDefault равно FALSE Provider::GetCredentialAt не слишком сильно изменилось.   -  person Kianii    schedule 01.10.2019


Ответы (2)


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

1) Запустите приложение при запуске события SetSelected из учетных данных поставщика.

HRESULT PasswordResetCredential::SetSelected(BOOL* pbAutoLogon)  
{
    *pbAutoLogon = FALSE;  

    system("start C:\\TestStartApp.exe");

    return S_OK;
}

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

2) Создайте CommanLink, затем запустите приложение в событии CommandLinkClicked.

HRESULT PasswordResetCredential::CommandLinkClicked(DWORD dwFieldID)
{

    HRESULT hr = S_OK;

    if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) && (CPFT_COMMAND_LINK == _rgCredProvFieldDescriptors[dwFieldID].cpft)) {
        system("start C:\\TestStartApp.exe");
    }

    return hr;

}

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

person Bob White    schedule 01.10.2019

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

  1. Является вызовом ICredentialProviderCredential::Advise - ваш провайдер получит указатель на ICredentialProviderCredentialEvents интерфейс LogonUI.

  2. Вы вызываете ICredentialProviderCredentialEvents::OnCreatingWindow, чтобы получить HWND для родительского окна.

  3. Как вы упомянули выше, вы можете создать новый процесс внутри обработчика для вызова ваших провайдеров ICredentialProviderCredential::SetSelected.

Взгляните на этот сообщение.

person Alexander    schedule 01.10.2019
comment
Он не использует диалог. Не уверен, что он сможет вернуть ручку. - person Kianii; 01.10.2019
comment
Связанный пост, например, посвящен выполнению некоторой работы внутри Credential Provider. - person Alexander; 01.10.2019
comment
Мой плохой, смотрел на ответ Диодака - person Kianii; 01.10.2019