Проблема с удаленным подключением ADsOpenObject () и поставщиком WinNT - PullRequest
0 голосов
/ 21 мая 2019

У меня проблема с получением объекта IADsContainer из ADsOpenObject () с помощью поставщика WinNT из службы на удаленном компьютере.

Я смог заставить работать код в следующих сценариях, кроме номера 4

  1. Мое приложение развернуто на той же машине, к которой оно подключается (localhost).
  2. Мое приложение развернуто как локальная служба на том же компьютере, к которому оно подключается (localhost).
  3. Мое приложение развернуто на удаленной машине, и оно подключается с помощью IP-адреса.
  4. Мое приложение развернуто на удаленной машине в качестве локальной службы и подключается с помощью IP-адреса.
#include <iostream>

#include <Adshlp.h>
#include <comdef.h>

IADsContainer* container = nullptr;
HRESULT hres = ADsOpenObject( L"WinNT://192.168.1.30", L"Administrator", L"someAdminPass", ADS_SECURE_AUTHENTICATION | ADS_READONLY_SERVER, IID_IADsContainer, (void**)&container );

if( SUCCEEDED(hres) )
{
    // do stuff with the container object
}
else
{
    _com_error err( hres );
    LPCTSTR errMsg = err.ErrorMessage();
    std::wcout << errMsg;
}

Я ожидаю, что hres будет S_OK и действительный указатель 'контейнера', но я получаю только E_FAIL со строкой ошибки "Unspecified error"

1 Ответ

0 голосов
/ 24 мая 2019

Проблема решена благодаря руководствам в комментариях от @ DrakeWu-MSFT!

Мне просто нужно было указать имя пользователя FQDN. Если домен вашего компьютера - «DOMAIN.COM», то строка имени пользователя должна быть «UserName@DOMAIN.com». Это решило проблему для меня. Также большое «спасибо» MS за такое описательное сообщение об ошибке ...:)

Основная строка кода теперь выглядит так:

HRESULT hres = ADsOpenObject( L"WinNT://192.168.1.30", L"Administrator@MYDOMAIN.COM", L"someAdminPass", ADS_SECURE_AUTHENTICATION | ADS_READONLY_SERVER, IID_IADsContainer, (void**)&container );

P.S. Помните, что существуют другие функции WinAPI, которым не нравится имя пользователя FQDN.

...