3

当我尝试从在 IIS 5.1 下运行的 C# 应用程序连接到远程 IIS 6 服务器时,我收到“Access Deined”COMException。

有任何想法吗?我在原始问题中遇到了所有相同的问题。

更新 - 2009 年 4 月 1 日

我找到了这个解决方案(http://www.codeproject.com/KB/cs/Start_Stop_IIS_Website.aspx),它包含一个连接到 IIS 服务器以启动和停止网站的窗口应用程序。我能够在我的工作站上运行它并连接到 IIS 服务器。

呃....为什么我可以运行这个独立的应用程序而不是我的 ASP.NET 应用程序?

原来的

当我尝试使用 DirectoryEntry.Exist 方法从远程计算机连接到 IIS 以检查 IIS 服务器是否有效时,我收到“拒绝访问”COMException。

string path = string.Format("IIS://{0}/W3SVC", server);

if(DirectoryEntry.Exist(path))
{
    //do something is valid....
}

我是一个活动目录组的成员,该组已添加到我尝试连接的 IIS 服务器的管理员组中。

有没有人遇到过这个问题并知道如何解决它?

更新:

@Kev - 这是一个 ASP.NET 应用程序。此外,我可以通过 IIS6 管理器在没有用户名和密码的情况下连接到远程服务器。

@Chris - 我正在尝试连接到远程服务器以显示虚拟目录的数量并确定每个目录的 .NET 框架版本。请参阅这个SO 问题。

@dautzenb - 我的 ASP.NET 应用程序在 IIS 5.1 下运行,试图连接到 IIS 6 服务器。我可以在远程服务器上的本地 ASPNET 帐户的安全日志中看到故障审核。当我尝试调试应用程序时,我在我的域帐户下运行并且仍然获得访问被拒绝。

更新 2:

@Kev - 我能够使用以下重载创建 DirectoryEntry 对象:

public DirectoryEntry
(    
    string path,    
    string username,    
    string password
)

但是,在我调试应用程序时,所有属性都包含“引发了类型为‘System.Runtime.InteropServices.COMException’的异常”。

此外,AuthenticationType 属性设置为 Secure。

更新 3:

每次我尝试建立连接时,远程 IIS 服务器的安全事件日志中都会出现以下两个失败审核条目:

第一个事件:

事件类别:帐户登录
事件 ID:680
记录尝试:MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
登录帐户:ASPNET
源工作站:
错误代码:0xC0000234

第二个事件:

事件类别:登录/注销
事件 ID:529
登录失败:
原因:未知用户名或密码错误
用户名:ASPNET
域:(MyDomain)
登录类型:3
登录过程:NtLmSsp
身份验证包:NTLM
工作站名称:(MyWorkstationId)
调用者用户名称: -
呼叫者域: -
呼叫者登录 ID: -
呼叫者进程 ID: -
中转服务: -
源网络地址: 10.12.13.35
源端口: 1708

模拟设置为真,用户名和密码为空。它使用远程 IIS 服务器上的 ASPNET 帐户。

4

8 回答 8

2

如果是身份问题,您可以尝试将 IIS 5.1 应用程序设置为使用Integrated Windows Authentication,然后将以下内容添加到您的 IIS5.1 网站上的 system.web 下的 web.config 以启用模拟

<identity impersonate="true"/>
<authentication mode="Windows" />
于 2009-05-04T00:18:14.083 回答
1

这看起来可能是一个双跳问题。如果您使用 NTLM 模拟网站的当前用户,则该模拟仅在该服务器上有效(在这种情况下是您的 IIS 5.1 服务器)。如果您尝试使用该网站连接到另一台服务器,您实际上会遇到问题,因为它无法将令牌传递给在模拟期间使用的另一台服务器。如果您正在通过您的机器调试您的站点,并且转到另一个盒子,那么情况也是如此。您的本地计算机正在对您进行身份验证,但它无法将您模拟到另一台服务器。

我过去使用的所有解决方案都要求您对应用程序池进行硬编码以使用具有权限的帐户,设置 annony。帐户到在另一台机器上具有权限的域帐户,或使用在域帐户下运行在 IIS 5.1 机器上的 windows 服务连接到另一台服务器。

如果您使用的是 Kerberos,这将不适用,但 AD 默认使用 NTLM。

于 2009-08-03T20:12:48.023 回答
1

由于这是一个 ASP.NET 应用程序,它在 IIS 的应用程序池中运行。此应用程序池使用特定用户(“本地系统”、“网络服务”或其他用户)运行。

该用户是否有足够的权限连接到远程服务器?

有关详细信息,请参阅 MSDN。

于 2009-03-12T16:24:07.360 回答
0

当我遇到这个问题时,我发现只需在 Windows 文件共享上验证我自己就可以解决问题。根据经验,我认为 WMI/ADSI/COM 对尚未经过身份验证的用户没有很好的支持。我相信当您没有与 Windows 域关联时会出现此问题。

于 2009-04-05T13:01:42.160 回答
0

我现在有点难过为什么你不能让它工作。您可以尝试一个临时工作。实例化DirectoryEntry对象时,您可以使用以下构造函数重载之一:

public DirectoryEntry(
    string path,
    string username,
    string password
)

记录在:MSDN:DirectoryEntry 构造函数(字符串、字符串、字符串)

...或者...

public DirectoryEntry(
    string path,
    string username,
    string password,
    AuthenticationTypes authenticationType
)

记录于:MSDN:DirectoryEntry 构造函数(字符串、字符串、字符串、AuthenticationTypes)

碰巧我正在我的虚拟服务器上构建一个测试 AD 环境,以便一个新项目做类似的事情。当我启动并运行它时,我会试一试,看看我是否可以重现您遇到的问题。同时,让我们知道如果您尝试上面引用的这些构造函数重载会发生什么。

更新(回应迈克尔斯的评论):

由于我刚才回避的原因,我们不能DirectoryEntry.Exists()在特定场景中使用,有一段代码在我们的一个应用程序中不时被调用:

public static bool MetabasePathExists(string metabasePath)
{
  try
  {
    using(DirectoryEntry site = new DirectoryEntry(metabasePath))
    {
      if(site.Name != String.Empty)
      {
        return true;
      }
      return false;
    }
  }
  catch(COMException ex)
  {
    if(ex.Message.StartsWith("The system cannot find the path specified"))
    {
      return false;
    }
    LogError(ex, String.Format("metabasePath={0}", metabasePath));
    throw;
  }
  catch(Exception ex)
  {
    LogError(ex, String.Format("metabasePath={0}", metabasePath));
    throw;
  }
}

您可以将构造函数替换为上面的构造函数之一。诚然,这是在黑暗中刺伤:)。

于 2009-03-12T19:59:54.267 回答
0

您到底想在哪里阅读?它与您的应用程序在同一路径下吗?

于 2009-03-12T01:58:07.577 回答
0

我相信 DirectoryEntry.Exists 会默默地忽略提供的任何凭据并使用经过身份验证的用户的凭据。这似乎与您描述的行为相匹配。对于广告工作,我们从不因为这个原因使用它。

于 2009-08-14T17:26:05.267 回答
0

如果确实是 NTLM 双跳问题,您可以使用 SETSPN 实用程序为目标 IIS 服务器创建服务主体命名实例。

然后您可以进入 Active Directory,然后允许计算机对象(基本上是 NETWORK SERVICE 或 LOCAL SERVICE 主体)将其凭据委托给正确注册的 SPN。

然后你就可以到处蹦蹦跳跳了!但是,请注意!当您启用双跳时,人们可能会在尖锐的东西上伤害自己!

值得阅读的好知识库文章:

http://support.microsoft.com/kb/929650

于 2009-08-11T01:23:43.857 回答