5

我有一个运行 IIS 6 的 Windows 2003 服务器,并且有一些脚本可以自动设置和创建网站。他们没有在我正在调试的新服务器上工作(他们已经在其他 3 台 W2K3 服务器上愉快地工作了)。该问题似乎归结为 IIS 提供程序上的 WMI 安全性。下面的 ASP 代码代表了问题(尽管它不是导致问题的原始代码 - 这是问题的简化演示)。

Set wmiProvider = GetObject("winmgmts:\\.\root\MicrosoftIISv2")
If wmiProvider is Nothing Then
Response.Write "Failed to get WMI provider MicrosoftIISv2<br>"
End If

Response.Write "Querying for IISWebService...<br>"
Set colItems = wmiProvider.ExecQuery("Select * From IISWebServer",,0)
Response.Write "Error: " & Hex(Err.Number) & " (" & Err.Description & ")<br>"

如果我在浏览器中运行它,我会在 ExecQuery 调用后收到拒绝访问错误。我已经从 Root 分支一直为 IUSR_ 用户设置了 WMI 访问权限。其实我可以很开心地使用CIMV2提供者查询IP地址信息。如果我将 IUSR 用户放在机器管理员组中,一切正常,但我真的不想这样做。

这一定是 DCOM/WMI 安全问题,但我不知道还有什么问题。任何人都可以解释一下吗?

4

3 回答 3

2

在阅读了 G. Stoynev 的评论后,询问是否在 Windows 日志中记录了任何事件,我检查了我试图通过 WMI 远程访问 IIS 的服务器上的事件日志,你瞧,我发现了一个带有以下文本的事件:

对 root\WebAdministration 命名空间的访问被拒绝,因为命名空间被标记为 RequiresEncryption,但脚本或应用程序尝试使用低于 Pkt_Privacy 的身份验证级别连接到此命名空间。将身份验证级别更改为 Pkt_Privacy 并再次运行脚本或应用程序。

请参阅相关 SO 问题c# - "Access is denied" Exception with WMI的此答案中的代码。

这是我添加的一些示例 C# 代码,似乎可以为我解决此问题:

ConnectionOptions options = new ConnectionOptions();
options.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope managementScope = new ManagementScope(@"\\remote-server\root\WebAdministration", options);
// ...
于 2014-01-14T17:17:56.773 回答
0

不是 DCOM 问题,更多的是 WMI 安全和加密问题。尝试更改 GetObject 名字对象以包括模拟和 pktPrivacy,例如:

Set wmiProvider = GetObject("winmgmts:{impersonationLevel=impersonate;authenticationLevel=pktPrivacy}!\root\MicrosoftIISv2")

有关详细信息,请参阅以下 MS 文章:http: //msdn.microsoft.com/en-us/library/aa393618 (v=vs.85).aspx

于 2014-04-25T01:59:44.610 回答
0

如果这是您打算为自己或您的管理员运行的工具(而不是未经清洗的匿名群众),这是我过去使用的一种方式(YMMV):

  1. 在您的网站中设置一个新目录(例如 /SiteCreate)并将您的 WMI 脚本放在那里
  2. 配置具有适当权限的 Windows 用户(在这种情况下可能是管理员,但您应该使用与您的应用相关的任何内容)
  3. 关闭对您在步骤 1 中创建的目录匿名访问,然后将安全设置为仅允许您在步骤 2 中创建的用户访问(打开该目录的身份验证)

现在,当您在浏览器中导航到该目录时,您应该会收到登录提示。当您输入在第 2 步中创建的用户名/密码时,您的脚本将拥有执行 WMI 请求的适当权限。

于 2013-07-18T22:48:56.000 回答