Я разработчик .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)