我自己写了一个gina,替换了登录界面,可以登录到windows
但开始菜单不能正常响应鼠标键盘消息,运行很多程序都要报错,不知在哪儿除了错
WlxActivateUserShell我都是照msdn上的例子写的,也没有报错啊。

解决方案 »

  1.   

    实现代码如下,各位帮帮忙啊!
    int  WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, PVOID *pProfile)
    {

    TOKEN_STATISTICS userStats;
    DWORD cbStats;
    DWORD dwErr;
    WriteLog("WlxLoggedOutSAS");
    if (!phToken)
    return WLX_SAS_ACTION_NONE;

    // Attempt to log on the user: guest, domain: earth
    // with password: secret.
    param.pgContext = pgContext;
    param.bDomainLogon = bDomainLogon;
    INT_PTR nResult = pgContext->pWlxFuncs->WlxDialogBoxParam(pgContext->hWlx,
    pgContext->hDllInstance,
    (LPWSTR)(IDD_DIALOG_LOGON),
    NULL,
    DlgLogonProc,
    (LPARAM)&param);
    dwErr = GetLastError();
    if (nResult != IDOK)
    {
    WriteLog("WlxDialogBoxParam Failed return nResult =%d, ErrCode = %d",nResult,dwErr);
    switch (nResult)
    {
    case -1 :
    return nResult;
    default :
    return WLX_SAS_ACTION_NONE;
    }
    } bDomainLogon = param.bDomainLogon;
    if (bDomainLogon)
    {
    *phToken = pgContext->UserToken;
    // Check the user token. 
    if (!(*phToken)) {
    WriteLog("!(*phToken) return WLX_SAS_ACTION_NONE");
    return WLX_SAS_ACTION_NONE;
    } // Save the user token in the GINA context
    //pgContext->UserToken =*phToken; //  Pass back null profile and options. // Get the authenticationid from the user token.
    if (!GetTokenInformation(*phToken,
    TokenStatistics,
    (PVOID) &userStats,
    sizeof(TOKEN_STATISTICS),
    &cbStats))
    {
    WriteLog("GetTokenInformation Failed return WLX_SAS_ACTION_NONE");
    return WLX_SAS_ACTION_NONE;
    }
    DuplicateHandle(GetCurrentProcess(), *phToken, GetCurrentProcess(), &pgContext->UserToken, 0, FALSE, DUPLICATE_SAME_ACCESS);
    *pAuthenticationId = userStats.AuthenticationId;  *pdwOptions = 0;
    *pProfile =NULL;  // Pass back multiple provider information.
    pNprNotifyInfo->pszUserName = DupString(param.username);
    pNprNotifyInfo->pszDomain = DupString(param.domain);
    pNprNotifyInfo->pszPassword = DupString(param.password);
    pNprNotifyInfo->pszOldPassword = NULL; return WLX_SAS_ACTION_LOGON;
    }
    else
    return theApp.MyWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pNprNotifyInfo, pProfile);
    }BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktopName, PWSTR pszMprLogonScript, PVOID pEnvironment)
    {
        // BOOL        bExec;
        WCHAR       szText[MAX_PATH];
        PWSTR       pszScan;
    //LPVOID      lpEnvironment;
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        PGINA_CONTEXT    pGlobals;
        DWORD       StartCount,dwError;
    HANDLE      hPrimaryToken; WriteLog("WlxActivateUserShell");
    if (!bDomainLogon)
    return theApp.MyWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment);    pGlobals = (PGINA_CONTEXT) pWlxContext;

    if (!DuplicateTokenEx(pgContext->UserToken, 0, NULL, SecurityImpersonation,TokenPrimary, &hPrimaryToken))
    {
    dwError = GetLastError();
    WriteLog("WlxActivateUserShell, ImpersonateLoggedOnUser failed,ErrorCode = %d", dwError); }
    WriteLog("WlxActivateUserShell, pGlobals->UserToken = %d, pgContext->UserToken = %d, hPrimaryToken = %d", 
    pGlobals->UserToken, pgContext->UserToken, hPrimaryToken);
    WriteLog("WlxActivateUserShell, self call for domain logon");

    if (!CreateEnvironmentBlock(&pEnvironment, hPrimaryToken, FALSE))
    {
    dwError = GetLastError();
    WriteLog("WlxActivateUserShell, CreateEnvironmentBlock failed,ErrorCode = %d", dwError);
    };
        GetProfileString(WINLOGON_APP, USERINIT, USERINIT_DEFAULT, szText, MAX_PATH);
    WriteLog("WlxActivateUserShell, szText = %s",szText);
        
    StartCount = 0;    pszScan = wcstok(szText, TEXT(","));
        while (pszScan)
        {
            ZeroMemory(&si, sizeof(si));
            si.cb = sizeof(STARTUPINFO);
            si.lpTitle = pszScan;
            si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
            si.dwFlags = 0;
            si.wShowWindow = SW_SHOW;   // at least let the guy see it
            si.lpReserved2 = NULL;
            si.cbReserved2 = 0;
            si.lpDesktop = pszDesktopName;        //DebugLog((DEB_TRACE, "Starting '%ws' as user\n", pszScan)); if (!ImpersonateLoggedOnUser(hPrimaryToken))
    {
    dwError = GetLastError();
    WriteLog("WlxActivateUserShell, ImpersonateLoggedOnUser failed,ErrorCode = %d", dwError);

    }        if (CreateProcessAsUser(hPrimaryToken,   // Token to run as
                                NULL,                   // App name
                                pszScan,                // Command Line
                                NULL,                   // Process SD
                                NULL,                   // Thread SD
                                FALSE,                  // No inherit
                                CREATE_UNICODE_ENVIRONMENT,
                                pEnvironment,
                                NULL,
                                &si,
                                &pi))
            {
                StartCount++;
                CloseHandle(pi.hProcess);
                CloseHandle(pi.hThread);
            }
    else
    {
    dwError = GetLastError();
    WriteLog("WlxActivateUserShell, CreateProcessAsUser failed,ErrorCode = %d, StartCount = %d", dwError, StartCount);
    }        if (!RevertToSelf())
    {
    dwError = GetLastError();
    WriteLog("WlxActivateUserShell, RevertToSelf failed,ErrorCode = %d", dwError);

    }
            pszScan = wcstok(NULL, TEXT(","));
        }
    if (!DestroyEnvironmentBlock(pEnvironment))
    {
    dwError = GetLastError();
    WriteLog("WlxActivateUserShell, DestroyEnvironmentBlock failed,ErrorCode = %d", dwError);
    }
    WriteLog("WlxActivateUserShell, StartCount = %d",StartCount);
        return(StartCount > 0);}
      

  2.   

    你没有设置该设置的环境变量,需要设置的非常多的HOMEPATH, HOMEDRIVE, USERNAME, LOGONSEERVER, TMP, TEMP, PATH等等一系列另外注册表中也有个别地方需要设置,具体是哪儿我没有法子列全了。如HKEY_CURRENT_USER\Software\Micrsoft\Windows\CurrentVersion\Explorer下面的Logon User NameHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\下面很多很多的。不可能一下子说清楚,所以你最好还是不要完全代替msgina.dll    你应该是写一个gina.dll,大部分功能调用还是使用msgina.dll中的功能,只在需要的地方加上自己的功能。
      

  3.   

    我能登录到windows域中,在windows2000中能显示出桌面,单击开始菜单后,会弹出开始菜单,但鼠标移到开始菜单的某个菜单选项上时,或点击某个菜单选项,菜单都没有响应。在xp下面也能登录到域中,但不能显示桌面,这个问题太奇怪了,请问各位大虾能否提示提示?如果能解决,我可以在开帖子加上几百分。
      

  4.   

    但我调用CreateEnvironmentBlock创建了默认的环境变量了啊,其他还有不少地方需要设置嘛?MSDN里有没有这些方面的参考?
      

  5.   

    msdn中没有这些的
    你还是做HOOK吧,就是我前面说的那些
      

  6.   

    现在windows2000可以了,但xp不行,所有的界面都透明了
    什么也看不见,真是郁闷!