Как настроить конкретного пользователя в приложении IIS - PullRequest
1 голос
/ 07 марта 2012

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

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");

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

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

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Я давно этого не делал, но я думаю, что вам также необходимо создать 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 голосов
/ 29 марта 2017

Виртуальный каталог Учетные данные

newVirDir.Properties["AuthFlags"].Value = 5;
newVirDir.Properties["UNCUsername"].Value = "MYDOMAIN\\MyUser";
newVirDir.Properties["UNCPassword"].Value = "password";
0 голосов
/ 08 марта 2012

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

Используя эту ссылку в качестве начала: 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();
}
...