第7章WinLogon编程Word格式文档下载.docx
- 文档编号:21527757
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:32
- 大小:44.06KB
第7章WinLogon编程Word格式文档下载.docx
《第7章WinLogon编程Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第7章WinLogon编程Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。
比如说,用户登录到系统时,WinLogon会逐次调用通知包的登录事件处理函数提供事件的信息。
通知包中的事件处理函数的名称由开发者提供,但是它的函数名称必须在注册表中注册,WinLogon会自动检查注册表,得到函数的名称。
用户不必为每一个WinLogon事件实现和注册全部的事件处理。
每一种事件处理函数都必须遵循事件处理函数规范。
这种规范只有一个参数,即WLX_NOTIFICATION_INFO结构类型。
WinLogon将忽略事件处理函数的输出,如果处理一个事件时需要和WinLogon交
互,应该使用Winlgon支持函数。
这些通知事件包括锁定、解锁、注销、登录、启动、关机、启动屏幕保护程序、终止屏幕保护程序、启动外壳程序等。
开发WinLogon通知包可以作为开发Windows服务的替代方案,这种方法的好处在于它可以得到许多用户活动的通知,而且编码要比使用WindowsNT服务简单得多。
创建一个WinLogon通知包需要创建一个动态链接库,为了让WinLogon知道这个动态链接库,可以向注册表中加入适当的注册信息。
在程序实现中启动一个Win32程序,由于进程是由WinLogon启动的,该进程拥有系统账号,因此用户是不能简单地通过终止任务结束这个进程的。
这和WindowsNT服务是一致的。
用户可以在Logoff中通知处理时终止进程。
如果进程需要保持激活,可以使用EndProcessAtWinlogoff函数。
如果希望这个进程为登录用户所有,则应该在启动通知期间而不是logon通知中使用CreateProcessAsUser函数。
实现步骤如下:
(1)创建动态链接库。
//sample.cpp
#include<
windows.h>
Winwlx.h>
PROCESS_INFORMATIONg_pi;
TCHARg_szPath[]=_T("
c:
\somepath\execut.exe\"
arguments\"
"
);
SafeTerminateProcess(HANDLEhProcess,UINTuExitCode);
BOOLWINAPIDllMain(HINSTANCEhInstance,DWORDdwReason,LPVOIDlpReserved)
{switch(dwReason)
{caseDLL_PROCESS_ATTACH:
{DisableThreadLibraryCalls(hInstance);
}break;
}ReturnTRUE;
}
VOIDAPIENTRYStartProcessAtWinLogon(PWLX_NOTIFICATION_INFOpInfo)
{STARTUPINFOsi;
si.cb=sizeof(STARTUPINFO);
si.lpReserved=NULL;
si.lpTitle=NULL;
si.lpDesktop="
WinSta0\\Default"
;
si.dwX=si.dwY=si.dwXSize=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);
VOIDAPIENTRYStopProcessAtWinLogoff(PWLX_NOTIFICATION_INFOpInfo)
{SafeTerminateProcess(g_pi.hProcess,0xDEADBEEF);
VOIDAPIENTRYYOUR_EVENT_HANDLERS(PWLX_NOTIFICATION_INFOpInfo)
{}
…
(2)实现输出函数。
sample.def
EXPORTS
StartProcessAtWinLogon
StopProcessAtWinLogoff
然后在编译选项中添加/def:
sample.def"
(3)把编译好的sample.dll和sample.exp复制到WindowsNT的系统目录。
(4)添加注册表信息。
HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\WinLogon\Notify\NameOfProject
\AsynchronousREG_DWORD0\DllnameREG_SZNameOfDll.dll\ImpersonateREG_DWORD0\LogonREG_SZStartProcessAtWinLogon\LogoffREG_SZStopProcessAtWinLogoff\...REG_SZNameOfFunction
实际上如果用户打开注册表,就会发现在HKEY_LOCAL_MACHINE
\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\WinLogon\Notify键下保存着多个这样的子键。
比如下面是导出的信息之一。
WindowsRegistryEditorVersion5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\WinLogon\Notify]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\WinLogon\Notify\cscdll]
DLLName"
="
cscdll.dll"
Logon"
WinLogonLogonEvent"
Logoff"
WinLogonLogoffEvent"
ScreenSaver"
WinLogonScreenSaverEvent"
Startup"
WinLogonStartupEvent"
Shutdown"
WinLogonShutdownEvent"
StartShell"
WinLogonStartShellEvent"
Impersonate"
=dword:
00000000
Asynchronous"
00000001
创建WinLogon通知包,有很多用途。
如果用户希望在特定条件下完成指定的功能,比如用户希望在系统关闭的时候完成某些功能,这可能是最好的实现方法。
7.3GINA动态链接库编程
实现GINA(GraphicalIdentificationandAuthentication)动态链接库有很多用途,它可实现对用户登录系统的接管,可以用来提供自己的Shell程序,实现自己的程序能够排他运行,比如开机后只能运行一个程序。
实现GINA程序和创建WinLogon通知包一样,也需要编写一个动态链接库,这个动态链接库必须实现GINA规定的有关函数。
另外,为了让WinLogon找到这个动态链接库,还必须在注册表中添加一个项,标识Gina动态链接库的名称,当然GINA必须位于Windows的系统目录。
它要求在注册表下面的键下定义键项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\WinLogon
项的名称为GinaDLL,项值为库的名称,库的文件名应该包含扩展名,但不需要包含路径。
注意:
GINA是在系统启动时被加载的,如果这个程序加载失败,将导致系统崩溃,即便是安全模式也无法实现修复。
为了安全起见,用户最好准备两个操作系统,其中试验的操作系统,最好安装在FAT32分区。
如果启动失败,可以使用Windows系统本身提供的MSGina.dll覆盖原来的GinaDLL文件,文件名不要变化。
正常启动后,检查代码,或者删除指定键。
当没有这个键项时,系统将使用MSGina.dll文件。
GINA动态链接库要求实现下面的输出函数:
●WlxActivateUserShell用于激活用户外壳程序。
●WlxDisplayLockedNotice允许GINADLL显示锁定信息。
●WlxDisplaySASNotice当没有用户登录时WinLogon会调用这个函数。
●WlxDisplayStatusMessage当状态信息显示时WinLogon调用这个函数。
●WlxGetConsoleSwitchCredentialsWinLogon调用这个函数去阅读当前登录用户的证书以便实现目标会话的透明传输。
●WlxGetStatusMessageWinLogon调用这个函数显示当前的状态信息。
●WlxInitialize初始化GINADLL。
●WlxIsLockOk验证当前工作站是否被锁定成功。
●WlxIslogoffOk验证注销是否成功。
●WlxLoggedOnSAS当WinLogon收到一个安全守护序列事件时,会调用这个函数,这时用户已经登录,但是工作站没有被锁定。
●WlxLoggedOutSAS当WinLogon收到一个SAS事件而用户没有登录时会调用这个函数。
●WlxLogoff通知GINADLL,注销操作正在请求。
●WlxNegotiate预示当前版本的WinLogon可否和GINADLL一起使用。
●WlxNetworkProviderLoad当网络提供者被加载收集完有效的认证和识别信息时,WinLogon会回调这个函数。
●WlxRemoveStatusMessageWinLogon调用这个函数通知GINA状态信息正在被停止显示。
●WlxScreensaverNotify允许GINA和屏幕保护程序实现交互操作。
●WlxShutdownWinLogon会在关机前调用这个函数,允许GINA执行任何关机前的操作,比如从阅读器中弹出智能卡。
●WlxStartApplication当系统需要一个应用程序在用户环境中启动时调用这个函数。
●WlxWkstaLockedSAS当工作者被锁定时收到SAS通知时调用这个函数。
其中WlxNegotiate函数是必须实现的函数,这是WinLogon调用GINADLL的第一个函数。
例7-1一个GINA链接库实现的框架。
#ifndefUNICODE
#defineUNICODE
#define_UNICODE
#endif
#include"
stdafx.h"
afxdllx.h>
process.h>
#defineULONG_PTRunsignedlong
Typedefstruct_WLX_CLIENT_CREDENTIALS_INFO
{DWORDdwType;
PWSTRpszUserName;
PWSTRpszDomain;
PWSTRpszPassword;
BOOLfPromptForPassword;
}WLX_CLIENT_CREDENTIALS_INFO_V1_0,*PWLX_CLIENT_CREDENTIALS_INFO_V1_0;
TypedefBOOL(WINAPI*PWLX_CLOSE_USER_DESKTOP)(HANDLEhWlx,PWLX_DESKTOPpDesktop,HANDLEhToken);
TypedefBOOL(WINAPI*PWLX_SET_OPTION)(HANDLEhWlx,DWORDOption,ULONG_PTRValue,ULONG_PTR
*OldValue);
TypedefBOOL(WINAPI*PWLX_GET_OPTION)(HANDLEhWlx,DWORDOption,ULONG_PTR*Value);
TypedefVOID(WINAPI*PWLX_WIN31_MIGRATE)(HANDLEhWlx);
TypedefBOOL(WINAPI*PWLX_QUERY_CLIENT_CREDENTIALS)(PWLX_CLIENT_CREDENTIALS_INFO_V1_0pCred);
TypedefBOOL(WINAPI*PWLX_QUERY_IC_CREDENTIALS)(PWLX_CLIENT_CREDENTIALS_INFO_V1_0pCred);
TypedefBOOL(WINAPI*PWLX_DISCONNECT)();
#defineWLX_DIRECTORY_LENGTH1024
Typedefstruct_WLX_TERMINAL_SERVICES_DATA
{WCHARProfilePath[WLX_DIRECTORY_LENGTH+1];
WCHARHomeDir[WLX_DIRECTORY_LENGTH+1];
WCHARHomeDirDrive[4];
}WLX_TERMINAL_SERVICES_DATA,*PWLX_TERMINAL_SERVICES_DATA;
TypedefDWORD(WINAPI*PWLX_QUERY_TERMINAL_SERVICES_DATA)
(HANDLEhWlx,PWLX_TERMINAL_SERVICES_DATApTSData,WCHAR*UserName,WCHAR*Domain);
Typedefstruct__win32_DISPATCH_VERSION_1_3
{PWLX_USE_CTRL_ALT_DELWlxUseCtrlAltDel;
PWLX_SET_CONTEXT_POINTERWlxSetContextPointer;
PWLX_SAS_NOTIFYWlxSasNotify;
PWLX_SET_TIMEOUTWlxSetTimeout;
PWLX_ASSIGN_SHELL_PROTECTIONWlxAssignShellProtection;
PWLX_MESSAGE_BOXWlxMessageBox;
PWLX_DIALOG_BOXWlxDialogBox;
PWLX_DIALOG_BOX_PARAMWlxDialogBoxParam;
PWLX_DIALOG_BOX_INDIRECTWlxDialogBoxIndirect;
PWLX_DIALOG_BOX_INDIRECT_PARAMWlxDialogBoxIndirectParam;
PWLX_SWITCH_DESKTOP_TO_USERWlxSwitchDesktopToUser;
PWLX_SWITCH_DESKTOP_TO_WINLOGONWlxSwitchDesktopToWinLogon;
PWLX_CHANGE_PASSWORD_NOTIFYWlxChangePasswordNotify;
PWLX_GET_SOURCE_DESKTOPWlxGetSourceDesktop;
PWLX_SET_RETURN_DESKTOPWlxSetReturnDesktop;
PWLX_CREATE_USER_DESKTOPWlxCreateUserDesktop;
PWLX_CHANGE_PASSWORD_NOTIFY_EXWlxChangePasswordNotifyEx;
PWLX_CLOSE_USER_DESKTOPWlxCloseUserDesktop;
PWLX_SET_OPTIONWlxSetOption;
PWLX_GET_OPTIONWlxGetOption;
PWLX_WIN31_MIGRATEWlxWin31Migrate;
PWLX_QUERY_CLIENT_CREDENTIALSWlxQueryClientCredentials;
PWLX_QUERY_IC_CREDENTIALSWlxQueryInetConnectorCredentials;
PWLX_DISCONNECTWlxDisconnect;
PWLX_QUERY_TERMINAL_SERVICES_DATAWlxQueryTerminalServicesData;
}WLX_DISPATCH_VERSION_1_3,*PWLX_DISPATCH_VERSION_1_3;
Typedefstruct
{HANDLEhWlx;
LPWSTRstation;
PWLX_DISPATCH_VERSION_1_3pWlxFuncs;
HANDLEhDllInstance;
HANDLEUserToken;
}GINA_CONTEXT,*PGINA_CONTEXT;
//GINAfunctiondefine
TypedefBOOL(WINAPI*F_WlxNegotiate)(DWORDdwWinLogonVersion,PDWORDpdwDllVersion);
TypedefBOOL(WINAPI*F_WlxInitialize),(LPWSTRlpWinsta,HANDLE
hWlx,PVOIDpvReserved,PVOIDpWinLogonFunctions,PVOID*pWlxContext);
typedefVOID(WINAPI*F_WlxDisplaySASNotice)(PVOIDpWlxContext);
typedefint(WINAPI*F_WlxLoggedOutSAS)(
PVOIDpWlxContext,DWORDdwSasType,PLUIDpAuthenticationId,
PSIDpLogonSid,PDWORDpdwOptions,PHANDLEphToken,
PWLX_MPR_NOTIFY_INFOpNprNotifyInfo,PVOID*pProfile);
TypedefBOOL(WINAPI*F_WlxActivateUserShell)(
PVOIDpWlxContext,PWSTRpszDesktopName,PWSTRpszMprLogonScript,PVOIDpEnvironment);
Typedefint(WINAPI*F_WlxLoggedOnSAS)(PVOIDpWlxContext,DWORDdwSasType,PVOIDpReserved);
TypedefVOID(WINAPI*F_WlxDisplayLockedNotice)(PVOIDpWlxContext);
Typedefint(WINAPI*F_WlxWkstaLockedSAS)(PVOIDpWlxContext,DWORDdwSasType);
TypedefBOOL(WINAPI*F_WlxIsLockOk)(PVOIDpWlxContext);
TypedefBOOL(WINAPI*F_WlxIsLogoffOk)(PVOIDpWlxContext);
TypedefBOOL(WINAPI*F_WlxIsLogoff)(PVOIDpWlxContext);
TypedefVOID(WINAPI*F_WlxShutdown)(PVOIDpWlxContext,DWODShutdownType);
//version1.1
TypedefBOOL(WINAPI*F_WlxScreenSaverNotify)(PVOIDpWlxContext,BOOL*pSecure);
TypedefBOOL(WINAPI*F_WlxStartApplication)(PVOIDpWlxContext,PWSTRpszDesktopName,PVOID
pEnvironment,PWSTRpszCmdLine);
//version1.3
TypedefBOOL(WINAPI*F_WlxNetworkProviderLoad)(PVOIDpWlxContext,PWLX_MPR_NOTIFY_INFOpNprNotifyInfo);
TypedefBOOL(WINAPI*F_WlxDisplayStatusMessage)(PVOIDpWlxContext,HDESKhDesktop,DWORDdwOptions,
PWSTRpTitle,PWSTRpMessage);
TypedefBOOL(WINAPI*F_WlxGetStatusMessage)(PVOIDpWlxContext,
DWORD*pdwOptions,PWSTRpMessage,DWORDdwBufferSize);
TypedefBOOL(WINAPI*F_WlxRemoveStatusMessage)(PVOIDpWlxContext);
//function
F_WlxNegoti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WinLogon 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)