Different registration procedures (with or without approval) for different roles?
So, first of all, I'd like to refer to my other answer here, it's good to take a look

You are going to be needing to separate webforms, each with its own required fields, then after building our webform, in Emails \ Handlers section located at admin/structure/webform/manage/[WebformName]/handlers. We are going to enable our custom webform handler module.


  One thing that you need to make sure is correct, is the structure of
  the module folder, so that webform would read it as a handler, we
  assume the module name here is: webform_handler_user_creation so the
  structure would be something like this:
  webform_handler_user_creation&gt;src&gt;Plugin&gt;WebformHandler&gt;UserCreationHandler.php
  with a webform_handler_user_creation.info.yml file in the root of
  the module directory.


With all that said, here's an example of the module on my github page

So what we need to do first is to make sure we do create our users after saving the webform submission, then load the submission values and use them based on their machine names to fill in our user creation thingy, here's an example code:

&lt;?php
namespace Drupal\webform_handler_user_creation\Plugin\WebformHandler;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\WebformSubmissionInterface;
use Drupal\webform\Entity\WebformSubmission;
/**
 * Webform submission action handler.
 *
 * @WebformHandler(
 *   id = "usercreate",
 *   label = @Translation("User Create"),
 *   category = @Translation("Action"),
 *   description = @Translation("Creates a user after submission"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 *   submission = \Drupal\webform\Plugin\WebformHandlerInterface::SUBMISSION_OPTIONAL,
 * )
 */
class UserCreationHandler extends WebformHandlerBase {
  /**
   * {@inheritdoc}
   */
  public function postSave(WebformSubmissionInterface $webform_submission, $update = TRUE) {
        $user = \Drupal\user\Entity\User::create();
        $language = \Drupal::languageManager()-&gt;getCurrentLanguage()-&gt;getId();
        $user_name = $webform_submission-&gt;getElementData('user_name');
        // Mandatory user creation settings
        $user-&gt;enforceIsNew();
        $user-&gt;setPassword('testPassword');
        $user-&gt;setEmail('test@example.com');
        $user-&gt;setUsername($user_name); // This username must be unique and accept only a-Z,0-9, - _ @ .
        $user-&gt;set("langcode", $language);
        // Optional settings
        $user-&gt;set("init", 'email');
        $user-&gt;set("preferred_langcode", $language);
        $user-&gt;set("preferred_admin_langcode", $language);
        $user-&gt;activate();
        // Add a custom role
        $user-&gt;addRole('CustomRoleName');
        //Save user
        $user-&gt;save();

  }
}


So based on your use case, you can add the user with a custom role with $user-&gt;addRole('CustomRoleName'); and maybe activate it with $user-&gt;activate(); it or a lot other things. You will be needing two different handlers/module with different concept for each role, one for simple member profiles and one for student profiles