如何处理 SMB 共享名称的大小写敏感问题?

如何处理 SMB 共享名称的大小写敏感问题?
\\host.example.com\ShareName\Tail\Components
  |______________| |_______| |_____________|
        host         share        tail

我可以在 UNC 路径的尾部组件上找到大量资源,并且我假设主机组件遵循区分大小写的 DNS 规则,但是共享名称呢?

当您只连接到主机而不指定共享名称时,您所连接的实现可以向您发送共享的正确大小写。当您直接连接到共享时,如何处理大小写?

我在 Samba 手册中只看到一行说明“部分和参数名称不区分大小写”,但实际上并没有说明(部分名称用于创建共享,但与该共享的连接可能以不同的方式处理)。我在 Windows 共享文件夹帮助中没有看到有关大小写的说明。

这是否意味着共享名称实际上不区分大小写,并且没有人想过要明确说明这一点,或者有人可以给我提供相关文档吗?


编辑:

根据Microsoft 的 SMB2 规范

服务器必须按照 [MS-DTYP] 第 2.2.49 节中的规定解析缓冲区字段,以提取主机名和共享名组件。如果缓冲区字段不是第 2.2.9 节中指定的格式,则服务器必须使用 STATUS_INVALID_PARAMETER 使请求失败。否则,服务器必须提供从请求消息解析的元组 <hostname, sharename> 来调用 [MS-SRVS] 第 3.1.6.8 节中指定的事件,通过解析服务器别名和评估共享范围来规范化主机名。服务器必须使用 <normalized hostname, sharename> 在 ShareList 中查找共享。如果未找到具有匹配共享名称和服务器名称的共享,则服务器必须以 STATUS_BAD_NETWORK_NAME 拒绝该请求。

因此,共享名称没有标准化,而且我找不到任何内容表明兼容的实现必须不区分大小写地执行匹配。

我理想情况下是在寻找一些文档或答案,这些答案来自那些除了在 Windows 和 Samba 上讨论他们的发现之外还在其他多种实现上测试过此问题的人的回答。

答案1

实际规范规定,服务器操作员可以选择是否对请求使用区分大小写。Windows 默认为“IsCaseInsensitive=TRUE”,但其他实现可以选择不同的方式。

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/a64e55aa-1152-48e4-8206-edd96444e7f7

IsCaseInsensitive
TRUE
Windows-based SMB2 servers always handle path names as case-insensitive.

2.1.5.1 服务器请求打开文件

IsCaseInsensitive:布尔值。TRUE 表示在此 Open 上下文中执行的字符串比较不区分大小写;否则,它们区分大小写。

答案2

SMB 共享名不区分大小写。您可以尝试创建两个名称相同但大小写不同的共享来确认这一点。系统不允许这样做。

相关内容