Я пытаюсь выполнить следующий код
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.
Есть ли у кого-нибудь идеи?
Используйте DirectoryEntry Constructor (String, String, String, AuthenticationTypes), в котором вместо имени выдаются имя пользователя и пароль.
DirectoryEntry directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root", @"domain\username", "password", AuthenticationTypes.Secure | AuthenticationTypes.Sealing);
Предполагая, что вы используете класс Impersonator из CodeProject, попробуйте изменить тип входа, как указано в этой публикации со страницы 4 комментариев:
Hi Uwe,
он работает только для удаленного доступа из Vista, когда вы меняете logontype в функции logonuser на LOGON32_LOGON_NEW_CREDENTIALS.
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
С уважением Уве