Windows

URL 保留如何在 Windows 中實際工作,尤其是 ACL?

  • August 31, 2017

我是一名 .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) 為特定的使用者組保留一部分 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)

引用自:https://serverfault.com/questions/822207