2017-08-25 225 views
0

目标
更改IIS绑定和交换虚拟目录在每个请求的基础上。一个简单的应用程序将使用Microsoft.Web.Administration打开,替换和提交。以下是简化流程:IIS使用Microsoft.Web.Administration和承诺更改

代码

ServerManager = New ServerManager() 
config = ServerManager.GetApplicationHostConfiguration() 
SiteList = config.GetSection("system.applicationHost/sites") 
SitesCollection = SiteList.GetCollection() 
_site = SitesCollection.FirstOrDefault(Function(f) f.GetAttributeValue("name").ToString() = "XXX") 
_bindings = _site.GetCollection("bindings") 
_bind As ConfigurationElement = _bindings.CreateElement("binding") 
_bind("protocol") = "http" 
_bind("bindingInformation") = String.Format("*:80:{0}", "www.zzz.yyy") 
_bindings.Add(_bind) 
ServerManager.CommitChanges() 

问题
这对管理员的代码运行验证网页,呼叫前,该线程被模拟,以确保特权到位。我被允许阅读.config但不写!我还确认,在任何调用之前,线程以管理员身份运行。我也尝试使用LocalService池,但是再次没有运气。

错误

Filename: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 
Error: Cannot write configuration file due to insufficient permissions 
hresult: 0x80070005 
at Microsoft.Web.Administration.Interop.AppHostWritableAdminManager.CommitChanges() 
+0

线程模拟是无用的。 LocalService不是本地管理员。您必须以LocalSystem身份运行池。 –

+0

尝试了上述所有操作,包括使用LocalSystem身份池。 – fcm

回答

0

一些检查和实验后,我发现该办法让它工作是

  • 不要在应用程序中使用的身份验证。
  • 请勿使用模拟。
  • LocalService不起作用。
  • 运行它有足够的权限(管理员)池

看起来像使用模拟再次打破它。

这不是我想要的设置,但我想我可以生存并将应用程序移动到这个不安全的池中,进行更改并将其移回到通用ApplicationPoolIdentity。