Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.043 c
2-1183880553
Скарамуш
2007-07-08 11:42
2007.08.05
Привязка переменной к объекту.


2-1183709734
Veter
2007-07-06 12:15
2007.08.05
"менюшки" в стиле MS Word а


15-1184143953
vitv
2007-07-11 12:52
2007.08.05
Проблема с Java


2-1183727842
koha
2007-07-06 17:17
2007.08.05
Можно ли создать событие для не визуального класса?


15-1183841855
Vlad Oshin
2007-07-08 00:57
2007.08.05
что-то раньше не замечал. а действительно. Платят за таку ерунду





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский