Как подключиться к Active Directory с помощью LDAP из C ?

#c #active-directory #ldap #windows-server-2019

#c #active-directory #ldap #windows-server-2019

Вопрос:

Я настроил Active Directory на Windows Server 2019. Я пытаюсь использовать LDAP для подключения к Active Directory из клиента Windows. Я использовал этот код с небольшими изменениями из документов Microsoft:

 //  Verify that the user passed a hostname.
if (hostname!=NULL)
{
    //  Convert argv[] to a wchar_t*
    size_t origsize = strlen(argv[1])   1;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(convertedChars, wcstring, origsize, argv[1], _TRUNCATE);
    wcscat_s(wcstring, L" (wchar_t *)");
    hostName = wcstring;
}
else
{
    hostName = NULL;
}

//  Initialize a session. LDAP_PORT is the default port, 389.
pLdapConnection = ldap_init(hostName, LDAP_PORT);

if (pLdapConnection == NULL)
{
    //  Set the HRESULT based on the Windows error code.
    char hr = HRESULT_FROM_WIN32(GetLastError());
    printf( "ldap_init failed with 0x%x.n",hr);
    goto error_exit;
}
else
    printf("ldap_init succeeded n");

//  Set the version to 3.0 (default is 2.0).
returnCode = ldap_set_option(pLdapConnection,
                             LDAP_OPT_PROTOCOL_VERSION,
                             (void*)amp;amp;version);
if(returnCode == LDAP_SUCCESS)
    printf("ldap_set_option succeeded - version set to 3n");
else
{
    printf("SetOption Error:%0Xn", returnCode);
    goto error_exit;
}

// Connect to the server.
connectSuccess = ldap_connect(pLdapConnection, NULL);

if(connectSuccess == LDAP_SUCCESS)
    printf("ldap_connect succeeded n");
else
{
    printf("ldap_connect failed with 0x%x.n",connectSuccess);
    goto error_exit;
}

//  Bind with current credentials (login credentials). Be
//  aware that the password itself is never sent over the 
//  network, and encryption is not used.
printf("Binding ...n");

returnCode = ldap_bind_s(pLdapConnection, NULL, NULL,
                         LDAP_AUTH_NEGOTIATE);
if (returnCode == LDAP_SUCCESS)
    printf("The bind was successful");
else
    goto error_exit;

//  Normal cleanup and exit.
ldap_unbind(pLdapConnection);
return 0;

//  On error cleanup and exit.
error_exit:
    ldap_unbind(pLdapConnection);
    return -1;
  

Я новичок в Active Directory и никогда раньше не работал с серверами Windows.

  1. Как мне подключиться к Active Directory в этом запросе LDAP? Должен ли я передавать имя сервера или доменное имя Active Directory в имени хоста в коде?

  2. Также я получаю ошибку «Имя сервера не разрешено». Должен ли я использовать службу dns в Windows Server или моей локальной локальной сети, чтобы избавиться от ошибки?

Вот ссылка на код из документов Microsoft:
здесь

Комментарии:

1. Пожалуйста, поделитесь ссылкой на документы Microsoft, откуда был скопирован код. Поскольку текущий код неполон, ответить на ваши запросы невозможно!

2. @Am_I_helpful Я разместил ссылку

Ответ №1:

  1. Как мне подключиться к Active Directory в этом запросе LDAP? Должен ли я передавать имя сервера или доменное имя Active Directory в имени хоста в коде?

Согласно образцу кода, которым вы поделились в вопросе, в документах четко указано, что код может быть выполнен: (i) либо путем передачи имени сервера в качестве параметра командной строки, (ii) либо в случае отсутствия параметра выполняется попытка привязки без сервера.

Из ДОКУМЕНТОВ Microsoft о бессерверной привязке и RootDSE:

Если возможно, не вводите жестко имя сервера. Кроме того, в большинстве случаев привязка не должна быть излишне привязана к одному серверу. Доменные службы Active Directory поддерживают бессерверную привязку, что означает, что Active Directory может быть привязана к домену по умолчанию без указания имени контроллера домена. Для обычных приложений это обычно домен вошедшего в систему пользователя. Для приложений-служб это либо домен учетной записи входа в службу, либо домен клиента, за которого выдает себя служба.

Поскольку вы новичок в Active Directory, я бы посоветовал вам попробовать запустить код, передав свое доменное имя AD (например, domain.local, corp.org и т.д.).

  1. Также я получаю ошибку «Имя сервера не разрешено». Должен ли я использовать службу dns в Windows Server или моей локальной локальной сети, чтобы избавиться от ошибки?

Было бы сложно ответить на этот вопрос без дополнительной информации. По умолчанию разрешение имен выполняется сначала файлом etc / hosts или же DNS, если разрешение невозможно с помощью первого! Вы должны в основном полагаться на последнее, то есть на правильную настройку DNS.

Вам необходимо выяснить, почему не удается выполнить поиск по указанному вами имени хоста. Вы можете выполнить простой тест, проверив вывод команды nslookup yourADServerHostName или nslookup yourADServerFQDN в командной строке, и проверить, будет ли он разрешен на предполагаемый IP-адрес.


ПРИМЕЧАНИЕ: Пожалуйста, убедитесь, что вы используете правильную запись DNS-сервера в настройках сети системы, в которой вы выполняете код.

Комментарии:

1. Привет, мне было интересно, можно ли получить доступ к active Directory с помощью HTTP-запросов LDAP. Возможно ли получить доступ к active Directory через REST API? я попытался выполнить поиск, но не нашел конкретных объяснений и примеров кода для этого. Есть идеи?

2. @sham — Active Directory использует LDAP, и существует несколько API для доступа к базовым службам каталогов на разных языках программирования. Вы можете сами создать REST API, моделирующий то же самое, что вам нужно!