繁体   English   中英

尝试连接到远程IIS服务器时出现“访问被拒绝”-C#

[英]“Access Denied” when trying to connect to remote IIS server - C#

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

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

更新-2009年4月1日

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

gh ....为什么我可以运行此独立应用程序,但不能运行ASP.NET应用程序?

原版的

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

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

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

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

有没有人遇到此问题并知道如何解决?

更新:

@Kev-这是一个ASP.NET应用程序。 另外,我可以不使用用户名和密码即可通过IIS6 Manager连接到远程服务器。

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

@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属性设置为“安全”。

更新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

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

如果是身份问题,则可以尝试将IIS 5.1应用程序设置为使用“ 集成Windows身份验证” ,然后将以下内容添加到IIS5.1网站上的system.web下的web.config中,以启用模拟功能

<identity impersonate="true"/>
<authentication mode="Windows" />

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

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

如果使用的是Kerberos,则将不适用,但默认情况下,AD使用NTLM。

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

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

有关更多信息,请参见MSDN。

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

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

然后,您可以到处跳跳! 但是,请注意! 启用双跳功能后,人们可能会因尖锐的尖锐事物而受伤!

好的KB文章可供阅读:

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

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

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

关于您为什么无法使它正常工作,我现在有些困惑。 您可以尝试进行临时工作。 实例化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;
  }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM