Программная настройка пользователя ‘Connect as’ в IIS7 с использованием C#

#c# #iis #iis-7

#c# #iis #iis-7

Вопрос:

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

 using Microsoft.Web.Administration;

using Microsoft.Web.Management;

using Microsoft.Web.Media.TransformManager.Common;

using Microsoft.Web.Media.TransformManager;

using System.Web.Configuration;

using System.Collections;

                        Configuration config = iisManager.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 в следующем контексте.

 ServerManager iisManager = new ServerManager()
                        site = iisManager.Sites.FirstOrDefault(a => a.Name.Contains("Default"));
                        site.VirtualDirectoryDefaults.Password = tbImpersonatorPassword.Text;
                        site.VirtualDirectoryDefaults.UserName = tbImpersonatorUser.Text;
  

Комментарии:

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

Ответ №1:

Итак, поскольку я смотрел на вопрос после того, как несколько дней бился над этим, и, по-видимому, вы можете выполнить это с помощью Servermanager в следующем контексте.

 ServerManager iisManager = new ServerManager()
                        site = iisManager.Sites.FirstOrDefault(a => a.Name.Contains("Default"));
                        site.VirtualDirectoryDefaults.Password = tbImpersonatorPassword.Text;
                        site.VirtualDirectoryDefaults.UserName = tbImpersonatorUser.Text;
  

Ответ №2:

Установка имени пользователя и пароля в VirtualDirectoryDefaults может не дать результатов, которые вы ищете. Вместо этого вы можете захотеть найти приложение в этом объекте сайта, путь к которому является корневым (отсюда и фильтр .Path.Equals(«/») в запросе), а затем изменить имя пользователя и пароль виртуального каталога приложений.

Это может быть выполнено с помощью следующего метода (Пожалуйста, обратите внимание: этот метод предполагает, что вы уже нашли нужный сайт с помощью поиска в коллекции сайтов ServerManagers и что вы передаете этот объект сайта в этот метод). По завершении обязательно удалите объект ServerManager, чтобы избежать утечки памяти.

     public static void SetConnectAsAccount(Site site, string username, string password)
    {
        if (site == null)
        {
            throw new ArgumentNullException("site");
        }

        if (string.IsNullOrWhiteSpace(username))
        {
            throw new ArgumentNullException("username");
        }

        if (string.IsNullOrWhiteSpace(password))
        {
            throw new ArgumentNullException("password");
        }

        foreach (var app in site.Applications.Where(c => c.Path.Equals("/")))
        {
            try
            {
                // set the Connect-As Accounts login credentials to the Service Acount
                var appVirDir = app.VirtualDirectories.Where(c => c.Path.Equals("/")).FirstOrDefault();

                if (appVirDir != null)
                {
                    appVirDir.UserName = username;
                    appVirDir.Password = password;
                }     
            }
            catch (Exception ex)
            {
                // log your exception somewhere so you know what went wrong
            }
        }
    }