Скрипт входа в Windows 7 с использованием пароля

Я пытался написать пакетный файл сценария или исполняемый файл для входа в систему. Он должен выполнять базовую операцию — просто войти в систему на моем компьютере с Windows 7, который не подключен к сети. У меня есть файл jar, работающий в фоновом режиме. Я хочу написать скрипт с паролем для входа в свой собственный компьютер с Windows 7.

Я уже изучил некоторые утилиты Logon.exe.

Вышеупомянутая утилита не работает на моем компьютере, показывает какую-то ошибку, например

Windows Logon version 1.04
Copyright (c) 2003-2010 SoftTree Technologies, Inc.

Unable to install logon service (OpenSCManager failed).
Logon failed.

Где-то написано, что файл нужно запускать от имени администратора.

Это мой код:

Process process = new ProcessBuilder("C:\\Logon.exe","-p","welcome").start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
  System.out.println(line);
}

Я также пытался использовать автоматический вход в систему с помощью LogonExpert.

Вышеупомянутый инструмент работает отлично. Но мне нужно войти в систему только с помощью java и при необходимости.

Пожалуйста, помогите мне, ребята...


person Vignesh Bala    schedule 29.12.2014    source источник
comment
Почему так сложно? Почему в джаве? Почему бы просто не добавить запись об автоматическом входе в реестр?   -  person AlexR    schedule 29.12.2014
comment
Спасибо, бро. Я должен войти в систему, когда срабатывает определенное событие. Я не против использования другого языка. Куда идти?   -  person Vignesh Bala    schedule 30.12.2014
comment
Пожалуйста, обновите свой вопрос и объясните, какое событие должно вызвать вход в систему. Ответ, вероятно, будет зависеть от вашего конкретного варианта использования.   -  person AlexR    schedule 30.12.2014
comment
Хорошо, я создаю приложение Bluetooth, которое позволяет пользователю входить в свою систему, когда он входит в диапазон. Служба работает очень хорошо даже до того, как они войдут в систему. Я попытался вручную ввести учетные данные пароля, используя java.awt.robot. Но пароль не вводится на экране входа. Вот почему я пытаюсь написать скрипт, который будет входить в систему только при входе в диапазон. И я не хочу писать автоматический вход.   -  person Vignesh Bala    schedule 02.01.2015


Ответы (3)


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

Это будет нелегко.

Немного истории

Во-первых, начиная с Windows Vista произошли фундаментальные изменения в том, как Windows получает учетные данные. Упомянутая вами утилита logon.exe использует старую архитектуру. В то время вы могли делать практически все, что хотели, поскольку все, что связано с архитектурой входа в систему, выполнялось как DLL в процессе Winlogon. Возможно, вы уже нашли несколько пользовательских GINA, таких как это, которое я написал. Они игнорируются в последних версиях Windows.

В настоящее время Winlogon запрашивает LogonUI для получения учетных данных. LogonUI — это процесс, в котором размещаются поставщики учетных данных. Поставщик учетных данных представлен плиткой на экране входа в систему. Существует несколько COM-интерфейсов, которые необходимо реализовать, чтобы LogonUI запрашивал у вас учетные данные.

Важно помнить:

  1. Вы должны реализовать COM-интерфейс для взаимодействия с процессом входа в систему.
  2. Вы можете решить, какой пользовательский интерфейс вы представляете, или не пользовательский интерфейс вообще.

Реализация COM-интерфейса в значительной степени исключает Java.

Проблема, с которой вы столкнулись прямо сейчас

Вход пользователя означает получение для него токена безопасности. Но регистрация пользователя в интерактивном режиме означает, что вы должны указать Winlogon открыть дверь. Единственный процесс, который Winlogon будет прослушивать, — это LogonUI.

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

Windows API для создания токена безопасности: LogonUser, кстати.

Как это исправить

Вы должны написать Credential Provider. Я никогда не слышал, как это сделать на Java, это слишком специфично для платформы и непереносимо. Вся документация написана для C++, но я слышал, что это можно сделать и в .Net. Хорошей отправной точкой являются примеры поставщиков учетных данных в Platform SDK.

Когда ваш Credential Provider инициализируется, вы создадите поток, ожидающий некоторого события, например появления устройства Bluetooth. Запуск службы будет работать, если вы можете связаться с вашим CP.

Вам также необходимо сохранить указатель на механизм событий LogonUI в вашей реализации ICredentialProvider::Advise.

Когда поток обнаружения оборудования обнаружит ваше устройство Bluetooth, вызовите ICredentialProviderEvents::CredentialsChanged. Это сообщит LogonUI, чтобы снова пройти через всех поставщиков учетных данных. При вызове вы должны ответить, что вы являетесь провайдером автоматического входа в систему по умолчанию.

Фу! И мы еще не вошли в систему!

Последним шагом является получение пароля, сохраненного для этого пользователя, и отправка его в LogonUI, когда ICredentialProviderCredential::GetSerialization.

LogonUI возьмет его оттуда. Это даст Winlogon указание вызвать для вас пакет проверки подлинности и выполнить вход пользователя.

Этот ответ SO говорит то же самое, но немного кратко. Эта статья MSDM устарела и будет более полной, чем мой ответ.


+ Шифрование и управление паролем пользователя остается в качестве упражнения;) но вы можете взглянуть на API защиты данных.

person ixe013    schedule 11.03.2015

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

Войдите в систему как администратор и выполните (WIN-R) это:

контролировать пароли пользователей2

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

Ваш компьютер по-прежнему будет защищен от удаленного доступа.

person Babbage    schedule 11.03.2015

Поскольку ответ ixe013 объяснил собственный способ интерактивного входа в систему (также проверьте это SO Q&A), я потратил некоторое время на изучение инструмента logonExpert, который уже успешно выполняет свою работу на основе ваших отзывов, инструмент, написанный на Borland Delphi (проверено с помощью PEiD).

Я не уверен, обратили ли вы внимание на инструмент cmd le.exe, который дает вам возможность вызывать его по запросу аналогично logon.exe. (найдено, прочитав файл справки chm).

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

отказ от ответственности: я не имею никакого отношения к logonexpert.

Изменить: я только что обнаружил, что MS SysinternalsSuite включает инструмент autologon, который можно вызвать из cmd (пароль пользователя для автоматического входа в домен).

person Jawad Al Shaikh    schedule 11.03.2015