通过C#或appcmd编辑IIS 8的绑定

时间:2014-05-29 17:24:03

标签: c# iis appcmd

如何在IIS 8(Windows 8)中修改已配置站点中的现有绑定?我试图通过命令提示符来完成它。

我可以通过以管理员模式运行的命令提示符添加新绑定:

> C:\Windows\System32\inetsrv>appcmd set site /site.name:test /+bindings.[protocol='http',bindingInformation='*:80:mitest']

在命令提示符中,我使用:

> C:\Windows\System32\inetsrv>appcmd set site "test" /?

要查看SET Binding选项,并且不存在“SET Binding BY BINDING ID”命令。

通过C#代码,我使用:

string windir = Environment.GetEnvironmentVariable("windir");    
string comando = windir +"\\System32\\inetsrv\\appcmd.exe set site /site.name:test /+bindings.[protocol='http',bindingInformation='*:80:mitest']";

System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + comando);

procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;                
procStartInfo.CreateNoWindow = true;
procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();

string result = proc.StandardOutput.ReadToEnd();

Console.WriteLine(result);
Debug.WriteLine(result);

我收到错误:“由于权限不足而无法读取配置文件”

但我不能通过命令修改。我无法通过代码为下一步创建绑定尝试修改它。

2 个答案:

答案 0 :(得分:3)

即使问题已经过时,我也会回答这个问题,因为我遇到了同样的问题,并使用APPCMD工具找到了以下工作解决方案。此示例显示如何将Host-Header添加到现有SSL绑定。

appcmd set site /site.name "SiteName" /bindings.[protocol='https',bindingInformation='*:443:*'].BindingInformation:*:443:NewHostHeader

答案 1 :(得分:1)

我在回答问题几个小时之后回答了自己。我读到使用appcmd通过c#代码非常复杂,因为权限。最后我使用了 ServerManager 类,首先我在我的项目中引用了这个dll:

<强> C:\ Windows \ System32下\ INETSRV \ Microsoft.Web.Administration.dll

然后我使用代码来操作AppPools,Sites或Bindings。绑定没有ID然后你可以使用HashTable,在我的情况下是“bindingNameBase”,用​​主机名保存密钥(在我的项目/问题中是唯一的)所以它:

public void EditBinding(int id, SiteBinding siteBinding, string newKeyName)
        {
            using (ServerManager serverManager = new ServerManager())
            {
                if (serverManager.Sites == null)
                    return;

                for (int i = 0; i < serverManager.Sites.Count; i++)
                {
                    if (serverManager.Sites[i].Id == id)
                    {
                        Microsoft.Web.Administration.BindingCollection bindingCollection = serverManager.Sites[i].Bindings;

                        // se elimina el binding
                        Microsoft.Web.Administration.Binding bindingTmp = null;
                        for (int j = 0; j < bindingCollection.Count; j++)
                        {
                            if (bindingCollection[j].Host == bindingNameBase[newKeyName].ToString())
                            {
                                bindingTmp = bindingCollection[j];                                
                                break;
                            }
                        }

                        if (bindingTmp != null)
                        {
                            bindingCollection.Remove(bindingTmp);

                            //se crea de nuevo
                            Microsoft.Web.Administration.Binding binding = serverManager.Sites[i].Bindings.CreateElement("binding");
                            binding["protocol"] = siteBinding.Protocol;
                            binding["bindingInformation"] = string.Format(@"{0}:{1}:{2}", siteBinding.IPAddress, siteBinding.Port.ToString(), siteBinding.HostName);

                            bool existe = false;
                            for (int j = 0; j < bindingCollection.Count; j++)
                            {
                                if (bindingCollection[j].Host == siteBinding.HostName)
                                {
                                    existe = true;
                                    break;
                                }
                            }

                            if (existe == false)
                            {
                                bindingCollection.Add(binding);
                                serverManager.CommitChanges();

                                bindingNameBase[newKeyName] = siteBinding.HostName;
                            }
                        }                        
                    }
                }

网站必须使用具有正确身份的池,否则您的权限会出现问题。