Процедура разблокирования станции.

int WINAPI WlxWkstaLockedSAS( PVOID pWlxContext,DWORD dwSasType )
{
	LPGINA_CONTEXT		lpContext = (LPGINA_CONTEXT)pWlxContext;
	int					nResult = WLX_SAS_ACTION_NONE;
	CCredDlg*			lpDialog;
	int					nRes;
	HANDLE				hToken;
	BOOL				bRet;
	PTOKEN_USER			lpTokenLogon;
	PTOKEN_USER			lpTokenUnlock;
 	LPWSTR				wszUserName = NULL;
	LPWSTR				wszUserPassword = NULL;
	LPWSTR				wszUserDomain = NULL;
	lpDialog = new CCredDlg( lpContext );
	if( lpDialog != NULL )
	{
		nRes = lpDialog->ShowModal();
		if( nRes == WLX_DLG_SAS )
		{
			lpDialog->GetCredentials( wszUserName,wszUserDomain,wszUserPassword );
			wszUserName = DupString( wszUserName );
			wszUserPassword = DupString( wszUserPassword );
			wszUserDomain = DupString( wszUserDomain );
			bRet = ( DoLogon( wszUserName,wszUserDomain,wszUserPassword,&hToken,NULL,Unlock ) 
== STATUS_SUCCESS );
			FreeCredentials( wszUserName,wszUserDomain,wszUserPassword );
			if( bRet )
			{
				if( GetTokenUserInfo( lpContext->hUserToken,lpTokenLogon ) )
				{
					if( GetTokenUserInfo( hToken,lpTokenUnlock ) )
					{
						if( EqualSid( lpTokenLogon->User.Sid,lpTokenUnlock->User.Sid ) )
							nResult = WLX_SAS_ACTION_UNLOCK_WKSTA;
						else
						{
							if( IsMemberOfAdministrators( hToken ) )
							{
								if( ShowMessageW( lpContext,L»Do you wish
                                                                 to logoff?»,L»sGINA»,MB_YESNO ) == IDYES )
									nResult = WLX_SAS_ACTION_FORCE_LOGOFF;

							}
						}
						LocalFree( lpTokenUnlock );
					}
					LocalFree( lpTokenLogon );
				}
				CloseHandle( hToken );
			}
		}
		delete lpDialog;
	}
	return nResult;
}

Поделитесь материалом с коллегами и друзьями