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脚本时会发生这种情况。我得到一个例外,但共享成功安装: 但是,当我尝试从同一网络上的另一个盒子连接到共享时,仍然会提示我输入用户名和密码,如下所示:
同样,我希望从命令行设置匿名访问(无用户名和密码)。
以下是我在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
答案 0 :(得分:2)
所有示例都会创建一个名为D:\test
的共享,映射到路径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)'
。以下是将其更改为与上述权限相同的权限的代码。
(get-smbshare -Name Test).SecurityDescriptor
要获取SecurityDescriptor字符串,请按照您的意愿创建共享测试并运行以下命令。
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-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)进行三次更改:
secpol.msc
。Accounts: Guest account status
→Enabled
Network access: Let Everyone permissions apply to anonymous users
→Enabled
Network access: Shares that can be accessed anonymously
→ sharename 请注意,我没有必要更改设置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
时,结果就是...麻烦,所以我不推荐它。但是,在域环境中,您可以通过组策略部署本地安全策略设置。