Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как можно заблокировать вход в Windows Xp


Автор: kosyak 16.5.2011, 04:36
Есть ли возможность перехватить и не дать выполнить аутентификацию пользователя? Возможно есть способ сделать кнопку ОК (Вход) неактивным, пока не не ступит определенное действие. Смотрел на форуме, ответа на вопрос не нашел, возможно  поможет написание dll и загрузки ее winlogon`om, но не понятно как отловить действия входа и временно приостановить процесс аутентификации. Возможно можно приостановить сервис lsass.exe? Заранее спасибо.

Автор: bems 16.5.2011, 05:10
общая информация о кастомизации аутентификации:
старые винды http://msdn.microsoft.com/en-us/library/aa380543%28v=VS.85%29.aspx
новые винды http://msdn.microsoft.com/en-us/library/bb648647%28v=VS.85%29.aspx

Автор: MetalFan 16.5.2011, 11:40
Что-то напоминает написание ВинЛокеров всяких с просьбой послать смс для получения кода разблокировки...
Не?

Автор: kosyak 16.5.2011, 14:23
Нет, это не вредоносное ПО,  к тому же мне не нужно менять и выводить информацию в  окно аутентификации, 
мне нужно чтобы можно было заблокировать или приостановить вход пользователя, пока не будет положительного условия

Автор: kosyak 16.5.2011, 14:42
Цитата(bems @ 16.5.2011,  05:10)
общая информация о кастомизации аутентификации:
старые винды http://msdn.microsoft.com/en-us/library/aa380543%28v=VS.85%29.aspx
новые винды http://msdn.microsoft.com/en-us/library/bb648647%28v=VS.85%29.aspx

Спасибо за ссылки, после беглого просмотра, я так понимаю, для решении задачи потребуется переписать msgina.dll?  Скорей всего прозвучит глупо, но может кто нить занимался данным вопрос и есть на делфях написанная dll? которая реализует все основные функции, которые msgina  экспортирует winlogon`у? Пожалуйста не пинайте сильно, эт нужно для диплома и сроки очень поджимают

Автор: bems 16.5.2011, 15:09
Ну не переписать, а например сделать длл-переходник, которая будет дергать таковую от ms
Про готовые исходники на дельфи мне ничего не известно

Автор: kosyak 16.5.2011, 15:33
Цитата(bems @ 16.5.2011,  15:09)
Ну не переписать, а например сделать длл-переходник, которая будет дергать таковую от ms
Про готовые исходники на дельфи мне ничего не известно

Так кажется кое что начинает проясняться, как я понял,  мне в принципе нужно только перехватить функцию WlxLoggedOutSAS. из RSDN "GINA, обработав данное событие, может либо перевести Winlogon в состояние "Есть залогиненный пользователь. Станция разблокирована", либо оставить его в текущем состоянии." Вот мне как раз нужно чтоб "оставить его в текущем состоянии", т.е. по сути можно написать промежуточную dll между winlogon`ом и msgina.dll, которая будет проверять только одну функцию?

Автор: bems 16.5.2011, 16:56
вроде как, но вообще смотря что за событие. Может просто ждать в ней, и не логинить пользователя пока не произошло событие, но и не выходить. А чего те ждать надо?

Автор: kosyak 16.5.2011, 17:02
Цитата(bems @ 16.5.2011,  16:56)
вроде как, но вообще смотря что за событие. Может просто ждать в ней, и не логинить пользователя пока не произошло событие, но и не выходить. А чего те ждать надо?

Делаю аутентификацию с железом, конкретно с флешкой, нужно ждать пока не будет   вставлена  "правильная" флешка и после чего залогинить пользователя, нет флешки, нет входа в систему

Автор: bems 16.5.2011, 17:08
ну тогда отказывать при отсутствии, да

Автор: kosyak 16.5.2011, 17:16
Цитата(bems @ 16.5.2011,  17:08)
ну тогда отказывать при отсутствии, да

Есть какие нить мысли как выполнить отказ, ведь winlogon обменивается сообщениями с msgina.dll, есть возможность написать dll она будет вызывать все функции из msgina.dll  кроме WlxLoggedOutSAS, при вызове этой функции я создаю условие наличия флешки, если нет флешки то фукция не передается msgina.dll? а если флешка есть, то вызываю эту фукцию из msgina, такой подход логичен или нет?

еще возник вопрос,  где указывается путь к загрузке msgina.dll? скорей всего в реестре winlogon`a, но найти не могу( 

Автор: bems 16.5.2011, 18:19
Цитата(kosyak @  16.5.2011,  17:16 Найти цитируемый пост)
она будет вызывать все функции из msgina.dll  кроме WlxLoggedOutSAS, при вызове этой функции я создаю условие наличия флешки, если нет флешки то фукция не передается msgina.dll? а если флешка есть, то вызываю эту фукцию из msgina
ну да

Цитата(kosyak @  16.5.2011,  17:16 Найти цитируемый пост)
еще возник вопрос,  где указывается путь к загрузке msgina.dll? скорей всего в реестре winlogon`a, но найти не могу( 

http://msdn.microsoft.com/en-us/library/aa378179%28v=VS.85%29.aspx

Добавлено через 1 минуту и 19 секунд
Это чтоб прописать твою. Нну а дефолная длл от ms всегда в одном и том же месте 

Автор: kosyak 16.5.2011, 18:34
по поводу прописать в ключе реестра winlogon ginadll и указать свою dll, то так уже делал, минус в том что окно аутентификации и выхода из системы принимает классический вид, как я понял этого не избежать( и еще наблюдается более долгая загрузка explorer.exe? возможно криво в dll написал, хотя по большому счету там кроме как экспортирование функций из msgina и нет ниче 

Автор: kosyak 17.5.2011, 00:47
На одном из форумов нашел вот этот код, он рабочий, спецы помогите разобраться, как я понял функция WlxLoggedOutSAS возвращает три состояния:
WLX_SAS_ACTION_LOGON, WLX_SAS_ACTION_NONE и WLX_SAS_ACTION_SHUTDOWN. каким образом мне послать winlogon`у WLX_SAS_ACTION_NONE, если нет нужной флешки?

Код

library GINA;
uses
  Windows,
  Forms,
  JwaWinNT in 'jwawinnt.pas',
  JwaWinType in 'jwawintype.pas';


type
    TInfoForHash = array [0..10] of string; 
  PWLX_MPR_NOTIFY_INFO = ^WLX_MPR_NOTIFY_INFO;
  {$EXTERNALSYM PWLX_MPR_NOTIFY_INFO}
  _WLX_MPR_NOTIFY_INFO = record
    //
    // The name of the account logged onto (e.g. REDMOND\Joe).
    // The string pointed to by this field must be separately
    // allocated and will be separately deallocated by Winlogon.
    //
    pszUserName: PWSTR;
    //
    // The string pointed to by this field must be separately
    // allocated and will be separately deallocated by Winlogon.
    //
    pszDomain: PWSTR;
    //
    // Cleartext password of the user account.  If the OldPassword
    // field is non-null, then this field contains the new password
    // in a password change operation.  The string pointed to by
    // this field must be separately allocated and will be seperately
    // deallocated by Winlogon.
    //
    pszPassword: PWSTR;
    //
    // Cleartext old password of the user account whose password
    // has just been changed.  The Password field contains the new
    // password.  The string pointed to by this field must be
    // separately allocated and will be separately deallocated by
    // Winlogon.
    //
    pszOldPassword: PWSTR;
  end;
  {$EXTERNALSYM _WLX_MPR_NOTIFY_INFO}
  WLX_MPR_NOTIFY_INFO = _WLX_MPR_NOTIFY_INFO;
  {$EXTERNALSYM WLX_MPR_NOTIFY_INFO}
  TWlxMprNotifyInfo = WLX_MPR_NOTIFY_INFO;
  PWlxMprNotifyInfo = PWLX_MPR_NOTIFY_INFO;

/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//
// WLX_TERMINAL_SERVICES_DATA is used by the GINA during a
// WlxQueryTerminalServicesData() callback into WinLogon from the
// WlxLoggedOutSAS() context, after the user name and domain are known.
// This structure relates to TS user configuration information which is
// retrieved from the Domain Controller and SAM database. Having WinLogon
// pass this information means the GINA does not need to do the same
// off-machines lookups again.
//


const

  MSGina='MSGina.dll';
 
procedure WlxActivateUserShell;external MSGina;
procedure WlxDisconnectNotify;external MSGina;
procedure WlxDisplayLockedNotice;external MSGina;
procedure WlxDisplaySASNotice;external MSGina;
procedure WlxDisplayStatusMessage;external MSGina;
procedure WlxGetConsoleSwitchCredentials;external MSGina;
procedure WlxGetStatusMessage;external MSGina;
function  WlxInitialize(lpWinsta: LPWSTR; hWlx: HANDLE; pvReserved: PVOID;
pWinlogonFunctions: PVOID; var pWlxContext: PVOID): BOOL; stdcall; external MSGina;
procedure WlxIsLockOk;external MSGina;
procedure WlxIsLogoffOk;external MSGina;
procedure WlxLoggedOnSAS; external MSGina;
///////////////////////////////////////////////////////////////////////
function WlxLoggedOutSAS(pWlxContext: PVOID; dwSasType: DWORD;
  var pAuthenticationId: LUID; var pLogonSid: SID; var pdwOptions: DWORD;
  var phToken: HANDLE; var pNprNotifyInfo: WLX_MPR_NOTIFY_INFO;
  var pProfile: PVOID):Integer;stdcall; external MSGina;
///////////////////////////////////////////////////////////////////////
procedure WlxLogoff;external MSGina;
procedure WlxNegotiate;external MSGina; 
procedure WlxNetworkProviderLoad;external MSGina;
procedure WlxReconnectNotify;external MSGina;
procedure WlxRemoveStatusMessage;external MSGina;
procedure WlxScreenSaverNotify;external MSGina;
procedure WlxShutdown;external MSGina;
procedure WlxStartApplication;external MSGina;
procedure WlxWkstaLockedSAS;external MSGina;

/////////////////////////////////////////////////////////////
var _WlxLoggedOutSAS: Pointer;

function MyWlxLoggedOutSAS(pWlxContext: PVOID; dwSasType: DWORD;
  var pAuthenticationId: LUID; var pLogonSid: SID; var pdwOptions: DWORD;
  var phToken: HANDLE; var pNprNotifyInfo: WLX_MPR_NOTIFY_INFO;
  var pProfile: PVOID): Integer; stdcall; 
begin

//////////////////////////////

Сюда что то надо писать

///////////////////////////////

  GetProcedureAddress(_WlxLoggedOutSAS, msgina, 'WlxLoggedOutSAS');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WlxLoggedOutSAS]
  end;

end;
//////////////////////////////////////////////////////////////

var _WlxInitialize: Pointer;
  
function MyWlxInitialize(lpWinsta: LPWSTR; hWlx: HANDLE; pvReserved: PVOID;
pWinlogonFunctions: PVOID; var pWlxContext: PVOID):Integer; stdcall;

begin

GetProcedureAddress(_WlxInitialize, msgina, 'WlxInitialize');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WlxInitialize]
  end;
     //Result:=1;
end;

exports

  WlxActivateUserShell,
  WlxDisconnectNotify,
  WlxDisplayLockedNotice,
  WlxDisplaySASNotice,
  WlxDisplayStatusMessage,
  WlxGetConsoleSwitchCredentials,
  WlxGetStatusMessage,
  MyWlxInitialize    Name 'WlxInitialize',
  WlxIsLockOk,
  WlxIsLogoffOk, 
  WlxLoggedOnSAS,
  MyWlxLoggedOutSAS  Name'WlxLoggedOutSAS',
  WlxLogoff,
  WlxNegotiate,
  WlxNetworkProviderLoad,
  WlxReconnectNotify,
  WlxRemoveStatusMessage,
  WlxScreenSaverNotify,
  WlxShutdown,
  WlxStartApplication,
  WlxWkstaLockedSAS;
begin
end.



Очень жду вашей помощи!

Автор: Dik0n 17.5.2011, 01:18
Цитата(kosyak @  17.5.2011,  00:47 Найти цитируемый пост)
Сюда что то надо писать

Ну дак проверяй свое условие, вставлена ли нужная флешка

Код

if если не та флешка then
begin
  Result := WLX_SAS_ACTION_NONE;
  Exit;
end;

Автор: kosyak 17.5.2011, 02:12
Цитата(Dik0n @ 17.5.2011,  01:18)
Цитата(kosyak @  17.5.2011,  00:47 Найти цитируемый пост)
Сюда что то надо писать

Ну дак проверяй свое условие, вставлена ли нужная флешка

Код

if если не та флешка then
begin
  Result := WLX_SAS_ACTION_NONE;
  Exit;
end;

просто присвоить result не получиться, так как функция возвращает integer, надо объявить const WLX_SAS_ACTION_LOGON, WLX_SAS_ACTION_NONE и WLX_SAS_ACTION_SHUTDOWN и происвоить им значение, пока к сожалению,   не нашел чему они равняются


Если я  ошибаюсь, поправьте  меня пожалуйста

Автор: Dik0n 17.5.2011, 03:01
Ну дак погуглить пол минуты делов то

Код

const
WLX_SAS_ACTION_LOGON                       = 1;
WLX_SAS_ACTION_NONE                         = 2;
WLX_SAS_ACTION_LOCK_WKSTA             = 3;
WLX_SAS_ACTION_LOGOFF                      = 4;
WLX_SAS_ACTION_SHUTDOWN                = 5;
WLX_SAS_ACTION_PWD_CHANGED          = 6;
WLX_SAS_ACTION_TASKLIST                    = 7;
WLX_SAS_ACTION_UNLOCK_WKSTA         = 8;
WLX_SAS_ACTION_FORCE_LOGOFF                 9;
WLX_SAS_ACTION_SHUTDOWN_POWER_OFF  =   10;
WLX_SAS_ACTION_SHUTDOWN_REBOOT         =   11;
WLX_SAS_ACTION_SHUTDOWN_SLEEP            =   12;
WLX_SAS_ACTION_SHUTDOWN_SLEEP2          =    13;
WLX_SAS_ACTION_SHUTDOWN_HIBERNATE    =    14;
WLX_SAS_ACTION_RECONNECTED                   = 15;
WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF  =        16;
WLX_SAS_ACTION_SWITCH_CONSOLE             =   17;

Автор: kosyak 17.5.2011, 03:15

большое спасибо, щас попробую 

Автор: kosyak 17.5.2011, 03:47
Если я создаю условие 
Код

if условие then
   begin 
     result:=WLX_SAS_ACTION_NONE;
     exit;
   end;


то ничего не происходит, я нормально логинюсь, хотя я попадаю на result, проверял с помощью создания текстового файла.
Пытался еще делать просто Result:=WLX_SAS_ACTION_NONE, в этом случае как только я ввожу пароль, появляется синий экран в котором упоминается winlogon


нет, все таки нельзя передавать result:=WLX_SAS_ACTION_NONE, система сваливается с синим экраном, может чего-то не хватает еще?

Автор: kosyak 17.5.2011, 12:06
Блин, ничего не получается, все время синий экран вылезает, люди добрые, помогите советом, кто разбирался уже с данным вопросом smile 

Автор: Dik0n 17.5.2011, 13:42
Исходник
http://sourceforge.net/projects/knightgina/files/Knightgina%20files%20%28newer%21%29/Stable%20sources/KGSrc.tar.gz/download

ну и почитай еще 
http://rsdn.ru/article/baseserv/winlogon.xml
http://rsdn.ru/article/baseserv/extgina.xml

Автор: kosyak 19.5.2011, 00:50
Спасибо за ссылки, вопрос почти решен, очень полезно, кто хочет разобраться, почитать SDK Platform, есть вариант для Delphi, может и урезанный конечно, там находятся две dll GinaHook и GinaStub, обе замечательно работают и переделываются под свои нужды

ссылка на SDK Platform GINA&Winlogon: http://rghost.ru/6989431

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)