web-dev-qa-db-ja.com

Windows、特にACLでは、URL予約は実際にどのように機能しますか?

私は、複数のWCFサービスを含むプロジェクトに取り組んでいる.NET開発者です。一部の自動テストはこれらのサービスをホストしようとしますが、管理者権限でテストを実行しないかどうかによって、これらのテストは次のエラーで失敗します。

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

残念ながら、たとえばlocalhost上のすべてへのアクセスを許可するために、ポートまたは相対URLの部分にワイルドカードを使用する方法(私が見つけることができる)はないようです。

したがって、私の質問:このACLとは一体何なのか、それをより簡単に操作するためにファイルまたは何かで見つけることができますか?

さらに良いこと:ローカルの管理者アカウントはデフォルトでアクセス権を持っているように見えるので、どういうわけか、この背後にあるシステムにシャットダウンして自分の作業を許可するように指示できますか?

3
MarioDS

各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クラスWin32_SecurityDescriptorHelperのヘルパーメソッドを使用して、バイナリSDをSDDL文字列に変換できます。

([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)
4
Simon Biber