SMB 访问掩码 - MAXIMUM_ALLOWED 与 GENERIC_ALL

问题描述 投票:0回答:1

根据这个关于SMB访问掩码的网站

  1. MAXIMUM_ALLOWED (0x02000000) - 该值表示客户端 正在请求以最高访问级别打开文件 客户有这个文件。如果没有授予客户端访问权限 在此文件上,服务器必须使打开失败 STATUS_ACCESS_DENIED。
  2. GENERIC_ALL (0x10000000) - 该值 表示对先前所有访问标志的请求 列出,MAXIMUM_ALLOWED 和 ACCESS_SYSTEM_SECURITY 除外。

我想知道使用这些的常见用例是什么。具体来说,如果我想获得最大程度的宽容,我不应该使用GENERIC_ALL吗?尽管它在描述中说它不包括 MAXIMUM_ALLOWED,但因为它包括前面提到的访问标志,因此 GENERIC_ALL 不会也包含 MAXIMUM_ALLOWED 吗?我有一种感觉,我错过了一些重要的概念。

winapi smb
1个回答
1
投票

好吧,从技术上讲,这是一个 Windows 问题,不确定为什么缺少该标签。这两个值的含义不同,但您也应该了解另一个相关概念:GENERIC_MAPPING

通用映射允许将通用访问掩码(用于读取、写入和所有)转换为特定于对象类型的访问掩码。顾名思义,这些是特定于对象类型的,即文件、管道、内存映射文件(“Section”)、互斥体(“Mutant”)等。您可以使用 Sysinternals 中的WinObj 来了解对象Windows 中可用的类型。但是,您只需要“意识到”它的存在即可,无需了解所有细节。仅当您使用 ACL 编辑器并且需要自己进行映射时,这才有意义。每个对象类型基本上都带有这样的映射。 获得对象的句柄后,您可以查询

OBJECT_BASIC_INFORMATION

(公共原型

此处
替代)以查看授予了何种级别的特定于对象类型访问权限。 获取句柄是进行访问检查的部分。这就是为什么传递或继承句柄有时会成为问题的原因。因此,如果 SD/DACL 说您没有所请求的访问级别或完全拒绝它,您甚至不会获得句柄,而是会看到

STATUS_ACCESS_DENIED

区别

现在我们已经解决了这个问题,让我们讨论一下

GENERIC_ALL

MAXIMUM_ALLOWED
之间的区别。
如果您注意上面的内容,您可能已经明白为什么它们在语义上不同。

MAXIMUM_ALLOWED

——顾名思义——请求您拥有的任何可用访问权限,

OBJECT_BASIC_INFORMATION::GrantedAccess
可以告诉您那是什么。如果您没有获得句柄而是看到
STATUS_ACCESS_DENIED
,则您根本无法访问该对象。

GENERIC_ALL

而是根据通用映射请求实际的

最大
访问权限。如果您没有请求的所有访问类型,它仍然会失败。 所以结论:

    MAXIMUM_ALLOWED
  • 将尝试为您提供具有您可以获得的
    任何
    访问级别的句柄(它也可以实际最大值)
  • GENERIC_ALL
  • 将尝试专门为您提供一个包含在此通用映射下的
    all
    访问类型的句柄... 如果其中任何 “all” 失败,您将不会获得句柄,而是会看到 STATUS_ACCESS_DENIED
    如果你想最大程度地宽容(按照我的理解),你会想使用:
  • MAXIMUM_ALLOWED
,因为(仍然通用但更具体)

GENERIC_ALL

在很多情况下甚至无法为你提供句柄
MAXIMUM_ALLOWED
 产生一个。
在最好的情况下——考虑到您的意图——您将被授予相当于 
GENERIC_ALL

的访问权限,而无需冒根本无法获取句柄的风险。

或者,您可以请求以您的
所需

访问级别(例如

GENERIC_ALL)访问该对象,并交错回退到GENERIC_WRITE

等,并作为最后的努力尝试
MAXIMUM_ALLOWED
。优点是,通过具体的所需访问掩码 - 
如果并且当您获得句柄时!
 - 您知道访问级别。使用 
MAXIMUM_ALLOWED,您仍然需要查询 OBJECT_BASIC_INFORMATION::GrantedAccess
 才能找到答案(或者尝试执行某个操作并获得 
STATUS_ACCESS_DENIED
ERROR_ACCESS_DENIED
)。

© www.soinside.com 2019 - 2024. All rights reserved.