|
Вопрос # 326/ вопрос открыт / |
|
Постановка задачи: Из MSGina нужно запускать интерактивный процесс.
Предоставляю код своей реализации и прошу прокоментировать
почему он может не работать :( ибо зашел слегка в тупик.
Приложение: Переключить в обычный режим- library PMGinaWrapper;
-
- uses
- Windows,
- Messages,
- ShellApi,
- Dialogs,
- Forms,
- SysUtils,
- Registry,
- Classes,
- fWinSecurity in 'FormsfWinSecurity.pas' {fmWinSecurity},
- uUtils in 'SupportuUtils.pas',
- uGinaSupport in 'SupportGinauGinaSupport.pas';
-
- const
- MSGina = 'MSGina.dll';
-
- function WlxInitialize(lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions:
pointer; out WlxContext: pointer): BOOL; stdcall; external MSGina;
- function WlxActivateUserShell(pWlxContext: Pointer; pszDesktopName: PWideChar; pszMprLogonScript:
pWideChar; pEnvironment: Pointer): BOOL; stdcall; external MSGina;
- procedure WlxDisplayLockedNotice(pWlxContext: Pointer); stdcall; external MSGina;
- procedure WlxDisplaySASNotice(pWlxContext: Pointer); stdcall; external MSGina;
- function WlxDisplayStatusMessage(pWlxContext: Pointer; hDesktop: HDESK; dwOptions: DWORD; pTitle:
PWideChar; pMessage: PWideChar): BOOL; stdcall; external MSGina;
- function WlxGetConsoleSwitchCredentials(pWlxContext: Pointer; pCredInfo: Pointer): BOOL; stdcall;
external MSGina;
- function WlxGetStatusMessage(pWlxContext: pointer; var pdwOptions: DWORD; pMessage: PWideChar;
dwBufferSize: DWORD): BOOL; stdcall; external MSGina;
- function WlxIsLockOk(pWlxContext: pointer): BOOL; stdcall; external MSGina;
- function WlxIsLogoffOk(pWlxContext: pointer): BOOL; stdcall; external MSGina;
- function WlxLoggedOnSAS(pWlxContext: Pointer; dwSasType: DWORD; pReserved: Pointer): Integer;
stdcall; external MSGina;
- function WlxLoggedOutSAS(pWlxContext: Pointer; dwSasType: DWORD;
- pAuthenticationId: Pointer; pLogonSid: pointer;
- var pdwOptions: DWORD; var phToken: THandle;
- pMprNotifyInfo: PWLX_MPR_NOTIFY_INFO; pProfile:pointer): dword; stdcall;
external MSGina;
- procedure WlxLogoff(pWlxContext: pointer); stdcall; external MSGina;
- function WlxNetworkProviderLoad(pWlxContext: pointer; pNprNotifyInfo: PWLX_MPR_NOTIFY_INFO): BOOL;
stdcall; external MSGina;
- procedure WlxReconnectNotify(pWlxContext: pointer); stdcall; external MSGina;
- procedure WlxDisconnectNotify(pWlxContext: pointer); stdcall; external MSGina;
- function WlxRemoveStatusMessage(pWlxContext: pointer): BOOL; stdcall; external MSGina;
- function WlxScreenSaverNotify(pWlxContext: pointer; var pSecure: BOOL): BOOL; stdcall; external
MSGina;
- function WlxStartApplication(pWlxContext: pointer; pszDesktopName: PWideChar; pEnvironment:
pointer; pszCmdLine: PWideChar): BOOL; stdcall; external MSGina;
- procedure WlxShutdown(pWlxContext: pointer; ShutdownType: DWORD); stdcall; external MSGina;
- function WlxWkstaLockedSAS(pWlxContext: pointer; dwSasType: DWORD): integer; stdcall; external
MSGina;
-
- function WlxNegotiate(dwWinlogonVersion: DWORD; out dwDllVersion: DWORD): BOOL; stdcall; external
MSGina;
-
- function PMWlxInitialize(lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions:
pointer; out WlxContext: pointer): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- Result := False;
- LogMessage('PMWlxInitialize', 'StartPoint');
- pgContext := PGINA_CONTEXT(LocalAlloc(LMEM_FIXED or LMEM_ZEROINIT, SizeOf(GINA_CONTEXT)));
- if Assigned(pgContext) then
- begin
- pgContext^.hUserToken := 0;
- try
- Result := WlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, WlxContext
{pgContext^.pGinaContext});
- except
- LogMessage('PMWlxInitialize', 'EndPoint');
- end;
- WlxContext := pgContext;
- end;
- LogMessage('PMWlxInitialize', 'EndPoint');
- end;
-
- function PMWlxActivateUserShell(pWlxContext: Pointer; pszDesktopName: PWideChar; pszMprLogonScript:
pWideChar; pEnvironment: Pointer): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxActivateUserShell(pgContext^.pGinaContext, pszDesktopName, pszMprLogonScript,
pEnvironment);
- end;
-
- procedure PMWlxDisplayLockedNotice(pWlxContext: Pointer);
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxDisplayLockedNotice', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- WlxDisplayLockedNotice(pgContext^.pGinaContext);
- LogMessage('PMWlxDisplayLockedNotice', 'EndPoint');
- end;
-
- procedure PMWlxDisplaySASNotice(pWlxContext: Pointer);
- //var
- // pgContext: PGINA_CONTEXT;
- begin
- // pgContext := PGINA_CONTEXT(pWlxContext);
- LogMessage('PMWlxDisplaySASNotice', 'StartPoint');
- WlxDisplaySASNotice(pWlxContext {pgContext^.pGinaContext});
- LogMessage('PMWlxDisplaySASNotice', 'EndPoint');
- end;
-
- function PMWlxDisplayStatusMessage(pWlxContext: Pointer; hDesktop: HDESK; dwOptions: DWORD; pTitle:
PWideChar; pMessage: PWideChar): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxDisplayStatusMessage', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxDisplayStatusMessage(pgContext^.pGinaContext, hDesktop, dwOptions, pTitle, pMessage);
- LogMessage('PMWlxDisplayStatusMessage', 'EndPoint');
- end;
-
- function PMWlxGetConsoleSwitchCredentials(pWlxContext: Pointer; pCredInfo: Pointer): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxGetConsoleSwitchCredentials', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxGetConsoleSwitchCredentials(pgContext^.pGinaContext, pCredInfo);
- LogMessage('PMWlxGetConsoleSwitchCredentials', 'EndPoint');
- end;
-
- function PMWlxGetStatusMessage(pWlxContext: pointer; var pdwOptions: DWORD; pMessage: PWideChar;
dwBufferSize: DWORD): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxGetStatusMessage', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxGetStatusMessage(pgContext^.pGinaContext, pdwOptions, pMessage, dwBufferSize);
- LogMessage('PMWlxGetStatusMessage', 'EndPoint');
- end;
-
- function PMWlxIsLockOk(pWlxContext: pointer): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxIsLockOk', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxIsLockOk(pgContext^.pGinaContext);
- LogMessage('PMWlxIsLockOk', 'EndPoint');
- end;
-
- function PMWlxIsLogoffOk(pWlxContext: pointer): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxIsLogoffOk', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxIsLogoffOk(pgContext^.pGinaContext);
- LogMessage('PMWlxIsLogoffOk', 'EndPoint');
- end;
-
- function PMWlxLoggedOnSAS(pWlxContext: Pointer; dwSasType: DWORD; pReserved: Pointer): Integer;
stdcall;
- var
- fSOS : TfmWinSecurity;
- SASResultAction: Integer;
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxLoggedOnSAS', 'StartPoint');
- 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);
- LogMessage('PMWlxLoggedOnSAS', 'EndPoint');
- 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
- LogMessage('PMWlxLoggedOutSAS', 'StartPoint');
- 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;
- LogMessage('PMWlxLoggedOutSAS', 'EndPoint');
- end;
-
- procedure PMWlxLogoff(pWlxContext: pointer);
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxLogoff', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- WlxLogoff(pgContext^.pGinaContext);
- LogMessage('PMWlxLogoff', 'EndPoint');
- end;
-
- function PMWlxNetworkProviderLoad(pWlxContext: pointer; pNprNotifyInfo: PWLX_MPR_NOTIFY_INFO): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxNetworkProviderLoad', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxNetworkProviderLoad(pgContext^.pGinaContext, pNprNotifyInfo);
- LogMessage('PMWlxNetworkProviderLoad', 'EndPoint');
- end;
-
- procedure PMWlxReconnectNotify(pWlxContext: pointer);
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxReconnectNotify', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- WlxReconnectNotify(pgContext^.pGinaContext);
- LogMessage('PMWlxReconnectNotify', 'EndPoint');
- end;
-
- procedure PMWlxDisconnectNotify(pWlxContext: pointer);
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxDisconnectNotify', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- WlxDisconnectNotify(pgContext^.pGinaContext);
- LogMessage('PMWlxDisconnectNotify', 'EndPoint');
- end;
-
- function PMWlxRemoveStatusMessage(pWlxContext: pointer): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxRemoveStatusMessage', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxRemoveStatusMessage(pgContext^.pGinaContext);
- LogMessage('PMWlxRemoveStatusMessage', 'EndPoint');
- end;
-
- function PMWlxScreenSaverNotify(pWlxContext: pointer; var pSecure: BOOL): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxScreenSaverNotify', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxScreenSaverNotify(pgContext^.pGinaContext, pSecure);
- LogMessage('PMWlxScreenSaverNotify', 'EndPoint');
- end;
-
- function PMWlxStartApplication(pWlxContext: pointer; pszDesktopName: PWideChar; pEnvironment:
pointer; pszCmdLine: PWideChar): BOOL;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxStartApplication', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxStartApplication(pgContext^.pGinaContext, pszDesktopName, pEnvironment, pszCmdLine);
- LogMessage('PMWlxStartApplication', 'EndPoint');
- end;
-
- procedure PMWlxShutdown(pWlxContext: pointer; ShutdownType: DWORD);
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxShutdown', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- WlxShutdown(pgContext^.pGinaContext, ShutdownType);
- LogMessage('PMWlxShutdown', 'EndPoint');
- end;
-
- function PMWlxWkstaLockedSAS(pWlxContext: pointer; dwSasType: DWORD): integer;
- var
- pgContext: PGINA_CONTEXT;
- begin
- LogMessage('PMWlxWkstaLockedSAS', 'StartPoint');
- pgContext := PGINA_CONTEXT(pWlxContext);
- Result := WlxWkstaLockedSAS(pgContext^.pGinaContext, dwSasType);
- LogMessage('PMWlxWkstaLockedSAS', 'EndPoint');
- end;
-
-
-
-
-
- procedure CreatePMProcess;
- var
- si: TStartupInfo;
- pi: TProcessInformation;
- ERROR, hFile, Written: DWORD;
- // Wnd: HWND;
- begin
- GetStartUpInfo(si);
- si.dwFlags := STARTF_USESHOWWINDOW;
- si.wShowWindow := SW_NORMAL;
-
- try
- // CreateProcessAsUser(phMyToken, nil, PChar('notepad'), nil, nil, FALSE,
- // CREATE_NEW_CONSOLE, nil, nil, si, pi);
-
- WaitForSingleObject(pi.hProcess, INFINITE);
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- except
- end;
- // Wnd := FindWindow(nil, PChar(PMWindowName));
- // SendMessage(Wnd, PM_UNBLOCK_MSG, 0, 0);
- end;
-
-
- (*
- function UpdateRegistry(Delete:Boolean):HRESULT;
- var
- Key : HKEY;
- DLLName: array[0..MAX_PATH] of Char;
- const
- KeyName = 'SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon';
- begin
- Result := S_OK;
- // if Delete then
- // RegDeleteKey(HKEY_LOCAL_MACHINE, KeyName)
- // else begin
- if (GetModuleFileName(hInstance, DLLName, SizeOf(DLLName)) = 0)
- or (RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyName, 0, KEY_ALL_ACCESS, Key) <>
ERROR_SUCCESS)
- or (RegSetValueEx(Key, GinaRegKey, 0, REG_SZ, @DLLName, lStrLen(DLLName) + 1) <>
ERROR_SUCCESS) then
- Result := E_UNEXPECTED;
- // end;
- end;
-
- function DllRegisterServer: HRESULT;
- begin
- Result := UpdateRegistry(False);
- end;
-
- function DllUnregisterServer: HRESULT;
- begin
- Result := UpdateRegistry(True);
- end;
- *)
-
-
- exports
- // DllRegisterServer,
- // DllUnregisterServer,
-
- 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';
-
- begin
- end.
 |
Вопрос задал: Kharchenko Maxim (статус: Посетитель)
Вопрос отправлен: 18 февраля 2007, 16:55
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 19 февраля 2007, 10:55; участников в обсуждении: 1.
|
Kharchenko Maxim (статус: Посетитель), 19 февраля 2007, 10:55 [#1]:
Проблема вот в чем: для того, чтобы из 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), ну а дальше по плану восстановление ПАЧЕМУ НЕ ВЫЗВАЛСЯ PMWlxInitialize???? Скоро убьюсь АП СТЕНУ!!!
|
|
Kharchenko Maxim (статус: Посетитель), 19 февраля 2007, 10:55 [#2]:
Я бы мог предположить что проблема например в описании функции:
function WlxInitialize(lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions: pointer; out WlxContext: pointer): BOOL; stdcall; external MSGina;
Но MSDN говорит, что все в порядке с сигнатурой.
Я бы подумал что проблема в stdcall, но это не может быть проблемой, ибо вызов функции C-библиотеки в WinOS так и определяеться.
Вообщем, вся наша жизнь... :wall:
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|