URL 预留在 Windows 中实际上是如何工作的,特别是 ACL?

URL 预留在 Windows 中实际上是如何工作的,特别是 ACL?

我是一名 .NET 开发人员,正在开发一个包含多个 WCF 服务的项目。一些自动化测试尝试托管这些服务,但根据我是否未使用管理权限运行测试,这些测试会失败并出现以下错误:

System.ServiceModel.AddressAccessDeniedException : HTTP could not register 
URL http://+:45566/SomeService/. Your process does not have access rights to this namespace 
(see http://go.microsoft.com/fwlink/?LinkId=70353 for details).
  ----> System.Net.HttpListenerException : Access is denied

netsh按照提供的链接,我似乎必须使用以下命令授予自己(普通域用户)某种访问权限:

netsh http add urlacl url=http://+:45566/SomeService user=DOMAIN\me

不幸的是,似乎没有办法(我找不到)使用通配符作为端口或相对 URL 部分,以便授予自己访问本地主机上所有内容的权限。

因此我的问题是:这个 ACL 到底是什么,我可以在文件或其他地方找到它以便更轻松地操作它吗?

甚至更好的是:由于本地管理员帐户似乎默认具有访问权限,我是否可以以某种方式告诉背后的系统闭嘴并让我做我的工作?

答案1

每个 URL 访问控制列表 (ACL) 都会为特定用户组保留一部分 HTTP URL 命名空间。保留使这些用户有权创建侦听该部分命名空间的服务。请参阅https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-http-and-https有关命名空间保留的更多信息。

您可以在注册表中查找并操作所有已定义的 URL ACL。

如果您已使用以下命令添加了 URL ACL:

netsh http add urlacl url=http://+:45566/SomeService user=DOMAIN\me

您可以使用以下命令查询此 URL ACL 的注册表项:

reg query HKLM\SYSTEM\ControlSet001\Services\HTTP\Parameters\UrlAclInfo
    /v 'http://+:45566/SomeService/'

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\HTTP\Parameters\UrlAclInfo
http://+:45566/SomeService/
REG_BINARY
010004800000000000000000000000001400000002002C000100000000002400000000200105
00000000000515000000B262BFF6EAC6403B59D621B1360C0000

注册表项的值是二进制安全描述符。您可以使用 WMI 类的辅助方法将二进制 SD 转换为 SDDL 字符串Win32_SecurityDescriptorHelper

([wmiclass]"Win32_SecurityDescriptorHelper").BinarySDToSDDL(
[System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary]::Parse(
"010004800000000000000000000000001400000002002C00010000000000240000
000020010500000000000515000000B262BFF6EAC6403B59D621B1360C0000")
.Value).SDDL

D:(A;;GX;;;S-1-5-21-4139737778-994100970-2971784793-3126)

并将 SDDL 字符串转换回二进制 SD:

(New-Object System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary
(,([wmiclass]"Win32_SecurityDescriptorHelper").SDDLToBinarySD(
"D:(A;;GX;;;S-1-5-21-4139737778-994100970-2971784793-3126)").BinarySD)).ToString()

010004800000000000000000000000001400000002002C000100000000002400000000200105000000
00000515000000B262BFF6EAC6403B59D621B1360C0000

您可以向注册表添加另一个 URL ACL:

reg add HKLM\SYSTEM\ControlSet001\Services\HTTP\Parameters\UrlAclInfo \
    /v 'http://+:45567/AnotherService/' /t REG_BINARY \
    /d 010004800000000000000000000000001400000002002C00010000000000 \
    240000000020010500000000000515000000B262BFF6EAC6403B59D621B1360C0000

并且可以通过netsh命令看到:

netsh http show urlacl 'http://+:45567/AnotherService/'

URL Reservations:
-----------------

Reserved URL            : http://+:45567/AnotherService/
    User: DOMAIN\me
        Listen: Yes
        Delegate: No
        SDDL: D:(A;;GX;;;S-1-5-21-4139737778-994100970-2971784793-3126)

相关内容