返回

非域设备访问共享文件夹:问题与最佳解决方案

windows

非域设备访问共享文件夹的问题与解决

局域网内,允许非域设备访问域内共享文件夹是常见的需求,尤其是在需要公共只读访问时。用户尝试访问时遇到凭据要求是经常出现的问题。这里,我们将探讨问题的成因,并提供可行的解决方案。

共享权限和NTFS权限

最常见的错误是权限配置不足。要允许非域设备访问,需同时调整共享权限和 NTFS 文件系统权限。仅设置其中一个往往会导致访问问题。

  • 解决方案一:配置共享和 NTFS 权限

    • 原理: 共享权限控制网络访问级别,而 NTFS 权限控制文件系统的访问级别。两个权限集合都必须允许“Everyone”访问,才能确保匿名用户无需凭据即可访问。
    • 操作步骤:
      1. 找到共享文件夹。
      2. 右键单击该文件夹,选择 “属性”。
      3. 切换到 “共享” 选项卡,单击 “高级共享” 按钮。
      4. 单击 “权限” 按钮。添加 “Everyone” 用户,并赋予其 “读取” 权限。点击 “应用” 然后点击 “确定” 关闭当前窗口。
      5. 在“属性”窗口,选择“安全”标签。
      6. 单击“编辑”按钮。
      7. 添加 “Everyone” 用户,并赋予其 “读取” 权限。点击“确定”。
    • 注意:
      • 权限设置需要同步生效。更改权限后,可尝试关闭并重新打开文件资源管理器,检查更改是否生效。
      • 共享文件夹路径与网络位置(如 \\SVRTEST\commun)的命名保持一致。
  • 代码示例 (PowerShell):

    # 假设 $SharePath 是共享文件夹的完整路径
    $SharePath = "C:\Share\Folder"
    $ShareName = "commun"
    # 创建共享,并授予 Everyone 读取权限
    New-SMBShare -Name $ShareName -Path $SharePath -ReadAccess Everyone
    
    # 赋予Everyone对 NTFS 文件系统 读取权限
    $Acl = Get-Acl -Path $SharePath
    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone", "Read", "ContainerInherit, ObjectInherit", "None", "Allow")
    $Acl.AddAccessRule($AccessRule)
    Set-Acl -Path $SharePath -AclObject $Acl
    
    Write-Host "成功为文件夹 '$SharePath' 配置匿名访问。"
    
    • 这段脚本做了两件事:一是使用 New-SMBShare 创建一个新的共享,二是使用 ACL(Access Control List)为 Everyone 授予读取 NTFS 文件系统权限。
    • 将脚本中 $SharePath 的值改为你需要共享的文件夹的完整路径, 将 $ShareName 改成你的共享名称。

网络访问设置

除了权限之外,某些网络设置也可能阻止非域设备访问。特别是,匿名访问的配置非常关键。

  • 解决方案二:检查并调整网络访问策略

    • 原理: Windows 操作系统通常会阻止未经身份验证的网络访问。要允许非域设备匿名访问,需要启用某些特定的网络策略。
    • 操作步骤:
      1. 打开“本地组策略编辑器”(运行gpedit.msc)。
      2. 导航至 “计算机配置” > “Windows 设置” > “安全设置” > “本地策略” > “安全选项”。
      3. 找到“网络访问:让匿名 SID/名称转换”策略。双击该策略,选择 “已启用”。
      4. 找到“网络访问:可匿名访问的共享”策略。 双击该策略,将你需要匿名访问的共享名(例如 \\SVRTEST\commun )添加进去。
      5. 找到“网络访问:匿名访问的管道和共享”策略,确保其设置为允许。
      6. 执行 gpupdate /force 命令使组策略生效。
    • 注意: 此处的更改会影响系统整体的网络安全性,请在仔细评估安全风险后再进行操作。
  • 命令行操作 (powershell):

    # 开启“网络访问:让匿名 SID/名称转换”
    Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "AllowAnonymousAccess" -Value 1
    
    # 添加可匿名访问的共享名称
    $ShareName = "\\SVRTEST\commun" #修改成实际的共享名称
    $Existing = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" -Name "NullSessionShares"
    if($Existing.NullSessionShares){
     $NullSessionShares = ($Existing.NullSessionShares).split(",") |  where {$_}
      if ($NullSessionShares -notcontains $ShareName){
      $New = $NullSessionShares + $ShareName
       Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" -Name "NullSessionShares" -value ($New -join ",")
    
      }
    
    } else {
       Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" -Name "NullSessionShares" -value  $ShareName
    
    }
    
    

添加 "Everyone" 访问网络的权限, 如果这个策略是没开启的

$acl = Get-Acl -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
$rule = New-Object System.Security.AccessControl.RegistryAccessRule("Everyone","Read", 'None','None','Allow' )

  if(!$acl.Access | where  {$_.IdentityReference -like "*Everyone*" } )
      {$acl.AddAccessRule($rule) ; Set-Acl -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -AclObject $acl;}


Write-Host "网络匿名访问策略已修改."
#强制组策略更新
gpupdate /force
```

禁用身份验证请求

在某些情况下,操作系统仍会尝试强制进行身份验证。以下是一些可能导致此问题的其他设置检查。

  • 解决方案三: 禁用网络身份验证请求

    • 原理: 一些网络协议或安全策略会强制执行身份验证,即使共享配置允许匿名访问。 禁用相关选项可以绕过这种限制。
    • 操作步骤:
      1. 打开控制面板,选择 "网络和共享中心",单击当前的网络连接(比如"以太网"或 "wifi")。
      2. 单击“属性”按钮。
      3. 双击“Internet 协议版本 4(TCP/IPv4)”。
      4. 单击“高级”按钮,切换到 “WINS”选项卡,将 “启用 NetBIOS over TCP/IP” 复选框取消选中。
    • 注意: 修改这些设置可能会降低网络的安全性,务必在充分考虑其潜在风险后进行操作。
  • 命令行 (powershell):

```powershell
Get-NetAdapter | where {$_.ifIndex -ne "1" } | Disable-NetAdapterBinding -ComponentID ms_smb20
Get-NetAdapter | where {$_.ifIndex -ne "1"} | Set-NetIPInterface -Dhcp Disabled  
Set-NetIPInterface -InterfaceIndex ( Get-NetAdapter | where {$_.ifIndex -ne "1" }).ifIndex -AddressFamily IPv4 -DNSServer 0.0.0.0

write-host "已关闭 NetBios over TCP/IP"
```
* 这段代码的主要作用是禁止在特定接口上启用NetBios Over TCP/IP ( ms_smb20) , 并禁止 IPv4 的动态主机配置,然后把DNS 设置为空。请谨慎使用。

通过应用上述策略并调整权限,大部分非域设备应该可以无需凭据访问共享文件夹。 如果问题依旧存在,请仔细检查域的策略设置,可能存在冲突的配置规则,也可能是因为网络基础设施(比如防火墙)导致的网络访问阻塞。每个环境中可能有细微的差别,可能需要根据实际情况进行调整和故障排除。