Невозможно использовать IIS ADSI Provider после установки IIS, если ADsOpenObject был вызван перед установкой - PullRequest
1 голос
/ 04 января 2010

Мое приложение .Net активно использует Active Directory и устанавливает IIS, если оно отсутствует. Если IIS не был установлен при запуске приложения и были вызваны какие-либо методы, связанные с Active Directory, то поставщик IIS ADSI по-прежнему недоступен после установки IIS (после перезапуска приложения он становится доступным). К сожалению, я не могу изменить последовательность операций, поэтому должно быть « использовать AD -> установить IIS -> использовать поставщика IIS ADSI -> использовать AD »

Мой код для воспроизведения (не настоящий):

        using (Domain domain = Domain.GetCurrentDomain())
        {
        }
        // IIS install here
        using (DirectoryEntry entry = new DirectoryEntry("IIS://localhost/W3SVC/1"))
        {
            var options = entry.Options; // exception here
        }

Измененная последовательность отлично работает:

        // IIS install here
        using (Domain domain = Domain.GetCurrentDomain())
        {
        }
        using (DirectoryEntry entry = new DirectoryEntry("IIS://localhost/W3SVC/1"))
        {
            var options = entry.Options;
        }

Используя Reflector, я обнаружил, что достаточно один раз вызвать ADsOpenObject , чтобы сделать поставщика IIS ADSI недоступным после установки IIS.

class Program
{
    static void Main(string[] args)
    {
        object ldapPPObject = GetAdsObject("LDAP://TestDomain.local/RootDSE");
        Marshal.ReleaseComObject(ldapPPObject);
        // IIS install here
        object iisPPObject = GetAdsObject("IIS://localhost/W3SVC/1"); // exception here
        Marshal.ReleaseComObject(iisPPObject);
    }
    private static object GetAdsObject(string path)
    {
        Guid iid = new Guid("00000000-0000-0000-c000-000000000046");
        object ppObject;
        if (IntADsOpenObject(path, null, null, 193, ref iid, out ppObject) != 0)
        {
            throw new Exception("ADsOpenObject failed");
        }
        return ppObject;
    }
    [DllImport("activeds.dll", EntryPoint = "ADsOpenObject", CharSet = CharSet.Unicode, ExactSpelling = true)]
    private static extern int IntADsOpenObject(string path, string userName, string password, int flags, [In, Out] ref Guid iid, [MarshalAs(UnmanagedType.Interface)] out object ppObject);
}

Я попытался создать отдельный домен приложения и разместить там код, который использует IIS, но эта попытка также не удалась.

Как заставить принудительно выполнить повторную инициализацию AD, чтобы поставщик IIS ADSI был доступен после установки IIS?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2010

Нет способа заставить поставщика ADSI снова работать после вызова ADsOpenObject.К сожалению.

0 голосов
/ 06 января 2010

.Net не имеет ничего общего с проблемой.
Следующий код на С ++ тоже не работает:

int _tmain(int argc, _TCHAR* argv[])
{
    IADs *pObject;
    HRESULT hr;

    CoInitialize(NULL);

    hr = ADsOpenObject(L"LDAP://TestDomain.local/RootDSE", NULL, NULL, 193, IID_IADs, (void**) &pObject);
    if(SUCCEEDED(hr))
    {
        pObject->Release();
    }
    // install iis here
    hr = ADsOpenObject(L"IIS://localhost/W3SVC/1", NULL, NULL, 193, IID_IADs, (void**) &pObject);
    if(SUCCEEDED(hr)) // not succeeded
    {
        pObject->Release();
    }

    CoUninitialize();

    return 0;
}

Но проблему все равно нужно как-то решить ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...