1、比如说,用户登录到系统时,WinLogon会逐次调用通知包的登录事件处理函数提供事件的信息。通知包中的事件处理函数的名称由开发者提供,但是它的函数名称必须在注册表中注册,WinLogon会自动检查注册表,得到函数的名称。用户不必为每一个WinLogon事件实现和注册全部的事件处理。每一种事件处理函数都必须遵循事件处理函数规范。这种规范只有一个参数,即WLX_NOTIFICATION_INFO结构类型。WinLogon将忽略事件处理函数的输出,如果处理一个事件时需要和WinLogon交互,应该使用Winlgon支持函数。这些通知事件包括锁定、解锁、注销、登录、启动、关机、启动屏幕保护程序、终止屏
2、幕保护程序、启动外壳程序等。开发WinLogon通知包可以作为开发Windows服务的替代方案,这种方法的好处在于它可以得到许多用户活动的通知,而且编码要比使用WindowsNT服务简单得多。创建一个WinLogon通知包需要创建一个动态链接库,为了让WinLogon知道这个动态链接库,可以向注册表中加入适当的注册信息。在程序实现中启动一个Win32程序,由于进程是由WinLogon启动的,该进程拥有系统账号,因此用户是不能简单地通过终止任务结束这个进程的。这和WindowsNT服务是一致的。用户可以在Logoff中通知处理时终止进程。如果进程需要保持激活,可以使用EndProcessAtWi
3、nlogoff函数。如果希望这个进程为登录用户所有,则应该在启动通知期间而不是logon通知中使用CreateProcessAsUser函数。实现步骤如下:(1)创建动态链接库。/sample.cpp#includeWinwlx.hPROCESS_INFORMATION g_pi;TCHAR g_szPath=_T(c:somepathexecut.exearguments);SafeTerminateProcess(HANDLE hProcess,UINT uExitCode);BOOL WINAPIDllMain(HINSTANCEhInstance,DWORD dwReason,LPVO
4、ID lpReserved) switch(dwReason)case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hInstance); break; Return TRUE;VOID APIENTRYStartProcessAtWinLogon(PWLX_NOTIFICATION_INFO pInfo)STARTUPINFO si;si.cb=sizeof(STARTUPINFO);si.lpReserved=NULL;si.lpTitle=NULL;si.lpDesktop=WinSta0Default;si.dwX=si.dwY=si.d
5、wXSize=si.dwYSize=0L;si.dwFlags=0;si.wShowWindow=SW_SHOW;si.lpReserved2=NULL;si.cbReserved2=0;CreateProcess(NULL,g_szPath,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&g_pi);VOID APIENTRYStopProcessAtWinLogoff(PWLX_NOTIFICATION_INFOpInfo)SafeTerminateProcess(g_pi.hProcess,0xDEADBEEF);VOID APIENT
6、RYYOUR_EVENT_HANDLERS(PWLX_NOTIFICATION_INFO pInfo) (2)实现输出函数。sample.defEXPORTSStartProcessAtWinLogonStopProcessAtWinLogoff然后在编译选项中添加/def:sample.def(3)把编译好的sample.dll和sample.exp复制到WindowsNT的系统目录。(4)添加注册表信息。HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCurrentVersionWinLogonNotifyNameOfProjectAsynchron
7、ousREG_DWORD0DllnameREG_SZNameOfDll.dllImpersonateREG_DWORD0LogonREG_SZStartProcessAtWinLogonLogoffREG_SZStopProcessAtWinLogoff.REG_SZNameOfFunction实际上如果用户打开注册表,就会发现在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinLogonNotify键下保存着多个这样的子键。比如下面是导出的信息之一。WindowsRegistryEditorVersion5.00HKEY
8、_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinLogonNotifyHKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinLogonNotifycscdllDLLName=cscdll.dllLogonWinLogonLogonEventLogoffWinLogonLogoffEventScreenSaverWinLogonScreenSaverEventStartupWinLogonStartupEventShutdownWinLogonShutdownEv
9、entStartShellWinLogonStartShellEventImpersonate=dword:00000000Asynchronous00000001创建WinLogon通知包,有很多用途。如果用户希望在特定条件下完成指定的功能,比如用户希望在系统关闭的时候完成某些功能,这可能是最好的实现方法。7.3 GINA动态链接库编程实现GINA(GraphicalIdentificationandAuthentication)动态链接库有很多用途,它可实现对用户登录系统的接管,可以用来提供自己的Shell程序,实现自己的程序能够排他运行,比如开机后只能运行一个程序。实现GINA程序和创建
10、WinLogon通知包一样,也需要编写一个动态链接库,这个动态链接库必须实现GINA规定的有关函数。另外,为了让WinLogon找到这个动态链接库,还必须在注册表中添加一个项,标识Gina动态链接库的名称,当然GINA必须位于Windows的系统目录。它要求在注册表下面的键下定义键项:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinLogon 项的名称为GinaDLL,项值为库的名称,库的文件名应该包含扩展名,但不需要包含路径。注意:GINA是在系统启动时被加载的,如果这个程序加载失败,将导致系统崩溃,即便是安全模式也无
11、法实现修复。为了安全起见,用户最好准备两个操作系统,其中试验的操作系统,最好安装在FAT32分区。如果启动失败,可以使用Windows系统本身提供的MSGina.dll覆盖原来的GinaDLL文件,文件名不要变化。正常启动后,检查代码,或者删除指定键。当没有这个键项时,系统将使用MSGina.dll文件。GINA动态链接库要求实现下面的输出函数:WlxActivateUserShell用于激活用户外壳程序。WlxDisplayLockedNotice允许GINADLL显示锁定信息。WlxDisplaySASNotice当没有用户登录时WinLogon会调用这个函数。WlxDisplayStat
12、usMessage当状态信息显示时WinLogon调用这个函数。WlxGetConsoleSwitchCredentialsWinLogon调用这个函数去阅读当前登录用户的证书以便实现目标会话的透明传输。WlxGetStatusMessageWinLogon调用这个函数显示当前的状态信息。WlxInitialize初始化GINADLL。WlxIsLockOk验证当前工作站是否被锁定成功。WlxIslogoffOk验证注销是否成功。WlxLoggedOnSAS当WinLogon收到一个安全守护序列事件时,会调用这个函数,这时用户已经登录,但是工作站没有被锁定。WlxLoggedOutSAS当Wi
13、nLogon收到一个SAS事件而用户没有登录时会调用这个函数。WlxLogoff通知GINADLL,注销操作正在请求。WlxNegotiate预示当前版本的WinLogon可否和GINADLL一起使用。WlxNetworkProviderLoad当网络提供者被加载收集完有效的认证和识别信息时,WinLogon会回调这个函数。WlxRemoveStatusMessageWinLogon调用这个函数通知GINA状态信息正在被停止显示。WlxScreensaverNotify允许GINA和屏幕保护程序实现交互操作。WlxShutdownWinLogon会在关机前调用这个函数,允许GINA执行任何关机
14、前的操作,比如从阅读器中弹出智能卡。WlxStartApplication当系统需要一个应用程序在用户环境中启动时调用这个函数。WlxWkstaLockedSAS当工作者被锁定时收到SAS通知时调用这个函数。其中WlxNegotiate函数是必须实现的函数,这是WinLogon调用GINADLL的第一个函数。例7-1一个GINA链接库实现的框架。#ifndef UNICODE#define UNICODE#define _UNICODE#endif#includestdafx.hafxdllx.hprocess.h#define ULONG_PTR unsigned longTypedef s
15、truc t_WLX_CLIENT_CREDENTIALS_INFO DWORD dwType;PWSTR pszUserName;PWSTR pszDomain;PWSTR pszPassword;BOOL fPromptForPassword;WLX_CLIENT_CREDENTIALS_INFO_V1_0,*PWLX_CLIENT_CREDENTIALS_INFO_V1_0;Typedef BOOL (WINAPI*PWLX_CLOSE_USER_DESKTOP)(HANDLE hWlx,PWLX_DESKTOP pDesktop,HANDLEhToken);Typedef BOOL (
16、WINAPI*PWLX_SET_OPTION)(HANDLE hWlx,DWORD Option,ULONG_PTR Value,ULONG_PTR*OldValue);Typedef BOOL (WINAPI*PWLX_GET_OPTION)(HANDLE hWlx,DWORD Option,ULONG_PTR*Value);Typedef VOID(WINAPI*PWLX_WIN31_MIGRATE)(HANDLE hWlx);Typedef BOOL(WINAPI*PWLX_QUERY_CLIENT_CREDENTIALS)(PWLX_CLIENT_CREDENTIALS_INFO_V1
17、_0pCred);Typedef BOOL(WINAPI*PWLX_QUERY_IC_CREDENTIALS)(PWLX_CLIENT_CREDENTIALS_INFO_V1_0pCred);Typedef BOOL(WINAPI*PWLX_DISCONNECT)();#define WLX_DIRECTORY_LENGTH 1024Typedef struct _WLX_TERMINAL_SERVICES_DATA WCHAR ProfilePathWLX_DIRECTORY_LENGTH+1;WCHAR HomeDirWLX_DIRECTORY_LENGTH+1;WCHAR HomeDir
18、Drive4;WLX_TERMINAL_SERVICES_DATA,*PWLX_TERMINAL_SERVICES_DATA;Typedef DWORD(WINAPI*PWLX_QUERY_TERMINAL_SERVICES_DATA)( HANDLE hWlx, PWLX_TERMINAL_SERVICES_DATApTSData,WCHAR*UserName,WCHAR*Domain);Typedef struct _win32_DISPATCH_VERSION_1_3PWLX_USE_CTRL_ALT_DEL WlxUseCtrlAltDel;PWLX_SET_CONTEXT_POINT
19、ER WlxSetContextPointer;PWLX_SAS_NOTIFY WlxSasNotify;PWLX_SET_TIMEOUT WlxSetTimeout;PWLX_ASSIGN_SHELL_PROTECTION WlxAssignShellProtection;PWLX_MESSAGE_BOX WlxMessageBox;PWLX_DIALOG_BOX WlxDialogBox;PWLX_DIALOG_BOX_PARAM WlxDialogBoxParam;PWLX_DIALOG_BOX_INDIRECT WlxDialogBoxIndirect;PWLX_DIALOG_BOX_
20、INDIRECT_PARAM WlxDialogBoxIndirectParam;PWLX_SWITCH_DESKTOP_TO_USER WlxSwitchDesktopToUser;PWLX_SWITCH_DESKTOP_TO_WINLOGON WlxSwitchDesktopToWinLogon;PWLX_CHANGE_PASSWORD_NOTIFY WlxChangePasswordNotify;PWLX_GET_SOURCE_DESKTOP WlxGetSourceDesktop;PWLX_SET_RETURN_DESKTOP WlxSetReturnDesktop;PWLX_CREA
21、TE_USER_DESKTOP WlxCreateUserDesktop;PWLX_CHANGE_PASSWORD_NOTIFY_EX WlxChangePasswordNotifyEx;PWLX_CLOSE_USER_DESKTOP WlxCloseUserDesktop;PWLX_SET_OPTION WlxSetOption;PWLX_GET_OPTION WlxGetOption;PWLX_WIN31_MIGRATE WlxWin31Migrate;PWLX_QUERY_CLIENT_CREDENTIALS WlxQueryClientCredentials;PWLX_QUERY_IC
22、_CREDENTIALS WlxQueryInetConnectorCredentials;PWLX_DISCONNECT WlxDisconnect;PWLX_QUERY_TERMINAL_SERVICES_DATA WlxQueryTerminalServicesData;WLX_DISPATCH_VERSION_1_3, *P WLX_DISPATCH_VERSION_1_3;Typedef structHANDLE hWlx;LPWSTR station;PWLX_DISPATCH_VERSION_1_3pWlxFunc s;HANDLEhDll Instance;HANDLE Use
23、rToken;GINA_CONTEXT,*PGINA_CONTEXT;/GINAfunctiondefineTypedef BOOL(WINAPI*F_WlxNegotiate)(DWORD dwWinLogonVersion,PDWORD pdwDllVersion);Typedef BOOL(WINAPI*F_WlxInitialize),(LPWSTR lpWinsta,HANDLEhWlx,PVOID pvReserved,PVOID pWinLogonFunctions,PVOID *pWlxContext);typedef VOID(WINAPI*F_WlxDisplaySASNo
24、tice)(PVOIDpWlxContext);typedef int(WINAPI*F_WlxLoggedOutSAS)(PVOID pWlxContext,DWORD dwSasType,PLUID pAuthenticationId,PSID pLogonSid,PDWORD pdwOptions,PHANDLE phToken,PWLX_MPR_NOTIFY_INFO pNprNotifyInfo,PVOID*pProfile);Typedef BOOL(WINAPI*F_WlxActivateUserShell)(PVOID pWlxContext,PWSTR pszDesktopN
25、ame, PWSTR pszMprLogonScript,PVOID pEnvironment);Typedef int(WINAPI*F_WlxLoggedOnSAS)(PVOID pWlxContext,DWORD dwSasType,PVOID pReserved);Typedef VOID(WINAPI*F_WlxDisplayLockedNotice)(PVOID pWlxContext);Typedef int(WINAPI*F_WlxWkstaLockedSAS)(PVOIDpWlxContext, DWORDdwSasType);Typedef BOOL (WINAPI *F_
26、WlxIsLockOk)(PVOID pWlxContext);Typedef BOOL (WINAPI *F_WlxIsLogoffOk)(PVOID pWlxContext);Typedef BOOL (WINAPI *F_WlxIsLogoff)(PVOID pWlxContext);Typedef VOID (WINAPI *F_WlxShutdown)(PVOID pWlxContext,DWOD ShutdownType);/version1.1Typedef BOOL(WINAPI*F_WlxScreenSaverNotify)(PVOID pWlxContext,BOOL*pS
27、ecure);Typedef BOOL(WINAPI*F_WlxStartApplication)(PVOID pWlxContext,PWSTR pszDesktopName,PVOIDpEnvironment, PWSTR pszCmdLine);/version1.3Typedef BOOL(WINAPI*F_WlxNetworkProviderLoad)(PVOID pWlxContext,PWLX_MPR_NOTIFY_INFO pNprNotifyInfo);Typedef BOOL(WINAPI*F_WlxDisplayStatusMessage)(PVOID pWlxContext,HDESKhDesktop,DWORD dwOptions,PWSTR pTitle,PWSTR pMessage);Typedef BOOL(WINAPI*F_WlxGetStatusMessage)(PVOID pWlxContext,DWORD*pdwOptions,PWSTR pMessage,DWORD dwBufferSize);Typedef BOOL(WINAPI*F_WlxRemoveStatusMessage)(PVOID pWlxContext);/functionF_WlxNegoti
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1