Мое приложение .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?