Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 326

/ вопрос открыт /

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

Приложение:
  1. library PMGinaWrapper;
  2.  
  3. uses
  4. Windows,
  5. Messages,
  6. ShellApi,
  7. Dialogs,
  8. Forms,
  9. SysUtils,
  10. Registry,
  11. Classes,
  12. fWinSecurity in 'FormsfWinSecurity.pas' {fmWinSecurity},
  13. uUtils in 'SupportuUtils.pas',
  14. uGinaSupport in 'SupportGinauGinaSupport.pas';
  15.  
  16. const
  17. MSGina = 'MSGina.dll';
  18.  
  19. function WlxInitialize(lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions: pointer; out WlxContext: pointer): BOOL; stdcall; external MSGina;
  20. function WlxActivateUserShell(pWlxContext: Pointer; pszDesktopName: PWideChar; pszMprLogonScript: pWideChar; pEnvironment: Pointer): BOOL; stdcall; external MSGina;
  21. procedure WlxDisplayLockedNotice(pWlxContext: Pointer); stdcall; external MSGina;
  22. procedure WlxDisplaySASNotice(pWlxContext: Pointer); stdcall; external MSGina;
  23. function WlxDisplayStatusMessage(pWlxContext: Pointer; hDesktop: HDESK; dwOptions: DWORD; pTitle: PWideChar; pMessage: PWideChar): BOOL; stdcall; external MSGina;
  24. function WlxGetConsoleSwitchCredentials(pWlxContext: Pointer; pCredInfo: Pointer): BOOL; stdcall; external MSGina;
  25. function WlxGetStatusMessage(pWlxContext: pointer; var pdwOptions: DWORD; pMessage: PWideChar; dwBufferSize: DWORD): BOOL; stdcall; external MSGina;
  26. function WlxIsLockOk(pWlxContext: pointer): BOOL; stdcall; external MSGina;
  27. function WlxIsLogoffOk(pWlxContext: pointer): BOOL; stdcall; external MSGina;
  28. function WlxLoggedOnSAS(pWlxContext: Pointer; dwSasType: DWORD; pReserved: Pointer): Integer; stdcall; external MSGina;
  29. function WlxLoggedOutSAS(pWlxContext: Pointer; dwSasType: DWORD;
  30. pAuthenticationId: Pointer; pLogonSid: pointer;
  31. var pdwOptions: DWORD; var phToken: THandle;
  32. pMprNotifyInfo: PWLX_MPR_NOTIFY_INFO; pProfile:pointer): dword; stdcall; external MSGina;
  33. procedure WlxLogoff(pWlxContext: pointer); stdcall; external MSGina;
  34. function WlxNetworkProviderLoad(pWlxContext: pointer; pNprNotifyInfo: PWLX_MPR_NOTIFY_INFO): BOOL; stdcall; external MSGina;
  35. procedure WlxReconnectNotify(pWlxContext: pointer); stdcall; external MSGina;
  36. procedure WlxDisconnectNotify(pWlxContext: pointer); stdcall; external MSGina;
  37. function WlxRemoveStatusMessage(pWlxContext: pointer): BOOL; stdcall; external MSGina;
  38. function WlxScreenSaverNotify(pWlxContext: pointer; var pSecure: BOOL): BOOL; stdcall; external MSGina;
  39. function WlxStartApplication(pWlxContext: pointer; pszDesktopName: PWideChar; pEnvironment: pointer; pszCmdLine: PWideChar): BOOL; stdcall; external MSGina;
  40. procedure WlxShutdown(pWlxContext: pointer; ShutdownType: DWORD); stdcall; external MSGina;
  41. function WlxWkstaLockedSAS(pWlxContext: pointer; dwSasType: DWORD): integer; stdcall; external MSGina;
  42.  
  43. function WlxNegotiate(dwWinlogonVersion: DWORD; out dwDllVersion: DWORD): BOOL; stdcall; external MSGina;
  44.  
  45. function PMWlxInitialize(lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions: pointer; out WlxContext: pointer): BOOL;
  46. var
  47. pgContext: PGINA_CONTEXT;
  48. begin
  49. Result := False;
  50. LogMessage('PMWlxInitialize', 'StartPoint');
  51. pgContext := PGINA_CONTEXT(LocalAlloc(LMEM_FIXED or LMEM_ZEROINIT, SizeOf(GINA_CONTEXT)));
  52. if Assigned(pgContext) then
  53. begin
  54. pgContext^.hUserToken := 0;
  55. try
  56. Result := WlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, WlxContext {pgContext^.pGinaContext});
  57. except
  58. LogMessage('PMWlxInitialize', 'EndPoint');
  59. end;
  60. WlxContext := pgContext;
  61. end;
  62. LogMessage('PMWlxInitialize', 'EndPoint');
  63. end;
  64.  
  65. function PMWlxActivateUserShell(pWlxContext: Pointer; pszDesktopName: PWideChar; pszMprLogonScript: pWideChar; pEnvironment: Pointer): BOOL;
  66. var
  67. pgContext: PGINA_CONTEXT;
  68. begin
  69. pgContext := PGINA_CONTEXT(pWlxContext);
  70. Result := WlxActivateUserShell(pgContext^.pGinaContext, pszDesktopName, pszMprLogonScript, pEnvironment);
  71. end;
  72.  
  73. procedure PMWlxDisplayLockedNotice(pWlxContext: Pointer);
  74. var
  75. pgContext: PGINA_CONTEXT;
  76. begin
  77. LogMessage('PMWlxDisplayLockedNotice', 'StartPoint');
  78. pgContext := PGINA_CONTEXT(pWlxContext);
  79. WlxDisplayLockedNotice(pgContext^.pGinaContext);
  80. LogMessage('PMWlxDisplayLockedNotice', 'EndPoint');
  81. end;
  82.  
  83. procedure PMWlxDisplaySASNotice(pWlxContext: Pointer);
  84. //var
  85. // pgContext: PGINA_CONTEXT;
  86. begin
  87. // pgContext := PGINA_CONTEXT(pWlxContext);
  88. LogMessage('PMWlxDisplaySASNotice', 'StartPoint');
  89. WlxDisplaySASNotice(pWlxContext {pgContext^.pGinaContext});
  90. LogMessage('PMWlxDisplaySASNotice', 'EndPoint');
  91. end;
  92.  
  93. function PMWlxDisplayStatusMessage(pWlxContext: Pointer; hDesktop: HDESK; dwOptions: DWORD; pTitle: PWideChar; pMessage: PWideChar): BOOL;
  94. var
  95. pgContext: PGINA_CONTEXT;
  96. begin
  97. LogMessage('PMWlxDisplayStatusMessage', 'StartPoint');
  98. pgContext := PGINA_CONTEXT(pWlxContext);
  99. Result := WlxDisplayStatusMessage(pgContext^.pGinaContext, hDesktop, dwOptions, pTitle, pMessage);
  100. LogMessage('PMWlxDisplayStatusMessage', 'EndPoint');
  101. end;
  102.  
  103. function PMWlxGetConsoleSwitchCredentials(pWlxContext: Pointer; pCredInfo: Pointer): BOOL;
  104. var
  105. pgContext: PGINA_CONTEXT;
  106. begin
  107. LogMessage('PMWlxGetConsoleSwitchCredentials', 'StartPoint');
  108. pgContext := PGINA_CONTEXT(pWlxContext);
  109. Result := WlxGetConsoleSwitchCredentials(pgContext^.pGinaContext, pCredInfo);
  110. LogMessage('PMWlxGetConsoleSwitchCredentials', 'EndPoint');
  111. end;
  112.  
  113. function PMWlxGetStatusMessage(pWlxContext: pointer; var pdwOptions: DWORD; pMessage: PWideChar; dwBufferSize: DWORD): BOOL;
  114. var
  115. pgContext: PGINA_CONTEXT;
  116. begin
  117. LogMessage('PMWlxGetStatusMessage', 'StartPoint');
  118. pgContext := PGINA_CONTEXT(pWlxContext);
  119. Result := WlxGetStatusMessage(pgContext^.pGinaContext, pdwOptions, pMessage, dwBufferSize);
  120. LogMessage('PMWlxGetStatusMessage', 'EndPoint');
  121. end;
  122.  
  123. function PMWlxIsLockOk(pWlxContext: pointer): BOOL;
  124. var
  125. pgContext: PGINA_CONTEXT;
  126. begin
  127. LogMessage('PMWlxIsLockOk', 'StartPoint');
  128. pgContext := PGINA_CONTEXT(pWlxContext);
  129. Result := WlxIsLockOk(pgContext^.pGinaContext);
  130. LogMessage('PMWlxIsLockOk', 'EndPoint');
  131. end;
  132.  
  133. function PMWlxIsLogoffOk(pWlxContext: pointer): BOOL;
  134. var
  135. pgContext: PGINA_CONTEXT;
  136. begin
  137. LogMessage('PMWlxIsLogoffOk', 'StartPoint');
  138. pgContext := PGINA_CONTEXT(pWlxContext);
  139. Result := WlxIsLogoffOk(pgContext^.pGinaContext);
  140. LogMessage('PMWlxIsLogoffOk', 'EndPoint');
  141. end;
  142.  
  143. function PMWlxLoggedOnSAS(pWlxContext: Pointer; dwSasType: DWORD; pReserved: Pointer): Integer; stdcall;
  144. var
  145. fSOS : TfmWinSecurity;
  146. SASResultAction: Integer;
  147. pgContext: PGINA_CONTEXT;
  148. begin
  149. LogMessage('PMWlxLoggedOnSAS', 'StartPoint');
  150. SASResultAction := WLX_SAS_ACTION_NONE;
  151. pgContext := PGINA_CONTEXT(pWlxContext);
  152. if (dwSasType = WLX_SAS_TYPE_CTRL_ALT_DEL) then
  153. begin
  154. fSOS := TfmWinSecurity.Create(nil);
  155. try
  156. SASResultAction := fSOS.ShowModal;
  157. if (SASResultAction = CUSTOM_SAS_ACTION_PM_CREATE_PROCESS) then
  158. begin
  159. // Create PM Process
  160. SASResultAction := WLX_SAS_ACTION_NONE;
  161. end;
  162. finally
  163. fSOS.Free;
  164. Result := SASResultAction;
  165. end;
  166. end else Result := WlxLoggedOnSAS(pgContext^.pGinaContext, dwSasType, pReserved);
  167. LogMessage('PMWlxLoggedOnSAS', 'EndPoint');
  168. end;
  169.  
  170. function PMWlxLoggedOutSAS(pWlxContext: Pointer; dwSasType: DWORD;
  171. pAuthenticationId: Pointer; pLogonSid: pointer;
  172. var pdwOptions: DWORD; phToken: THandle;
  173. pMprNotifyInfo: PWLX_MPR_NOTIFY_INFO; pProfile:pointer): dword; stdcall;
  174. var
  175. pgContext: PGINA_CONTEXT;
  176. begin
  177. LogMessage('PMWlxLoggedOutSAS', 'StartPoint');
  178. pgContext := PGINA_CONTEXT(pWlxContext);
  179. Result := WlxLoggedOutSAS(pgContext^.pGinaContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile);
  180. if Result = WLX_SAS_ACTION_LOGON then
  181. pgContext^.hUserToken := phToken;
  182. LogMessage('PMWlxLoggedOutSAS', 'EndPoint');
  183. end;
  184.  
  185. procedure PMWlxLogoff(pWlxContext: pointer);
  186. var
  187. pgContext: PGINA_CONTEXT;
  188. begin
  189. LogMessage('PMWlxLogoff', 'StartPoint');
  190. pgContext := PGINA_CONTEXT(pWlxContext);
  191. WlxLogoff(pgContext^.pGinaContext);
  192. LogMessage('PMWlxLogoff', 'EndPoint');
  193. end;
  194.  
  195. function PMWlxNetworkProviderLoad(pWlxContext: pointer; pNprNotifyInfo: PWLX_MPR_NOTIFY_INFO): BOOL;
  196. var
  197. pgContext: PGINA_CONTEXT;
  198. begin
  199. LogMessage('PMWlxNetworkProviderLoad', 'StartPoint');
  200. pgContext := PGINA_CONTEXT(pWlxContext);
  201. Result := WlxNetworkProviderLoad(pgContext^.pGinaContext, pNprNotifyInfo);
  202. LogMessage('PMWlxNetworkProviderLoad', 'EndPoint');
  203. end;
  204.  
  205. procedure PMWlxReconnectNotify(pWlxContext: pointer);
  206. var
  207. pgContext: PGINA_CONTEXT;
  208. begin
  209. LogMessage('PMWlxReconnectNotify', 'StartPoint');
  210. pgContext := PGINA_CONTEXT(pWlxContext);
  211. WlxReconnectNotify(pgContext^.pGinaContext);
  212. LogMessage('PMWlxReconnectNotify', 'EndPoint');
  213. end;
  214.  
  215. procedure PMWlxDisconnectNotify(pWlxContext: pointer);
  216. var
  217. pgContext: PGINA_CONTEXT;
  218. begin
  219. LogMessage('PMWlxDisconnectNotify', 'StartPoint');
  220. pgContext := PGINA_CONTEXT(pWlxContext);
  221. WlxDisconnectNotify(pgContext^.pGinaContext);
  222. LogMessage('PMWlxDisconnectNotify', 'EndPoint');
  223. end;
  224.  
  225. function PMWlxRemoveStatusMessage(pWlxContext: pointer): BOOL;
  226. var
  227. pgContext: PGINA_CONTEXT;
  228. begin
  229. LogMessage('PMWlxRemoveStatusMessage', 'StartPoint');
  230. pgContext := PGINA_CONTEXT(pWlxContext);
  231. Result := WlxRemoveStatusMessage(pgContext^.pGinaContext);
  232. LogMessage('PMWlxRemoveStatusMessage', 'EndPoint');
  233. end;
  234.  
  235. function PMWlxScreenSaverNotify(pWlxContext: pointer; var pSecure: BOOL): BOOL;
  236. var
  237. pgContext: PGINA_CONTEXT;
  238. begin
  239. LogMessage('PMWlxScreenSaverNotify', 'StartPoint');
  240. pgContext := PGINA_CONTEXT(pWlxContext);
  241. Result := WlxScreenSaverNotify(pgContext^.pGinaContext, pSecure);
  242. LogMessage('PMWlxScreenSaverNotify', 'EndPoint');
  243. end;
  244.  
  245. function PMWlxStartApplication(pWlxContext: pointer; pszDesktopName: PWideChar; pEnvironment: pointer; pszCmdLine: PWideChar): BOOL;
  246. var
  247. pgContext: PGINA_CONTEXT;
  248. begin
  249. LogMessage('PMWlxStartApplication', 'StartPoint');
  250. pgContext := PGINA_CONTEXT(pWlxContext);
  251. Result := WlxStartApplication(pgContext^.pGinaContext, pszDesktopName, pEnvironment, pszCmdLine);
  252. LogMessage('PMWlxStartApplication', 'EndPoint');
  253. end;
  254.  
  255. procedure PMWlxShutdown(pWlxContext: pointer; ShutdownType: DWORD);
  256. var
  257. pgContext: PGINA_CONTEXT;
  258. begin
  259. LogMessage('PMWlxShutdown', 'StartPoint');
  260. pgContext := PGINA_CONTEXT(pWlxContext);
  261. WlxShutdown(pgContext^.pGinaContext, ShutdownType);
  262. LogMessage('PMWlxShutdown', 'EndPoint');
  263. end;
  264.  
  265. function PMWlxWkstaLockedSAS(pWlxContext: pointer; dwSasType: DWORD): integer;
  266. var
  267. pgContext: PGINA_CONTEXT;
  268. begin
  269. LogMessage('PMWlxWkstaLockedSAS', 'StartPoint');
  270. pgContext := PGINA_CONTEXT(pWlxContext);
  271. Result := WlxWkstaLockedSAS(pgContext^.pGinaContext, dwSasType);
  272. LogMessage('PMWlxWkstaLockedSAS', 'EndPoint');
  273. end;
  274.  
  275.  
  276.  
  277.  
  278.  
  279. procedure CreatePMProcess;
  280. var
  281. si: TStartupInfo;
  282. pi: TProcessInformation;
  283. ERROR, hFile, Written: DWORD;
  284. // Wnd: HWND;
  285. begin
  286. GetStartUpInfo(si);
  287. si.dwFlags := STARTF_USESHOWWINDOW;
  288. si.wShowWindow := SW_NORMAL;
  289.  
  290. try
  291. // CreateProcessAsUser(phMyToken, nil, PChar('notepad'), nil, nil, FALSE,
  292. // CREATE_NEW_CONSOLE, nil, nil, si, pi);
  293.  
  294. WaitForSingleObject(pi.hProcess, INFINITE);
  295. CloseHandle(pi.hThread);
  296. CloseHandle(pi.hProcess);
  297. except
  298. end;
  299. // Wnd := FindWindow(nil, PChar(PMWindowName));
  300. // SendMessage(Wnd, PM_UNBLOCK_MSG, 0, 0);
  301. end;
  302.  
  303.  
  304. (*
  305. function UpdateRegistry(Delete:Boolean):HRESULT;
  306. var
  307. Key : HKEY;
  308. DLLName: array[0..MAX_PATH] of Char;
  309. const
  310. KeyName = 'SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon';
  311. begin
  312. Result := S_OK;
  313. // if Delete then
  314. // RegDeleteKey(HKEY_LOCAL_MACHINE, KeyName)
  315. // else begin
  316. if (GetModuleFileName(hInstance, DLLName, SizeOf(DLLName)) = 0)
  317. or (RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyName, 0, KEY_ALL_ACCESS, Key) <> ERROR_SUCCESS)
  318. or (RegSetValueEx(Key, GinaRegKey, 0, REG_SZ, @DLLName, lStrLen(DLLName) + 1) <> ERROR_SUCCESS) then
  319. Result := E_UNEXPECTED;
  320. // end;
  321. end;
  322.  
  323. function DllRegisterServer: HRESULT;
  324. begin
  325. Result := UpdateRegistry(False);
  326. end;
  327.  
  328. function DllUnregisterServer: HRESULT;
  329. begin
  330. Result := UpdateRegistry(True);
  331. end;
  332. *)
  333.  
  334.  
  335. exports
  336. // DllRegisterServer,
  337. // DllUnregisterServer,
  338.  
  339. WlxNegotiate,
  340. PMWlxInitialize Name 'WlxInitialize',
  341. PMWlxActivateUserShell Name 'WlxActivateUserShell',
  342. PMWlxDisconnectNotify Name 'WlxDisconnectNotify',
  343. PMWlxDisplayLockedNotice Name 'WlxDisplayLockedNotice',
  344. PMWlxDisplaySASNotice Name 'WlxDisplaySASNotice',
  345. PMWlxDisplayStatusMessage Name 'WlxDisplayStatusMessage',
  346. PMWlxGetConsoleSwitchCredentials Name 'WlxGetConsoleSwitchCredentials',
  347. PMWlxGetStatusMessage Name 'WlxGetStatusMessage',
  348. PMWlxIsLockOk Name 'WlxIsLockOk',
  349. PMWlxIsLogoffOk Name 'WlxIsLogoffOk',
  350. PMWlxLoggedOnSAS Name'WlxLoggedOnSAS',
  351. PMWlxLoggedOutSAS Name 'WlxLoggedOutSAS',
  352. PMWlxLogoff Name 'WlxLogoff',
  353. PMWlxNetworkProviderLoad Name 'WlxNetworkProviderLoad',
  354. PMWlxReconnectNotify Name 'WlxReconnectNotify',
  355. PMWlxRemoveStatusMessage Name 'WlxRemoveStatusMessage',
  356. PMWlxScreenSaverNotify Name 'WlxScreenSaverNotify',
  357. PMWlxShutdown Name 'WlxShutdown',
  358. PMWlxStartApplication Name 'WlxStartApplication',
  359. PMWlxWkstaLockedSAS Name 'WlxWkstaLockedSAS';
  360.  
  361. begin
  362. end.


Kharchenko Maxim Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Kharchenko Maxim (статус: Посетитель)
Вопрос отправлен: 18 февраля 2007, 16:55
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 19 февраля 2007, 10:55; участников в обсуждении: 1.
Kharchenko Maxim

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

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:

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.02 сек.