我正在更新之前在vb.net中编写过的网站。此网站在远程网站上执行一些基本管理,例如回收应用程序池或停止站点实例。它主要用于在IIS服务器上列出具有基本信息的站点。
我决定用C#重写它,因为这是我选择的日常语言。
经过多次反复试验后,我将问题归结为一些非常简单的代码。该网站在vb.net中有所工作。当我将其移植到c#时,它无法访问远程IIS DirectoryEntry。如果因COM异常或拒绝访问而失败。我在不同的服务器和不同版本的.NET(2.0和4.5)上尝试过它。
我现在拥有的是Visual Studio 2015中的两个解决方案。它们都是.NET Framework 2.0的目标。两者都是从Empty ASP.NET Website模板创建的。创建之后,我添加了对2.0 .NET程序集System.DirectoryServices的引用。然后我添加了一个名为default.aspx的Web表单。我向aspx页面添加了一个文字控件,然后打开了代码隐藏文件并添加了以下内容:
default.aspx.cs:
using System;
using System.DirectoryServices;
namespace CSWebInfo
{
public partial class _default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var result = String.Empty;
DirectoryEntry W3SVC = new DirectoryEntry("IIS://dev_websrv_01/W3SVC", "domain\admin username", "admin password");
foreach (DirectoryEntry s in W3SVC.Children)
{
result += s.Properties["ServerComment"][0].ToString() + "<br />";
}
LiteralDisplay.Text = result;
}
}
}
default.aspx.vb:
Imports System.DirectoryServices
Public Class _default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim result As String = ""
Dim W3SVC As New DirectoryEntry("IIS://dev_websrv_01/W3SVC", "domain\admin username", "admin password")
For Each s As DirectoryEntry In W3SVC.Children
result += s.Properties("ServerComment").Value + "<br />"
Next
LiteralDisplay.Text = result
End Sub
End Class
我没有触及任何其他东西。 web.config文件保持原样与模板一样。
这应列出dev_websrv_01服务器上每个站点的友好名称。
vb.net网站运作完美。我得到了每个网站的简单列表。在foreach语句中访问W3SVC.Children后,c#站点立即失败。抛出的异常是COMException:Access被拒绝。
这两个站点都直接从Visual Studio运行,在桌面计算机上使用IISExpress物理连接到与服务器相同的网络域。
有关为什么vb.net中完全相同的代码可以访问远程服务器但c#代码不能的任何想法?
感谢您的帮助!
答案 0 :(得分:2)
new DirectoryEntry("IIS://dev_websrv_01/W3SVC", "domain\admin username", "admin password");
这是你的问题。您正在使用domain\admin
中的反斜杠,它被解释为转义序列。
使用此字符串文字:
@"domain\admin username"
或者这些
"domain\\admin username"