Форум: "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