def create(cls, name, address, base_dn, bind_user_id=None, bind_password=None,
        port=389, protocol='ldap', tls_profile=None, tls_identity=None,
        domain_controller=None, supported_method=None, timeout=10, max_search_result=0,
        page_size=0, internet_auth_service_enabled=False, **kwargs):
        """
        Create an AD server element using basic settings. You can also provide additional
        kwargs documented in the class description::
        
            ActiveDirectoryServer.create(name='somedirectory',
                address='10.10.10.10',
                base_dn='dc=domain,dc=net',
                bind_user_id='cn=admin,cn=users,dc=domain,dc=net',
                bind_password='somecrazypassword')
        
        Configure NPS along with Active Directory::
        
            ActiveDirectoryServer.create(name='somedirectory5',
                address='10.10.10.10',
                base_dn='dc=lepages,dc=net',
                internet_auth_service_enabled=True,
                retries=3,
                auth_ipaddress='10.10.10.15',
                auth_port=1900,
                shared_secret='123456')
                
        :param str name: name of AD element for display
        :param str address: address of AD server
        :param str base_dn: base DN for which to retrieve users, format is 'dc=domain,dc=com'
        :param str bind_user_id: bind user ID credentials, fully qualified. Format is
            'cn=admin,cn=users,dc=domain,dc=com'. If not provided, anonymous bind is used
        :param str bind_password: bind password, required if bind_user_id set
        :param int port: LDAP bind port, (default: 389)
        :param str protocol: Which LDAP protocol to use, options 'ldap/ldaps/ldap_tls'. If
            ldaps or ldap_tls is used, you must provide a tls_profile element (default: ldap)
        :param str,TLSProfile tls_profile by element of str href. Used when protocol is set
            to ldaps or ldap_tls
        :param str,TLSIdentity tls_identity: check server identity when establishing TLS connection
        :param list(DomainController) domain_controller: list of domain controller objects to
            add an additional domain controllers for AD communication
        :param list(AuthenticationMethod) supported_method: authentication services allowed
            for this resource
        :param int timeout: The time (in seconds) that components wait for the server to reply
        :param int max_search_result: The maximum number of LDAP entries that are returned in
            an LDAP response (default: 0 for no limit)
        :param int page_size: The maximum number of LDAP entries that are returned on each page
            of the LDAP response. (default: 0 for no limit)
        :param bool internet_auth_service_enabled: whether to attach an NPS service to this
            AD controller (default: False). If setting to true, provide kwargs values for
            auth_ipaddress, auth_port and shared_secret
        :raises CreateElementFailed: failed creating element
        :rtype: ActiveDirectoryServer
        """
        json={'name': name, 'address': address, 'base_dn': base_dn,
              'bind_user_id': bind_user_id, 'bind_password': bind_password,
              'port': port, 'protocol': protocol, 'timeout': timeout,
              'domain_controller': domain_controller or [],
              'max_search_result': max_search_result, 'page_size': page_size,
              'internet_auth_service_enabled': internet_auth_service_enabled,
              'supported_method': element_resolver(supported_method) or []}
        
        for obj_class in ('group_object_class', 'user_object_class'):
            json[obj_class] = kwargs.pop(obj_class, [])
        
        if protocol in ('ldaps', 'ldap_tls'):
            if not tls_profile:
                raise CreateElementFailed('You must provide a TLS Profile when TLS '
                    'connections are configured to the AD controller.')
            json.update(tls_profile_ref=element_resolver(tls_profile),
                        tls_identity=tls_identity)
        
        if internet_auth_service_enabled:
            ias = {'auth_port': kwargs.pop('auth_port', 1812),
                   'auth_ipaddress': kwargs.pop('auth_ipaddress', ''),
                   'shared_secret': kwargs.pop('shared_secret'),
                   'retries': kwargs.pop('retries', 2)}
            json.update(ias)
        
        json.update(kwargs)
        return ElementCreator(cls, json)