【问题标题】:How to set a specific user on IIS Application如何在 IIS 应用程序上设置特定用户
【发布时间】:2012-03-07 16:49:32
【问题描述】:

我继承了一些在 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 中的 Connect As... 对话框中手动更改它,并指定所需的域用户名和密码。

不幸的是,我终其一生都无法弄清楚如何在代码中进行设置。 我尝试以各种方式设置 Username 属性,但 Invoke("AppCreate") 调用总是抛出某种类型的异常,具体取决于我尝试过的内容。以下都失败了:

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

这一定很容易——要是我知道怎么做就好了!

提前致谢, 克里斯

【问题讨论】:

    标签: c# .net iis virtual-directory


    【解决方案1】:

    我有一段时间没有这样做了,但我认为您还需要创建一个应用程序池,并在应用程序池级别设置凭据,然后在创建虚拟目录时,确保它使用的是应用程序池你创造的。

    此链接应该可以帮助您入门:

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

    【讨论】:

    • 谢谢 - 已经有一个应用程序池,我已经根据需要设置了凭据,但应用程序本身仍设置为“应用程序用户(传递身份验证)”,它不起作用。我发现除非我在应用程序本身上明确设置凭据,否则它似乎使用“NT AUTHORITY\ANONYMOUS LOGON”作为用户。在 IIS 中设置应用程序本身的凭据可确保一切正常,但我无法以编程方式解决此问题。
    【解决方案2】:

    嗯,我找到了一种方法——我不知道这是否是推荐的方法。

    使用此链接作为开始: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();
    }
    

    【讨论】:

      【解决方案3】:

      虚拟目录凭据

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

      【讨论】:

      • 您应该对此进行扩展,您还没有写足够的内容来清楚地解释您的答案在做什么。
      猜你喜欢
      • 2011-11-02
      • 2020-08-04
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      相关资源
      最近更新 更多