1

私の .Net アプリケーションは Active Directory を積極的に使用し、存在しない場合は IIS をインストールします。IIS がアプリケーションの起動時にインストールされておらず、Active Directory 関連のメソッドのいずれかが呼び出された場合、IIS のインストール後も IIS ADSI プロバイダーは使用できません (アプリケーションの再起動後に使用可能になります)。
残念ながら、操作シーケンスを変更することはできません。したがって、「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 を使用すると、IIS のインストール後に IIS ADSI プロバイダーを使用できないようにするには、 ADsOpenObjectを 1 回呼び出すだけで十分であることがわかりました。

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 を使用するコードを配置しようとしましたが、これも失敗しました。

IIS のインストール後に IIS ADSI プロバイダーを利用可能にするために、AD の再初期化を強制するにはどうすればよいですか?

4

2 に答える 2

0

.Netはこの問題とは何の関係もありませんでした。
次のC++コードも失敗します。

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;
}

しかし、それでも問題はどうにか解決する必要があります...

于 2010-01-05T22:06:43.997 に答える
0

ADsOpenObject を呼び出した後、ADSI プロバイダーを再び機能させる方法はありません。ごめん。

于 2010-04-09T19:38:22.357 に答える