DirectoryEntry.Bind在vb.net中工作但在c#中失败

时间:2015-12-22 22:37:24

标签: c# asp.net .net vb.net iis

我正在更新之前在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#代码不能的任何想法?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

 new DirectoryEntry("IIS://dev_websrv_01/W3SVC", "domain\admin username", "admin password");

这是你的问题。您正在使用domain\admin中的反斜杠,它被解释为转义序列。

使用此字符串文字:

@"domain\admin username"

或者这些

"domain\\admin username"