【问题标题】:Can you create an anonymous-access Windows share all from PowerShell?你能从 PowerShell 创建一个匿名访问的 Windows 共享吗?
【发布时间】:2017-05-21 18:48:14
【问题描述】:

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 脚本时发生的情况。我得到一个例外,但共享成功安装: 但是,当我尝试从同一网络上的另一个盒子连接到共享时,仍会提示我输入用户名和密码,如下所示:

再次,我希望全部从命令行设置匿名访问(没有用户名和密码)。

这是我在 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 但"ANONYMOUS LOGON" 必须是本地化字符串 - 它将在LookupAccountName 函数中使用。但是,如果您只授予匿名登录“ - 普通用户在这里没有权限,所以也需要添加每个人 - /GRANT:Everyone,FULL
  • 当我输入net SHARE ShareName=C:\DesiredShareSource /GRANT:"ANONYMOUS LOGON",FULL 时,系统仍然提示我输入密码。此外,它要求我在两个 GRANT 语句中的逗号前加一个 `。当我从其他框访问共享时,是否仍提示我输入凭据?
  • @RbMm 这就是我从这里开始的方式。我想通过 PowerShell 完成这一切。

标签: windows powershell cmd share


【解决方案1】:

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

Windows Server 2012 R2 及更新版本

要创建与everyone 的共享并拥有Full 访问权限,这是命令

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"

【讨论】:

  • 我相信“所有人”不包含匿名访问。具体来说,当主机不知道尝试访问的用户时,它就无法验证该用户。
  • 我没有在 PowerShell 上工作的 New-SmbShare。是否需要特定版本?不幸的是,我想要一个向后兼容的解决方案。
  • 根据文档,它是在 Windows Server 2012 R2 中添加的。在此版本的 Windows PowerShell 之前,技术上没有办法做到这一点。我可以检查net share 是否可以做同样的事情。给我一点……
  • 我已经用这两个选项更新了答案。我删除了访客权限,因为该帐户通常被禁用。
  • 我仍然收到使用 net share 命令的用户名和密码提示。发生这种情况有什么原因吗?
【解决方案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 组的 well-known SIDs。

需要将每个 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. 更改以下设置:
    • Accounts: Guest account status → Enabled
    • Network access: Let Everyone permissions apply to anonymous users → Enabled
    • Network access: Shares that can be accessed anonymously → 共享名

请注意,我不必更改设置 Network access: Restrict anonymous access to Named Pipes and Shares 以启用从 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

我不知道使用脚本更改策略的方法。你也许可以通过wrapping secedit in PowerShell 做点什么,但每当我不得不处理secedit 时,结果证明是......很麻烦,所以我不推荐它。不过,在域环境中,您可以通过组策略部署本地安全策略设置。

【讨论】:

  • 不幸的是,这给了我Exception setting "DACL": "Unable to cast object of type 'System.Management.Automation.PSObject' to type 'System.Management.ManagementBaseObject'." 它成功地创建了共享,但它再次是非匿名的,因为它需要凭据才能被其他框访问。
  • @AlwaysQuestioning 该代码在我测试时运行良好。请提供证据(显示您的代码和确切的错误消息,最好在您的问题中)。
  • 我用您要求的屏幕截图更新了问题。
  • 我使用了您帖子中的确切代码,仅更改了路径和名称变量。
  • 异常消失了,但是当我尝试从另一个盒子的 PowerShell 连接到共享时,再次提示我输入用户名和密码。这是我试图解决的唯一问题。当您执行net use \\boxname\sharename 时,您真的没有提示输入凭据吗?
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
相关资源
最近更新 更多