Назад | Перейти на главную страницу

Как на самом деле работает резервирование 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, и могу ли я найти его в файле или чем-то еще, чтобы им было легче манипулировать?

Еще лучше: поскольку учетная запись локального администратора, похоже, имеет права доступа по умолчанию, могу ли я как-то сказать, какая система стоит за этим, чтобы просто заткнуться и позволить мне выполнять свою работу?

Каждый список управления доступом URL-адресов (ACL) резервирует часть пространства имен URL-адресов HTTP для определенной группы пользователей. Резервирование дает этим пользователям право создавать службы, которые прослушивают эту часть пространства имен. Видеть https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-http-and-https для получения дополнительной информации о резервировании пространства имен.

Вы можете найти и управлять всеми определенными списками ACL URL в реестре.

Если вы добавили ACL URL с помощью команды:

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

Значение раздела реестра - это двоичный дескриптор безопасности. Вы можете преобразовать двоичный SD в строку SDDL с помощью вспомогательного метода класса WMI 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)