ADSI/IIS 管理和 ASP.NET 模拟

Posted

技术标签:

【中文标题】ADSI/IIS 管理和 ASP.NET 模拟【英文标题】:ADSI / IIS management and ASP.NET impersonation 【发布时间】:2009-03-05 12:37:17 【问题描述】:

我正在编写一个小型 Web 应用程序,该应用程序允许我管理我们网络上不同服务器上的多个 IIS 安装。我们没有域控制器。

我编写了一个使用 win32 api 及其 LogonUser 方法的小型模拟控制器。然后我使用 System.DirectoryServices 和 IIS ADSI 提供程序来创建一个新站点。

我有以下例程(用明文字符串交换了一些值以获得更好的可读性):

            if (impersonationSvc.ImpersonateValidUser("Administrator@SRV6", String.Empty, "PASSWORD))
            


            string metabasePath = "IIS://" + server.ComputerName + "/W3SVC";
            DirectoryEntry w3svc = new DirectoryEntry(metabasePath, "Administrator", "PASSWORD");

            string serverBindings = ":80:" + site.HostName;
            string homeDirectory = server.WWWRootNetworkPath + "\\" + site.FolderName;


            object[] newsite = new object[]  site.Name, new object[]  serverBindings , homeDirectory ;

            object websiteId = (object)w3svc.Invoke("CreateNewSite", newsite);
            int id = (int)websiteId;

            impersonationSvc.UndoImpersonation();
        

当我使用托管 Web 应用程序的服务器 (SRV6) 时,此例程有效。新网站已创建。

例如,如果我使用 SRV5,我们网络上的另一台服务器(没有域),ImpersonateValidUser 工作,DirectoryEntry 创建,但 w3svc.Invoke 失败并出现以下错误:

[COMException (0x80070005): 拒绝访问]

System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +377678
System.DirectoryServices.DirectoryEntry.Bind() +36
System.DirectoryServices.DirectoryEntry.get_NativeObject() +31
System.DirectoryServices.DirectoryEntry.Invoke(String methodName, Object[] args) +53

...

有人知道我怎么解决这个问题吗?

【问题讨论】:

【参考方案1】:

在这种情况下,您不能使用模拟。您正在模拟的帐户需要在本地计算机上具有登录权限。

如果您的网络服务器不是域的一部分,我认为 Tant102 的网络服务理念是您唯一的出路。

【讨论】:

【参考方案2】:

我会查看 SRV5 的事件日志,以检查当您连接到该服务器时使用了哪些权限。您可能需要更改您的组策略以在安全日志中记录故障。

在您的服务器上设置网络服务听起来更容易,最好是通过登录名和/或 IP 限制进行保护,以执行此类操作。

【讨论】:

以上是关于ADSI/IIS 管理和 ASP.NET 模拟的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET - 模拟不起作用

使用 ASP.NET 表单身份验证的用户模拟

Asp.net Core 2.0 web api 基础框架 详解

是否可以通过 c# ASP.net Web 应用程序中的代码来模拟唯一用户的体验?

IIS 7.5、ASP.NET、模拟和访问 C:\Windows\Temp

使用 ASP.NET 和 TFS api 的直通(模拟)身份验证