Олицетворение не работает для DirectoryServices

1

Я пытаюсь выполнить следующий код

using System.DirectoryServices;

public bool HasVirtualDirectory(string serverName, string virtualDirectoryName)
{
    try
    {
        DirectoryEntry directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root");
        return directoryEntry.Children.Find(virtualDirectoryName, directoryEntry.SchemaClassName.ToString()) != null;
    }
    catch (Exception)
    {
        return false;
    }
}

Поскольку для выполнения этого кода мне нужны права администратора на сервере, я использовал этот класс для олицетворения правильного пользователя:

using (Impersonator impersonator = new Impersonator("username", "domain", "password"))
{
    server.HasAccess = HasVirtualDirectory(server.HostName, virtualDirectory);
}

Но я все еще получаю COMException: доступ запрещен. С другой стороны, если я не использую олицетворения, но я запускаю программу напрямую с теми же учетными данными, которые я использовал в олицетворении (используя "Запуск от имени пользователя" в контекстном меню), он работает так, как ожидалось.

Запуск программы в качестве администратора (администратор на компьютере, на котором запущена программа, но не на сервере) ничего не изменил, исключение все еще происходило.

Я также попробовал ImpersonationLevel.SecurityDelegation(= 3) вместо ImpersonationLevel.SecurityImpersonation(= 2) в вызове DuplicateToken, но это ничего не изменило (как обычный, так и администратор, выполняющий программу).

Чтобы проверить выданный код, я попробовал следующий код, и это сработало. (пользователь, выполняющий программу, не имеет прав на создание каталога, но сам выдавший себя пользователь).

using (Impersonator impersonator = new Impersonator("username", "domain", "password"))
{
    Directory.CreateDirectory(@"\\servername\c$\tmp");
}

Я использую Windows 7 Professional с активированным UAC. Сервер - это Windows Server 2003 R2 SP2.

Есть ли у кого-нибудь идеи?

  • 0
    Вы должны указать, откуда вы взяли класс Impersonator, поскольку он не является частью .NET Framework. Я предполагаю, что это один, codeproject.com/Articles/10090/… из Code Project?
  • 1
    Вы пытались использовать конструктор DirectoryEntry (String, String, String, AuthenticationTypes), который принимает имя пользователя и пароль вместо олицетворения?
Показать ещё 3 комментария
Теги:
impersonation
directoryservices

2 ответа

2
Лучший ответ

Используйте DirectoryEntry Constructor (String, String, String, AuthenticationTypes), в котором вместо имени выдаются имя пользователя и пароль.

DirectoryEntry directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root", @"domain\username", "password", AuthenticationTypes.Secure | AuthenticationTypes.Sealing);
  • 0
    Спасибо, что сработало. Но если кто-нибудь все еще может сказать мне, почему Имитатор не работает, продолжайте :)
0

Предполагая, что вы используете класс Impersonator из CodeProject, попробуйте изменить тип входа, как указано в этой публикации со страницы 4 комментариев:

Hi Uwe,

он работает только для удаленного доступа из Vista, когда вы меняете logontype в функции logonuser на LOGON32_LOGON_NEW_CREDENTIALS.

const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

см. Функция LogonUser

С уважением Уве

  • 0
    Я забыл упомянуть об этом в своем вопросе, но я тоже прочитал этот комментарий и попытался использовать LOGON32_LOGON_NEW_CREDENTIALS, он дал то же исключение. Теперь я попробовал снова и попытался объединить его с ImpersonationLevel.SecurityDelegation в Duplicatetoken и / или запустить программу от имени администратора, но я всегда получаю одно и то же исключение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню