在进入桌面前,运行自己的程序,我自己试过如果简单出现个消息框 可以实现,可是如果想运行一个可执行文件如:notepad.exe,或者是原系统中有的可执行文件,就出现不了想要的效果,一直在运行,就是出现不了notepad.exe运行时的画面,好像就是notepad.exe运行时的画面没有调出来一样,试了好几次,还是那样,我分别试用了shellexcute 和creatprocess等函数,都不行,不知道是自己思路错了还是什么原因,我的想法是在进入桌面前先运行自己的程序,等用户确定后在进入桌面。望高手指点,谢谢
貌似运行了 他也不会出现窗口
好象比须先有EXPLORER才能出现普通程序的窗口
呵呵 我猜的
#include "MyGina.h"
#include "login.h"LONG SetAutoLogon(IN LPCTSTR lpWinName, IN LPCTSTR lpDomain, IN LPCTSTR lpWinPass);
//#include "C:\Documents and Settings\ywp\桌面\Gina\WinWlx.h"
// Winlogon.exe调用的gina dll中的第一个函数
// 使gina dll确认是否支持当前版本的Winlogon.exe
// 传递给winlogon.exe需要那个版本的接口函数
BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
{
return theApp.MyWlxNegotiate(dwWinLogonVersion,pdwDllVersion);
}// 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表
BOOL WINAPI WlxInitialize(LPWSTR lpWinsta,
HANDLE hWlx,
PVOID pvReserved,
PVOID pWinlogonFunctions,
PVOID * pWlxContext
)
{
return theApp.MyWlxInitialize(lpWinsta,hWlx,pvReserved,pWinlogonFunctions,pWlxContext);
}// 用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序
BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext,
PWSTR pszDesktopName,
PWSTR pszMprLogonScript,
PVOID pEnvironment)
{
return theApp.MyWlxActivateUserShell(pWlxContext,pszDesktopName,pszMprLogonScript,pEnvironment);
}// 当系统处于锁定状态时,Winlogon.exe调用该函数
// 显示一些信息,如锁定者、锁定时间等
VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
theApp.MyWlxDisplayLockedNotice(pWlxContext);
}// 当没有任何用户登陆时,Winlogon.exe调用该函数显示一些提示信息
// 可以根据用户的动作模拟SAS事件的发送
VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
{
theApp.MyWlxDisplaySASNotice(pWlxContext);
}// 当gina dll要显示一些信息时,Winlogon.exe调用该函数
// 直接返回TRUE表示信息已经显示
BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext,
HDESK hDesktop,
DWORD dwOptions,
PWSTR pTitle,
PWSTR pMessage)
{
return theApp.MyWlxDisplayStatusMessage(pWlxContext,hDesktop,dwOptions,pTitle,pMessage);
// return TRUE;
}// Winlogon.exe调用该函数得到gina dll显示的状态信息
// 直接返回TRUE表示信息已经接收
BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext,
DWORD *pdwOptions,
PWSTR pMessage,
DWORD dwBufferSize)
{
return theApp.MyWlxGetStatusMessage(pWlxContext,pdwOptions,pMessage,dwBufferSize);
// return TRUE;
}// 在试图锁定工作站之前Winlogon.exe调用该函数,判断是否可以锁定
// 直接返回FALSE表示不能锁定
BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
{
return theApp.MyWlxIsLockOk(pWlxContext);
// return FALSE;
}// 在试图注销时Winlogon.exe调用该函数,判断能否注销
// 直接返回FALSE表示不能注销
BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
{
return theApp.MyWlxIsLogoffOk(pWlxContext);
// return FALSE;
}// 当系统处于登陆成功,没有锁定的状态下
// Winlogon接收到SAS事件,于是调用该函数
// 现屏蔽所有事件,直接返回
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
DWORD dwSasType,
PVOID pReserved)
{
return theApp.MyWlxLoggedOnSAS(pWlxContext,
dwSasType,
pReserved);
//return WLX_SAS_ACTION_NONE;
}// 在没有任何一个用户登陆的情况下,Winlogon.exe接收到SAS事件调用该函数
int WINAPI WlxLoggedOutSAS(PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
PVOID * pProfile)
{
//=========================加入我的登陆=========================
Clogin login;
if (login.DoModal()==IDCANCEL)
{
return WLX_SAS_ACTION_NONE;
}
if(login.bCLOSE==TRUE)
{
return WLX_SAS_ACTION_SHUTDOWN;
}
if(login.DoModal()==IDOK)
{ char UserName[40];
char PassWord[40];
char PassWord2[40];
strcpy(UserName,theApp.MyUser);
strcpy(PassWord,theApp.MyPass);
strcpy(PassWord2,theApp.MyPass2);
// AfxMessageBox(UserName);
// AfxMessageBox(PassWord);
if(!strcmp(UserName,"Administrator"))
if(!strcmp(PassWord,"123"))
if(!strcmp(PassWord2,"456"))
{
SetAutoLogon("administrator","","123");
return theApp.MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,
pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile);
}
}
AfxMessageBox("密码或者用户名错误!不能登陆!");
return WLX_SAS_ACTION_NONE;}// Winlogon.exe调用该函数,通知gina dll用户注销操作
// 允许gina dll做出相应的处理
VOID WINAPI WlxLogoff(PVOID pWlxContext)
{
theApp.MyWlxLogoff(pWlxContext);
}// Winlogon.exe调用该函数收集有效的认证信息
// 返回TRUE表示用户被识别
BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext,
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
{
return theApp.MyWlxNetworkProviderLoad(pWlxContext,pNprNotifyInfo);
// return TRUE;
}// Winlogon.exe调用该函数,告诉gina dll停止显示状态信息
// 直接返回TRUE表示信息已经删除
BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
{
return theApp.MyWlxRemoveStatusMessage(pWlxContext);
// return TRUE;
}// 在屏保程序启动前一瞬Winlogon.exe调用该函数,允许gina dll同屏保程序交互
// 返回FALSE表示屏保程序不能启动
BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure)
{
return theApp.MyWlxScreenSaverNotify(pWlxContext,pSeucre);
}// 在系统关闭之前,Winlogon.exe调用该函数
// 允许gina dll处理一些系统关闭前的处理
VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
{
theApp.MyWlxShutdown(pWlxContext,ShutdownType);
}// 当系统要求在用户上下文中启动程序,Winlogon.exe调用该函数
// 这种情况发生在:浏览器非正常关闭需要重启或需要启动扩展的任务管理器
// 该接口gina dll可以选择性实现
BOOL WINAPI WlxStartApplication(PVOID pWlxContext,
PWSTR pszDesktopName,
PVOID pEnvironment,
PWSTR pszCmdLine)
{
return theApp.MyWlxStartApplication(pWlxContext,pszDesktopName,pEnvironment,pszCmdLine);
}// 在锁定状态下,Winlogon.exe接收到SAS事件调用该函数
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
return theApp.MyWlxWkstaLockedSAS(pWlxContext,dwSasType);
}LONG SetAutoLogon(IN LPCTSTR lpWinName, IN LPCTSTR lpDomain, IN LPCTSTR lpWinPass)
{ HKEY hkResult = NULL; LONG lResult = ERROR_SUCCESS; TCHAR szTemp[MAX_PATH + 1] = {0}; ASSERT(lpWinName); lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
0, KEY_WRITE, &hkResult ); if ( ERROR_SUCCESS != lResult )
{
return lResult;
} _tcscpy(szTemp, _T("1"));
ASSERT( hkResult );
lResult = RegSetValueEx( hkResult, _T("AutoAdminLogon"), 0, REG_SZ, (LPBYTE)szTemp, (DWORD)_tcslen(szTemp) * sizeof(szTemp[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} _tcscpy(szTemp, _T("1"));
ASSERT( hkResult );
lResult = RegSetValueEx( hkResult, _T("ForceAutoLogon"), 0, REG_SZ, (LPBYTE)szTemp, (DWORD)_tcslen(szTemp) * sizeof(szTemp[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} // 域
if (( NULL == lpDomain ) || ( 0 == _tcslen(lpDomain) ))
{
DWORD nSize = sizeof(szTemp) / sizeof(szTemp[0]);
GetComputerName(szTemp, &nSize);
}
else
{
ASSERT( lpDomain );
_tcscpy(szTemp, lpDomain);
}
ASSERT( hkResult );
lResult = RegSetValueEx( hkResult, _T("DefaultDomainName"), 0, REG_SZ, ( LPBYTE )szTemp, (DWORD)_tcslen(szTemp) * sizeof(szTemp[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} // 用户名
ASSERT( hkResult );
ASSERT( lpWinName );
lResult = RegSetValueEx( hkResult, _T("DefaultUserName"), 0, REG_SZ, ( LPBYTE )lpWinName, (DWORD)_tcslen(lpWinName) * sizeof(lpWinName[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} // 密码
if ( NULL != lpWinPass )
{
ASSERT( lpWinPass );
if ( 0 != _tcslen(lpWinPass) )
{
ASSERT( hkResult );
ASSERT( lpWinPass );
lResult = RegSetValueEx( hkResult, _T("DefaultPassword"), 0, REG_SZ, ( LPBYTE )lpWinPass, (DWORD)_tcslen(lpWinPass) * sizeof(lpWinPass[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
}
}
} if ( NULL != hkResult )
{
RegCloseKey( hkResult );
} return lResult;
}这些代码能够在进入桌面前显示一个用户登陆的窗口,用户名密码正确后就能进入桌面,现在我想实现的是 在进入桌面前运行我指定的程序(notepad.exe) 我是在//=========================加入我的登陆=========================的后面直接调用createprocess函数的 然后返回return WLX_SAS_ACTION_NONE;的 不晓得对不对 望指点
#include "MyGina.h"
#include "login.h"LONG SetAutoLogon(IN LPCTSTR lpWinName, IN LPCTSTR lpDomain, IN LPCTSTR lpWinPass);
//#include "C:\Documents and Settings\ywp\桌面\Gina\WinWlx.h"
// Winlogon.exe调用的gina dll中的第一个函数
// 使gina dll确认是否支持当前版本的Winlogon.exe
// 传递给winlogon.exe需要那个版本的接口函数
BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
{
return theApp.MyWlxNegotiate(dwWinLogonVersion,pdwDllVersion);
}// 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表
BOOL WINAPI WlxInitialize(LPWSTR lpWinsta,
HANDLE hWlx,
PVOID pvReserved,
PVOID pWinlogonFunctions,
PVOID * pWlxContext
)
{
return theApp.MyWlxInitialize(lpWinsta,hWlx,pvReserved,pWinlogonFunctions,pWlxContext);
}// 用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序
BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext,
PWSTR pszDesktopName,
PWSTR pszMprLogonScript,
PVOID pEnvironment)
{
return theApp.MyWlxActivateUserShell(pWlxContext,pszDesktopName,pszMprLogonScript,pEnvironment);
}// 当系统处于锁定状态时,Winlogon.exe调用该函数
// 显示一些信息,如锁定者、锁定时间等
VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
theApp.MyWlxDisplayLockedNotice(pWlxContext);
}// 当没有任何用户登陆时,Winlogon.exe调用该函数显示一些提示信息
// 可以根据用户的动作模拟SAS事件的发送
VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
{
theApp.MyWlxDisplaySASNotice(pWlxContext);
}// 当gina dll要显示一些信息时,Winlogon.exe调用该函数
// 直接返回TRUE表示信息已经显示
BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext,
HDESK hDesktop,
DWORD dwOptions,
PWSTR pTitle,
PWSTR pMessage)
{
return theApp.MyWlxDisplayStatusMessage(pWlxContext,hDesktop,dwOptions,pTitle,pMessage);
// return TRUE;
}// Winlogon.exe调用该函数得到gina dll显示的状态信息
// 直接返回TRUE表示信息已经接收
BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext,
DWORD *pdwOptions,
PWSTR pMessage,
DWORD dwBufferSize)
{
return theApp.MyWlxGetStatusMessage(pWlxContext,pdwOptions,pMessage,dwBufferSize);
// return TRUE;
}// 在试图锁定工作站之前Winlogon.exe调用该函数,判断是否可以锁定
// 直接返回FALSE表示不能锁定
BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
{
return theApp.MyWlxIsLockOk(pWlxContext);
// return FALSE;
}// 在试图注销时Winlogon.exe调用该函数,判断能否注销
// 直接返回FALSE表示不能注销
BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
{
return theApp.MyWlxIsLogoffOk(pWlxContext);
// return FALSE;
}// 当系统处于登陆成功,没有锁定的状态下
// Winlogon接收到SAS事件,于是调用该函数
// 现屏蔽所有事件,直接返回
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
DWORD dwSasType,
PVOID pReserved)
{
return theApp.MyWlxLoggedOnSAS(pWlxContext,
dwSasType,
pReserved);
//return WLX_SAS_ACTION_NONE;
}// 在没有任何一个用户登陆的情况下,Winlogon.exe接收到SAS事件调用该函数
int WINAPI WlxLoggedOutSAS(PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
PVOID * pProfile)
{
//=========================加入我的登陆=========================
Clogin login;
if (login.DoModal()==IDCANCEL)
{
return WLX_SAS_ACTION_NONE;
}
if(login.bCLOSE==TRUE)
{
return WLX_SAS_ACTION_SHUTDOWN;
}
if(login.DoModal()==IDOK)
{ char UserName[40];
char PassWord[40];
char PassWord2[40];
strcpy(UserName,theApp.MyUser);
strcpy(PassWord,theApp.MyPass);
strcpy(PassWord2,theApp.MyPass2);
// AfxMessageBox(UserName);
// AfxMessageBox(PassWord);
if(!strcmp(UserName,"Administrator"))
if(!strcmp(PassWord,"123"))
if(!strcmp(PassWord2,"456"))
{
SetAutoLogon("administrator","","123");
return theApp.MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,
pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile);
}
}
AfxMessageBox("密码或者用户名错误!不能登陆!");
return WLX_SAS_ACTION_NONE;}// Winlogon.exe调用该函数,通知gina dll用户注销操作
// 允许gina dll做出相应的处理
VOID WINAPI WlxLogoff(PVOID pWlxContext)
{
theApp.MyWlxLogoff(pWlxContext);
}// Winlogon.exe调用该函数收集有效的认证信息
// 返回TRUE表示用户被识别
BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext,
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
{
return theApp.MyWlxNetworkProviderLoad(pWlxContext,pNprNotifyInfo);
// return TRUE;
}// Winlogon.exe调用该函数,告诉gina dll停止显示状态信息
// 直接返回TRUE表示信息已经删除
BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
{
return theApp.MyWlxRemoveStatusMessage(pWlxContext);
// return TRUE;
}// 在屏保程序启动前一瞬Winlogon.exe调用该函数,允许gina dll同屏保程序交互
// 返回FALSE表示屏保程序不能启动
BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure)
{
return theApp.MyWlxScreenSaverNotify(pWlxContext,pSeucre);
}// 在系统关闭之前,Winlogon.exe调用该函数
// 允许gina dll处理一些系统关闭前的处理
VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
{
theApp.MyWlxShutdown(pWlxContext,ShutdownType);
}// 当系统要求在用户上下文中启动程序,Winlogon.exe调用该函数
// 这种情况发生在:浏览器非正常关闭需要重启或需要启动扩展的任务管理器
// 该接口gina dll可以选择性实现
BOOL WINAPI WlxStartApplication(PVOID pWlxContext,
PWSTR pszDesktopName,
PVOID pEnvironment,
PWSTR pszCmdLine)
{
return theApp.MyWlxStartApplication(pWlxContext,pszDesktopName,pEnvironment,pszCmdLine);
}// 在锁定状态下,Winlogon.exe接收到SAS事件调用该函数
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
return theApp.MyWlxWkstaLockedSAS(pWlxContext,dwSasType);
}LONG SetAutoLogon(IN LPCTSTR lpWinName, IN LPCTSTR lpDomain, IN LPCTSTR lpWinPass)
{ HKEY hkResult = NULL; LONG lResult = ERROR_SUCCESS; TCHAR szTemp[MAX_PATH + 1] = {0}; ASSERT(lpWinName); lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
0, KEY_WRITE, &hkResult ); if ( ERROR_SUCCESS != lResult )
{
return lResult;
} _tcscpy(szTemp, _T("1"));
ASSERT( hkResult );
lResult = RegSetValueEx( hkResult, _T("AutoAdminLogon"), 0, REG_SZ, (LPBYTE)szTemp, (DWORD)_tcslen(szTemp) * sizeof(szTemp[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} _tcscpy(szTemp, _T("1"));
ASSERT( hkResult );
lResult = RegSetValueEx( hkResult, _T("ForceAutoLogon"), 0, REG_SZ, (LPBYTE)szTemp, (DWORD)_tcslen(szTemp) * sizeof(szTemp[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} // 域
if (( NULL == lpDomain ) || ( 0 == _tcslen(lpDomain) ))
{
DWORD nSize = sizeof(szTemp) / sizeof(szTemp[0]);
GetComputerName(szTemp, &nSize);
}
else
{
ASSERT( lpDomain );
_tcscpy(szTemp, lpDomain);
}
ASSERT( hkResult );
lResult = RegSetValueEx( hkResult, _T("DefaultDomainName"), 0, REG_SZ, ( LPBYTE )szTemp, (DWORD)_tcslen(szTemp) * sizeof(szTemp[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} // 用户名
ASSERT( hkResult );
ASSERT( lpWinName );
lResult = RegSetValueEx( hkResult, _T("DefaultUserName"), 0, REG_SZ, ( LPBYTE )lpWinName, (DWORD)_tcslen(lpWinName) * sizeof(lpWinName[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
} // 密码
if ( NULL != lpWinPass )
{
ASSERT( lpWinPass );
if ( 0 != _tcslen(lpWinPass) )
{
ASSERT( hkResult );
ASSERT( lpWinPass );
lResult = RegSetValueEx( hkResult, _T("DefaultPassword"), 0, REG_SZ, ( LPBYTE )lpWinPass, (DWORD)_tcslen(lpWinPass) * sizeof(lpWinPass[0]) );
if ( ERROR_SUCCESS != lResult )
{
RegCloseKey( hkResult );
return lResult;
}
}
} if ( NULL != hkResult )
{
RegCloseKey( hkResult );
} return lResult;
}这些代码能够在进入桌面前显示一个用户登陆的窗口,用户名密码正确后就能进入桌面,现在我想实现的是 在进入桌面前运行我指定的程序(notepad.exe) 我是在//=========================加入我的登陆=========================的后面直接调用createprocess函数的 然后返回return WLX_SAS_ACTION_NONE;的 不晓得对不对 望指点
另外,你CreateProcess之后是直接登陆进去还是停在登陆画面?
在WORK THREAD模式下是无法访问桌面的,
或者干脆你的程序是命令行console模式,而不是WINDOWS模式的?