Я пытаюсь выполнить следующий код
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.
У кого-нибудь есть идеи?