通过c#或appcmd编辑绑定iis8
本文关键字:绑定 iis8 编辑 appcmd 通过 | 更新日期: 2023-09-27 18:05:42
如何在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);
我得到错误:"无法读取配置文件,由于权限不足"
但是我不能通过命令修改。我不能通过代码创建绑定,下一步尝试修改它
即使问题是旧的,我也会回答这个问题,因为我有同样的问题,并找到了以下使用APPCMD工具的工作解决方案。这个例子展示了如何在现有的ssl绑定中添加Host-Header。
appcmd set site /site.name "SiteName" /bindings.[protocol='https',bindingInformation='*:443:*'].BindingInformation:*:443:NewHostHeader
我花了几个小时思考这个问题后回答自己。我读到使用appcmd的c#代码是非常复杂的,因为权限。最后我使用了ServerManager类,首先我在我的项目中引用了这个dll:
C: ' Windows ' System32系统' inetsrv ' Microsoft.Web.Administration.dll
,然后使用代码来操作apppool、Sites或Bindings。绑定没有ID,然后你可以使用哈希表,在我的情况下"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;
}
}
}
}
该站点必须使用具有正确身份的池,否则您的权限将出现问题。