2017-02-05 5 views
0

Я собирался спросить об этом в суперпользователе, но он связан с программированием на C/C++ и Win32, поэтому я попрошу его здесь. Я хочу добавить шаг между именем пользователя и оболочкой Windows для Windows 7+. Это вещи, которые я исследовал и пытался с ограниченным успехом:Могу ли я вставлять программу между окнами и оболочкой проводника в Windows?

  1. MSGINA тупиковой, который, кажется, как она будет работать отлично, но была прекращена из Windows Vista, так что я не могу использовать это.
  2. Я просмотрел пользовательские Windows Credential Providers, но я не совсем уверен, что это сделает то, что я хочу (запуск приложения после входа в систему и перед оболочкой Windows).
  3. A (полу) пользовательская оболочка, которая будет делать то, что мне нужно, запустите обычную оболочку Windows (explorer.exe).

Вариант 3 получил мне ближе, но моя проблема заключается в том, что я не могу запустить explorer.exe в качестве оболочки, если я создал это значение HKLM\...\Winlogon:Shell реестра, указывающее на мою программу. Я мог бы создать значение Shell в HKCU, а затем изменить его на explorer.exe перед тем, как уйти и запустить проводник, а затем восстановить значение моей программы. Это будет работать, но не так безопасно, как использование HKLM. В этом случае я даже не могу использовать HKLM, поскольку моя программа выполняется в контексте текущего пользователя, и у пользователя нет прав на запись для этого ключа.

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

+0

Разве это не то, что [GINA] (https://en.wikipedia.org/wiki/Graphical_identification_and_authentication) является/был для? –

+1

@UweKeim Да, это так, и это будет работать отлично, но я упоминаю в вопросе, что с Windows Vista и всех версий после Vista [прекращено] (https://en.wikipedia.org/wiki/Graphical_identification_and_authentication#End_of_life) GINA и он больше не будет работать, ведь файл 'msgina.dll' даже не существует в версии Windows с Vista до 10. Замена GINA - это новый' Credential Providers', но я не уверен, что это сработает так как они обрабатывают вещи по-разному. – vane

+0

Может быть (!) «_ ... добавить шаг между входом пользователя и оболочкой Windows ... _» - это проблема [XY] (http://meta.stackexchange.com/a/233676/133056), и если вы объясните, что вы действительно хотите достичь, у кого-то есть альтернативная идея о том, как достичь фактической цели. –

ответ

2

Мне нравится RbMm's answer,, но для полноты другой вариант - Credential Manager.

(Примечание: Диспетчер учетных данных не то же самое, как Credential Provider.)

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

  • You хотите запустить код с повышенными привилегиями.

  • Ваш код должен запускаться на ранней стадии входа в систему, например, до загрузки загружаемых профилей.

  • Вам нужен пароль пользователя.

Некоторые причины вы можете не хотите использовать Credential Manager:

  • Он работает как DLL внутри winlogon, так что вы должны быть особенно осторожны, что ваш код является правильным.

  • В зависимости от того, что вы делаете, это может быть слишком в начале последовательности входа в систему. :-)

  • Он не работает в контексте пользователя. (Существует способ обойти это, но это довольно Hacky.)

+0

Это может быть что-то, что мне нужно переместить, если userinit не работает, поскольку он стоит, пользователь может быстро нажать 'ctrl + shift + escape', чтобы получить доступ к диспетчеру задач до того, как программа загрузится и блокирует его, чтобы ваше решение могло быть более предпочтительным в будущем. Спасибо за большое предложение! – vane

+1

Я не уверен в том, будет ли управление-сменой управления работать, пока выполняется 'userinit'. Я думаю, если вы поместили бы долгую задержку в своей программе, было бы легко проверить. :-) Даже если это произойдет, возможно, есть способ отключить его, поэтому не сдавайтесь слишком быстро! Если вы в конечном итоге решите, что вам нужно попробовать вместо этого использовать диспетчер учетных данных, сообщите мне, и я могу отправить вам копию моего кода, чтобы служить отправной точкой. Мой адрес электронной почты находится в моем профиле. –

+0

Возможно, вы имели в виду возвращение программы для запуска из 'NPLogonNotify'? Почему он взломан? Это именно то, для чего требуется уведомление. Я не уверен, что это синхронно. «Хакерная» вещь, о которой я могу думать, делает эквивалент вызова OpenTokenByLogonId самостоятельно, а затем вызывает «CreateProcessAsUser». Это немного взломанно, но это не похоже на большое дело. Или вы имели в виду что-то еще? Что мне не нравится в этом подходе, так это то, что он использует функцию (управляющие учетными данными - все MPR и сетевые материалы) для чего-то, что действительно не связано. Но если нет другого варианта ... – conio

2

Я думаю, что лучший способ для вставки программы между логином и исследователем оболочкой в ​​Windows, это зарегистрировать собственное приложение под HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon: Userinit

по умолчанию userinit.exe пробега точно между логином и оболочкой и может быть настроен:

Например, чтобы запустить программу перед запуском интерфейса пользователя Проводника Windows , замените имя этой программы для Userinit.exe на значение этой записи, затем включите инструкции в эту программу запустите Userinit.exe.