你能否使用PowerShell创建一个匿名访问的Windows共享?

4
Windows很难创建一个具有匿名访问权限的网络共享(换句话说,主机不知道哪些用户可以访问)。net share ShareName=C:\DesiredShareSource /GRANT:EVERYONE,FULL允许所有人访问,但这不包括匿名访问(例如,未加入域的用户,而无需提示凭据)。
我知道有一种方法可以从GUI中完成此操作(https://serverfault.com/questions/272409/setting-up-an-anonymous-windows-server-2008-network-share),但是否有一种仅使用PowerShell更改安全策略和创建匿名网络共享的方法? 编辑 这是我运行Ansgar Wiechers发布的WMI脚本时出现的情况。我会收到一个异常,但共享仍然成功挂载: share mounting with exception 然而,当我尝试从同一网络上的另一个计算机连接到该共享时,仍会提示我输入用户名和密码,如下所示:

still requiring username and password

我希望您能通过命令行设置匿名访问(无需用户名和密码)。这是我在Win7系统上使用testingAnonShare.ps1进行测试的确切代码:

$path        = 'C:\Users\<REDACTED>\Desktop\Attempt'
$name        = 'testinganon'
$description = 'share description'

function Get-Trustee($sid) {
  $trustee = ([wmiclass]'Win32_Trustee').CreateInstance()
  $trustee.SID = ([wmi]"Win32_SID.SID='$sid'").BinaryRepresentation
  return $trustee
}

function New-FullAce($sid) {
  $ace = ([wmiclass]'Win32_ACE').CreateInstance()
  $ace.AccessMask = 2032127  # full control
  $ace.AceFlags   = 3        # container inherit + object inherit
  $ace.AceType    = 0        # access allowed
  $ace.Trustee    = Get-Trustee $sid
  return $ace
}

$sd = ([wmiclass]'Win32_SecurityDescriptor').CreateInstance()
$sd.ControlFlags = 4
$sd.DACL         = (New-FullAce 'S-1-1-0'),
                   (New-FullAce 'S-1-5-7')

$wmi = Get-WmiObject Win32_Share -List
$wmi.Create($path, $name, 0, $null, $description, '', $sd) | Out-Null

net.exe SHARE ShareName=C:\DesiredShareSource /GRANT:"ANONYMOUS LOGON",FULL but in place "ANONYMOUS LOGON" must be localized string - it will be used in LookupAccountName function. however if you grant only ANONYMOUS LOGON" - usual users will no permissions here, so need add everyone too - /GRANT:Everyone,FULL - RbMm
当我执行net SHARE ShareName=C:\DesiredShareSource /GRANT:"ANONYMOUS LOGON",FULL时,仍然会提示我输入密码。此外,在两个GRANT语句中的逗号之前需要加上“`”。是否有原因导致其他计算机访问共享时仍然提示我输入凭据? - AlwaysQuestioning
http://www.howtogeek.com/126214/how-to-create-network-file-shares-with-no-passwords-in-windows-8/ - RbMm
@RbMm 这就是我在这里开始的方式。我想要全部使用 PowerShell 完成这个。 - AlwaysQuestioning
同样的问题。似乎没有人有PowerShell的解决方案。 - jrbe228
2个回答

4
所有示例都创建了一个名为 test 的共享,映射到路径 D:\ test ,授予匿名用户和每个人完全访问权限。

Windows Server 2012 R2及更高版本

要创建一个具有完全访问权限的everyone共享,使用以下命令:
New-SmbShare -Name 'test' -path 'D:\test' -FullAccess 'ANONYMOUS LOGON','Everyone'

将现有共享更新为具有相同权限的操作稍微复杂一些。首先,假设共享名称为test。以下是更改其权限与上述权限相同的代码。

Get-SmbShare -Name test | 
    Set-SmbShare -SecurityDescriptor 'O:BAG:DUD:(A;;FA;;;AN)(A;;FA;;;WD)'

要获取SecurityDescriptor字符串,请创建一个与您想要的共享测试相似的共享,然后运行以下命令。
(get-smbshare -Name Test).SecurityDescriptor

向后兼容(NET SHARE)

这也可以使用net share来完成。

net share test=D:\test /GRANT:"ANONYMOUS LOGON,FULL" /GRANT:"Everyone,FULL"

1
我相信“Everyone”不包括匿名访问。具体来说,当托管机器不知道尝试访问的用户时,它就没有验证该用户的手段。 - AlwaysQuestioning
我在PowerShell上无法使用New-SmbShare。是否需要特定版本?不幸的是,我需要一个向后兼容的解决方案。 - AlwaysQuestioning
根据文档,此功能是在Windows Server 2012 R2中添加的。在此版本之前,PowerShell技术上没有这样的方法来实现。我可以检查一下net share是否能够完成同样的事情。请稍等片刻... - TravisEz13
我已更新答案,提供了两个选项。由于该帐户通常被禁用,我删除了访客权限。 - TravisEz13
我在使用 net share 命令时仍然被提示输入用户名和密码。这可能是由于什么原因引起的呢? - AlwaysQuestioning
我认为为什么客户端仍然提示凭据是需要向ServerFault询问的问题。浏览一些相关的问题似乎表明,Windows中默认的客户端身份验证设置不允许匿名连接,但我没有找到确切的答案。 - TravisEz13

2
除了 New-SmbShare(适用于 Windows Server 2012 或更新版本)和 net share,您还可以使用 WMI 来创建网络共享。
$path        = 'C:\DesiredShareSource'
$name        = 'sharename'
$description = 'share description'

function Get-Trustee($sid) {
  $trustee = ([wmiclass]'Win32_Trustee').CreateInstance()
  $trustee.SID = ([wmi]"Win32_SID.SID='$sid'").BinaryRepresentation
  return $trustee
}

function New-FullAce($sid) {
  $ace = ([wmiclass]'Win32_ACE').CreateInstance()
  $ace.AccessMask = 2032127  # full control
  $ace.AceFlags   = 3        # container inherit + object inherit
  $ace.AceType    = 0        # access allowed
  $ace.Trustee    = Get-Trustee $sid
  return $ace
}

$sd = ([wmiclass]'Win32_SecurityDescriptor').CreateInstance()
$sd.ControlFlags = 4
$sd.DACL += (New-FullAce 'S-1-1-0').PSObject.BaseObject
$sd.DACL += (New-FullAce 'S-1-5-7').PSObject.BaseObject

$wmi = Get-WmiObject Win32_Share -List
$wmi.Create($path, $name, 0, $null, $description, '', $sd) | Out-Null

"S-1-1-0"和"S-1-5-7"分别是“Everyone”组和“Anonymous”组的众所周知的SID
将每个ACE单独附加到“DACL”属性是使代码与PowerShell v2兼容所必需的。在更近期的版本中,您可以将ACE分配为数组,并且您也不需要解开基本对象。
$sd.DACL = (New-FullAce 'S-1-1-0'), (New-FullAce 'S-1-5-7')

要实际启用共享的匿名访问,您还需要对本地安全策略进行三个更改(source):
  1. 启动 secpol.msc
  2. 导航至 安全设置 → 本地策略 → 安全选项
  3. 更改以下设置:
    • 帐户:来宾帐户状态已启用
    • 网络访问:允许每个人权限应用于匿名用户已启用
    • 网络访问:可以匿名访问的共享共享名称

请注意,为了使 Windows 7 可以从 Server 2012 R2 上的匿名共享中进行匿名访问,我不必更改设置 网络访问:限制命名管道和共享的匿名访问,但我确实必须添加 Everyone 组的 NTFS 权限。

$acl = Get-Acl -Path 'C:\DesiredShareSource'
$ace = New-Object Security.AccessControl.FileSystemAccessRule(
  'Everyone', 'ReadAndExecute', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
)
$acl.AddAccessRule($ace)
Get-Acl -Path 'C:\DesiredShareSource' -AclObject $acl

我不知道如何使用脚本进行政策更改。您可以尝试通过在PowerShell中包装 secedit 来实现一些操作,但是每当我需要处理 secedit 时,它总是令人烦恼,所以我不建议这样做。在域环境中,您可以通过组策略部署本地安全策略设置。

不幸的是,这给了我Exception setting "DACL": "Unable to cast object of type 'System.Management.Automation.PSObject' to type 'System.Management.ManagementBaseObject'."。它成功地创建了共享,但再次非匿名,需要凭据才能被其他框访问。 - AlwaysQuestioning
@AlwaysQuestioning 当我测试了代码后,它完全可以正常运行。请提供证据(在你的问题中展示你的代码和具体的错误信息)。 - Ansgar Wiechers
我已经更新了问题,并附上了你要求的截图。 - AlwaysQuestioning
我使用了你的帖子中的完全相同的代码,只更改了路径和名称变量。 - AlwaysQuestioning
异常已经消失了,但是当我尝试从另一个框的PowerShell连接到共享时,我又被提示输入用户名和密码。这是我要解决的唯一问题。当您执行net use \\boxname\sharename时,您真的不需要输入凭据吗? - AlwaysQuestioning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接