【问题标题】:Unable to use IIS ADSI Provider after IIS installation if ADsOpenObject was called before install如果在安装之前调用了 ADsOpenObject,则在 IIS 安装后无法使用 IIS ADSI 提供程序
【发布时间】:2010-01-04 16:45:42
【问题描述】:

我的 .Net 应用程序主动使用 Active Directory 并在没有 IIS 时安装它。 如果在应用程序启动时未安装 IIS,并且调用了任何与 Active Directory 相关的方法,则 IIS ADSI 提供程序在 IIS 安装后仍然不可用(应用程序重新启动后它变得可用)。
不幸的是我不能改变操作顺序,所以它必须是“use AD -> install IIS -> use IIS ADSI provider -> use 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 的代码,但此尝试也失败了。

如何在 IIS 安装后强制 AD 重新初始化以使 IIS ADSI 提供程序可用?

【问题讨论】:

    标签: c# iis adsi


    【解决方案1】:

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

    但是问题还是要解决……

    【讨论】:

      【解决方案2】:

      在调用 ADsOpenObject 后,无法让 ADSI 提供程序再次工作。对不起。

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 2022-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多