2012-03-07 3 views
1

Я унаследованный код, который создает несколько приложений под IIS 7.0, используя код, подобный следующему (прибрано для краткости)Как установить конкретный пользователь на приложении IIS

DirectoryEntry iisServer = new DirectoryEntry("IIS://localhost/W3SVC/1"); 
DirectoryEntry folderRoot = iisServer.Children.Find("Root", "IIsWebVirtualDir"); 
DirectoryEntry newVirDir = folderRoot.Children.Add("MyNewVirtualDir", "IIsWebVirtualDir"); 

newVirDir.Properties["AccessRead"][0] = true; 
newVirDir.Properties["AccessScript"][0] = true; 
newVirDir.Properties["Path"].Insert(0, "C:\\MyVirtualDirStuff"); 
newVirDir.Properties["AccessExecute"][0] = true; 
newVirDir.Properties["AppIsolated"].Value = 2; //"Medium (Pooled)" 
newVirDir.Properties["DefaultDoc"][0] = "index.htm"; 
newVirDir.Invoke("AppCreate", true); 
newVirDir.CommitChanges(); 
folderRoot.CommitChanges(); 
iisServer.CommitChanges(); 

Это все работает правильно, но теперь мне нужно указать, что приложение работает под определенной учетной записью. Я могу изменить это вручную в IIS в диалоговом окне «Подключить как ...» и указать требуемое имя пользователя и пароль.

К сожалению, я не могу на всю жизнь понять, как установить это в коде. Я попытался установить свойство Username по-разному, но вызов Invoke («AppCreate») всегда выдает исключение какого-либо типа, зависящего от того, что я пробовал. Не удалось выполнить следующие работы:

newVirDir.Username = "MYDOMAIN\\MyUser"; 
newVirDir.Properties["Username"][0] = "MYDOMAIN\\MyUser"; 
newVirDir.Properties["Username"].Insert(0, "MYDOMAIN\\MyUser"); 

Это должно быть легко - если бы я знал, как это сделать!

Спасибо заранее, Крис

ответ

4

Я не сделал это в каком-то время, но я думаю, что вам нужно также создать ApplicationPool и установить полномочия на уровне пула приложений, то при создании вашего виртуального , убедитесь, что он использует созданный вами пул приложений.

Эта ссылка поможет вам начать:

http://martinnormark.com/adding-an-application-pool-to-iis7-programmatically

Затем вам нужно изменить код, в котором он указывает, использовать сетевую службу, к следующему, и вы должны быть в бизнесе , (Это установит полномочия на пуле приложений)

myAppPool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser; 
myAppPool.ProcessModel.UserName = "username"; 
myAppPool.ProcessModel.Password = "password"; 

Убедитесь, что вы создали пул приложений, а затем установите AppPool на виртуальной директории, как это ...

newVirDir.Properties["AppPoolId"][0] = "newAppPoolName"; 
+0

Спасибо - уже есть пул приложений, и я установил учетные данные, как это требуется на этом, но с самим Приложением по-прежнему установлено «Пользовательский интерфейс (сквозная аутентификация)», он не работает. Я обнаружил, что, если я явно не установил учетные данные для самого приложения, он, похоже, использует «NT AUTHORITY \ ANONYMOUS LOGON» в качестве пользователя. Установка учетных данных в самом приложении в IIS гарантирует, что все работает нормально, но я не могу решить, как это сделать программно. –

0

Ну, я 've found a способ сделать это - это рекомендуемый способ, которого я не знаю.

Используя эту ссылку в качестве начала: http://www.iis.net/ConfigReference/system.applicationHost/sites/site/application/virtualDirectory

Я теперь получил это, что, кажется, делать именно то, что я хочу:

using (ServerManager serverManager = new ServerManager()) 
{ 
    Configuration config = serverManager.GetApplicationHostConfiguration(); 
    ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites"); 
    ConfigurationElementCollection sitesCollection = sitesSection.GetCollection(); 
    ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Default Web Site"); 
    ConfigurationElementCollection applicationCollection = siteElement.GetCollection(); 
    ConfigurationElement applicationElement = FindElement(applicationCollection, "application", "path", @"/MyNewVirtualDir"); 
    ConfigurationElementCollection virtualDirCollection = applicationElement.GetCollection(); 
    ConfigurationElement virtualDirElement = FindElement(virtualDirCollection, "virtualDirectory", "path", @"/"); 
    virtualDirElement.Attributes["userName"].Value = "MYDOMAIN\\MyUser"; 
    virtualDirElement.Attributes["password"].Value = "MyPassword"; 

    serverManager.CommitChanges(); 
} 
0

Виртуальный каталог Credential

newVirDir.Properties["AuthFlags"].Value = 5; 
newVirDir.Properties["UNCUsername"].Value = "MYDOMAIN\\MyUser"; 
newVirDir.Properties["UNCPassword"].Value = "password"; 
+0

Вы должны расширить это, вы недостаточно написали, чтобы четко объяснить, что делает ваш ответ. – Adam

Смежные вопросы