我的.Net应用程序主动使用Active Directory,如果没有,则安装IIS。
如果在应用程序启动时未安装IIS,并且调用了任何与Active Directory相关的方法,则IIS安装后IIS ADSI Provider仍然不可用(在应用程序重新启动后,它可用)。
遗憾的是我无法更改操作顺序,因此必须“使用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后,只需调用ADsOpenObject一次就可以使IIS ADSI提供程序不可用。
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提供程序可用?
答案 0 :(得分: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;
}
但问题仍然需要以某种方式解决......
答案 1 :(得分:0)
在调用ADsOpenObject之后,无法让ADSI提供程序再次运行。遗憾。