Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.05;
Скачать: CL | DM;

Вниз

MSGina Wrapper: "I Need Help..."   Найти похожие ветки 

 
XMaC   (2007-02-17 20:55) [0]

Постановка задачи: Из MSGina нужно запускать интерактивный процесс.
Предоставляю код своей реализации и прошу прокоментировать
почему он может не работать :( ибо зашел слегка в тупик


 function WlxNegotiate(dwWinlogonVersion: DWORD; out dwDllVersion: DWORD): BOOL; stdcall; external MSGina;
 function WlxInitialize(lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions: pointer; out WlxContext: pointer): BOOL; stdcall; external MSGina;

...................

function PMWlxNegotiate(dwWinlogonVersion: DWORD; out dwDllVersion: DWORD): BOOL;
begin
 Result := False;
 LogEvent("Before call", "WlxNegotiate", Result);
 Result := WlxNegotiate(dwWinlogonVersion, dwDllVersion);
 LogEvent("After call", "WlxNegotiate", Result);
end;

function PMWlxInitialize(lpWinsta: LPWSTR; hWlx: THandle; pvReserved: Pointer; pWinlogonFunctions: pointer; out WlxContext: pointer): BOOL;
var
 pgContext: PGINA_CONTEXT;
begin
 Result := False;
 LogEvent("Before call", "WlxInitialize", Result);
 pgContext := PGINA_CONTEXT(LocalAlloc(LMEM_FIXED or LMEM_ZEROINIT, SizeOf(GINA_CONTEXT)));
 if Assigned(pgContext) then
 begin
   pgContext^.hUserToken := 0;
   Result := WlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, pgContext^.pGinaContext);
   WlxContext := pgContext;
 end;
 LogEvent("After call", "WlxInitialize", Result);
end;

function PMWlxLoggedOnSAS(pWlxContext: Pointer; dwSasType: DWORD; pReserved: Pointer): Integer; stdcall;
var
 fSOS           : TfmWinSecurity;
 SASResultAction: Integer;
 pgContext: PGINA_CONTEXT;
begin
 LogEvent("Before call", "WlxLoggedOnSAS");
 SASResultAction := WLX_SAS_ACTION_NONE;
 pgContext := PGINA_CONTEXT(pWlxContext);
 if (dwSasType = WLX_SAS_TYPE_CTRL_ALT_DEL) then
 begin
   fSOS := TfmWinSecurity.Create(nil);
   try
     SASResultAction := fSOS.ShowModal;
     if (SASResultAction = CUSTOM_SAS_ACTION_PM_CREATE_PROCESS) then
     begin
// Create PM Process
       SASResultAction := WLX_SAS_ACTION_NONE;
     end;
   finally
     fSOS.Free;
     Result := SASResultAction;
   end;
 end else Result := WlxLoggedOnSAS(pgContext^.pGinaContext, dwSasType, pReserved);
 LogEvent("After call", "WlxLoggedOnSAS");
end;

function PMWlxLoggedOutSAS(pWlxContext: Pointer; dwSasType: DWORD;
                          pAuthenticationId: Pointer; pLogonSid: pointer;
                           var pdwOptions: DWORD; phToken: THandle;
                          pMprNotifyInfo: PWLX_MPR_NOTIFY_INFO; pProfile:pointer): dword; stdcall;
var
 pgContext: PGINA_CONTEXT;
begin
 LogEvent("Before call", "WlxLoggedOutSAS");
 pgContext := PGINA_CONTEXT(pWlxContext);
 Result := WlxLoggedOutSAS(pgContext^.pGinaContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile);
 if Result = WLX_SAS_ACTION_LOGON then
   pgContext^.hUserToken := phToken;
 LogEvent("After call", "WlxLoggedOutSAS");
end;

........................

exports
 PMWlxNegotiate Name "WlxNegotiate",
 PMWlxInitialize Name "WlxInitialize",
 PMWlxActivateUserShell Name "WlxActivateUserShell",
 PMWlxDisconnectNotify Name "WlxDisconnectNotify",
 PMWlxDisplayLockedNotice Name "WlxDisplayLockedNotice",
 PMWlxDisplaySASNotice Name "WlxDisplaySASNotice",
 PMWlxDisplayStatusMessage Name "WlxDisplayStatusMessage",
 PMWlxGetConsoleSwitchCredentials Name "WlxGetConsoleSwitchCredentials",
 PMWlxGetStatusMessage Name "WlxGetStatusMessage",
 PMWlxIsLockOk Name "WlxIsLockOk",
 PMWlxIsLogoffOk Name "WlxIsLogoffOk",
 PMWlxLoggedOnSAS Name"WlxLoggedOnSAS",
 PMWlxLoggedOutSAS Name "WlxLoggedOutSAS",
 PMWlxLogoff Name "WlxLogoff",
 PMWlxNetworkProviderLoad Name "WlxNetworkProviderLoad",
 PMWlxReconnectNotify Name "WlxReconnectNotify",
 PMWlxRemoveStatusMessage Name "WlxRemoveStatusMessage",
 PMWlxScreenSaverNotify Name "WlxScreenSaverNotify",
 PMWlxShutdown Name "WlxShutdown",
 PMWlxStartApplication Name "WlxStartApplication",
 PMWlxWkstaLockedSAS Name "WlxWkstaLockedSAS";


 
Eraser ©   (2007-02-17 22:15) [1]

> [0] XMaC   (17.02.07 20:55)

все таки советую вообще отказаться от использования MS GINA, т.к. эту технологию отменили в Висте.


 
XMaC   (2007-02-18 16:35) [2]

Постановка задачи состоит в использовании MSGina, поэтому очень прошу
помочь (наверно слегка пересидел над ней и теперь совсем не могу сообразить
в чем может быть проблема)


 
DiamondShark ©   (2007-02-19 15:44) [3]


> function PMWlxLoggedOnSAS(pWlxContext: Pointer; dwSasType:
>  DWORD; pReserved: Pointer): Integer; stdcall;
> var
>  fSOS           : TfmWinSecurity;
> ...
> begin
> ...
>    fSOS := TfmWinSecurity.Create(nil);
>    try
>      SASResultAction := fSOS.ShowModal;
// И шо? Таки, показывается?
>...
> // Create PM Process
// а тут было самое интересное
> ...
> end;



> в чем может быть проблема

А хз, в чём может быть проблема в непоказанном коде.
В 17-й строке, вестимо.


 
XMaC   (2007-02-19 16:53) [4]

Проблема вот в чем: для того, чтобы из PMWlxLoggedOnSAS создать интерактивный процесс с помощью CreateProcessAs необходим token текущего пользователя.
Токен мы можем получить в PMWlxLoggedOutSAS, но вот вопрос: его еще нужно и сохранить. А вот для того чтобы сохранить его, необходимо подменить контекст Gina своим в PMWlxInitialize. Вот там-то мы и будем хранить наш токен.
И всё вроде бы отлично и по правилам (и MSDN доволен), но как в анекдоте "есть один нюанс": Возможность подмены контекста мы имеем только в PMWlxInitialize (поскольку она вызываеться WinLogon`ом один раз + PMWlxNegotiate).
Итак, лог тихо пишется :
//=============================================//
[MESSAGE]: Before call
[TIME] : 9:19:20
[EVENT] : WlxNegotiate
[ERROR] : The specified resource type cannot be found in the image file
[RESULT] : False
//=============================================//
[MESSAGE]: After call
[TIME] : 9:19:20
[EVENT] : WlxNegotiate
[ERROR] : The operation completed successfully
[RESULT] : True

Из этого лога, мы видим, что обертка над WlxNegotiate вызываеться и успешно )), а потом тишина (на екране скромно разместился Access Violation)


 
Игорь Шевченко ©   (2007-02-19 22:16) [5]


> Из этого лога, мы видим


Что в файле ресурс не найден


 
XMaC   (2007-02-20 15:39) [6]

На самом деле проблема была в отсутствии stdcall у експортируемых функций.
Но когда это я исправил, возникла новая:
Вызываеться WlxLoggedOutSAS и возвращает результат ACTION_LOGON, но
вместо WlxActivateUserShell после этого вызываеться WlxDisplaySASNotice и
дело опять приходит к WlxLoggedOutSAS. :(


 
Игорь Шевченко ©   (2007-02-21 10:52) [7]


> На самом деле проблема была в отсутствии stdcall у експортируемых
> функций.


поищи, может, еще какие-то проблемы найдутся



Страницы: 1 вся ветка

Текущий архив: 2007.08.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
4-1171636729
Vemer
2007-02-16 17:38
2007.08.05
Как уничтожать назначенный Brush?


15-1183951544
Тень отца Гамлта
2007-07-09 07:25
2007.08.05
Разминка для мозгов физиков :)


15-1183970292
dr Gonzo
2007-07-09 12:38
2007.08.05
Качество Freelance


15-1183981323
de.
2007-07-09 15:42
2007.08.05
ICQ


15-1183614347
Qzzma
2007-07-05 09:45
2007.08.05
Книги по Delphi Pascal для "девушек"