您可以从PowerShell创建匿名访问Windows共享吗?

时间:2017-01-06 22:22:30

标签: windows powershell cmd share

Windows难以使用匿名访问创建网络共享(换句话说,共享托管计算机不知道的用户可以访问)。 net share ShareName=C:\DesiredShareSource /GRANT:EVERYONE,FULL可以访问Everyone,但不包括匿名访问(例如,非域加入的用户,没有提示凭据)。

我知道有一种方法可以通过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

2 个答案:

答案 0 :(得分:2)

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

Windows Server 2012 R2及更新版

要创建具有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)' 。以下是将其更改为与上述权限相同的权限的代码。

(get-smbshare -Name Test).SecurityDescriptor

要获取SecurityDescriptor字符串,请按照您的意愿创建共享测试并运行以下命令。

net share

向后兼容(NET SHARE)

这也可以使用net share test=D:\test /GRANT:"ANONYMOUS LOGON,FULL" /GRANT:"Everyone,FULL"

完成
using (var connection = DatabaseOperations.CreateConnection(ConnectString))
    {
        connection.Open();
        var transaction = connection.BeginTransaction();
        try
        {
            var dt = new DataTable();
            dt.Columns.Add("EmployeeID");
            dt.Columns.Add("Name"); 
            for (var i = 1; i < 1000000; i++)    
                dt.Rows.Add(i + 1, "Name " + i + 1);

            using (var sqlBulk = new SqlBulkCopy(connection,SqlBulkCopyOptions.Default, transaction as SqlTransaction))
            {
                sqlBulk.DestinationTableName = "Employees";
                sqlBulk.BatchSize = 100000;
                sqlBulk.WriteToServer(dt);
            }
        }
        catch (SqlException ex)
        {
            transaction.Rollback();
            throw new CustomException("SQL Exception", ex);
        }
        catch (Exception e)
        {
            transaction.Rollback();
            throw;
        }
        transaction.Commit();
    }

答案 1 :(得分: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-0S-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 statusEnabled
    • Network access: Let Everyone permissions apply to anonymous usersEnabled
    • Network access: Shares that can be accessed anonymously sharename
  4. 请注意,我没有必要更改设置Network access: Restrict anonymous access to Named Pipes and Shares以启用从Windows 7到Server 2012 R2上的匿名共享的匿名访问,但我确实必须为 Everyone添加NTFS权限 group。

    $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时,结果就是...麻烦,所以我不推荐它。但是,在域环境中,您可以通过组策略部署本地安全策略设置。