Олицетворение не работает для DirectoryServices - PullRequest
1 голос
/ 08 марта 2012

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

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.

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

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

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

DirectoryEntry directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root", @"domain\username", "password", AuthenticationTypes.Secure | AuthenticationTypes.Sealing);
0 голосов
/ 08 марта 2012

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

Привет Уве,

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

const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

см. Функция LogonUser

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

...