PowerShell v3管理共享/NNTFS权限



背景:

我一直在尝试编写PowerShell脚本来添加/删除文件夹的权限。这个脚本是一系列脚本中的第5个脚本,这些脚本一个接一个地开始。脚本具有共享变量等。

脚本如下:

  1. 创建AD组对象
  2. 创建AD用户对象(或两个、三个、四个、,等等)
  3. 在应用程序服务器上创建用户文件夹并创建数据文件服务器上的文件夹(由所有关联用户共享)
  4. 此脚本将更改权限应该是

我正在尝试执行以下操作(NTFS):

  1. 用户文件夹-SYSTEM(完整)、Administrator(完整),Domain Admin(完全),AD Group(修改),USERS(修改)
  2. 数据文件夹-SYSTEM(完整)、Administrator(完全)、Domain Admin(完整),AD Group(修改)、NETWORK SERVICE(完整)和USERS(READ)

我正在尝试执行以下操作(共享):

  1. 数据文件夹-SYSTEM(完整)、Administrator(完整),Domain Admin(完整)和AD Group(修改)

以下是我一直在尝试使用的内容:

如果我在本地使用这种方法,效果会很好。它共享一个文件夹,如"C:测试",没有问题。但我无法让它在服务器上运行(不确定是因为我使用了变量还是什么)。在这种情况下,只有数据文件夹是我试图更改的权限。

# Configures the folders to have necessary permissions
# Set the folder path
# gname, sharedcomputername, and clientname all come from values in previous script
$Server = $ShareComputerName
$Share = "d$Tran"+$ClientName 
$FullSharePath = "$Server"+"$Share"
# Assign the permissions
net share $gname=$FullSharePath '/Grant:Administrators,FULL' '/Grant:DomainAccount,CHANGE'

服务器操作系统为2008 R2和PowerShell v3。DC/AD是2012年


2015年4月2日编辑-这不是一个重复的问题(我想有人这样标记了它)。。。请参阅下面我对用户的回复。


2015年4月6日编辑-我是如何完成我想要做的…

以下是我最终所做的,感谢Rich Chiavaroli的指针(指向其他线程/源代码)。

为了处理NTFS权限,我做了以下操作:

# Setting NTFS directory permissions
$acl = Get-Acl "\$servernamefolderpath"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("domainuser or usergroup","Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Users","Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
Set-Acl "\$servernamefolderpath" $acl

为了处理共享权限,我做了以下操作:

# Configures the folders to have necessary permissions
# Set the folder path
$Server = Enter your server name here (ex: \test)
$Share = Enter the path to the folder here (ex: C:Test)
# Assign the Share Permissions
# User Name/Group to give permissions to
$trustee = ([wmiclass]'Win32_trustee').psbase.CreateInstance()
$trustee.Domain = "Corp"
$trustee.Name = "$gname"
$trustee2 = ([wmiclass]'Win32_trustee').psbase.CreateInstance()
$trustee2.Domain = "Domain"
$trustee2.Name = "Domain Admins"
# Access mask values
$fullcontrol = 2032127
$change = 1245631
$read = 1179785
# Create access-list
$ace = ([wmiclass]'Win32_ACE').psbase.CreateInstance()
$ace.AccessMask = $fullcontrol
$ace.AceFlags = 3
$ace.AceType = 0
$ace.Trustee = $trustee
$ace2 = ([wmiclass]'Win32_ACE').psbase.CreateInstance()
$ace2.AccessMask = $fullcontrol
$ace2.AceFlags = 3
$ace2.AceType = 0
$ace2.Trustee = $trustee2
# Security descriptor containing access
$sd = ([wmiclass]'Win32_SecurityDescriptor').psbase.CreateInstance()
$sd.ControlFlags = 4
$sd.DACL = $ace, $ace2
$sd.group = $trustee
$sd.owner = $trustee
$newShare = Get-WmiObject Win32_Share -List -ComputerName "$Server"
$newShare.create("$Share", "Name of the share", 0, 100, "", "", $sd)

问题是您使用的是NET SHARE,它只用于共享本地目录。您不能使用它来共享远程目录。您必须在远程系统上运行NET SHARE。不过也有几个选择。一种方法是使用PowerShell远程处理远程到服务器,然后运行您的NET SHARE命令。另一种方法是使用WMI远程创建共享。

使用远程处理应该是直接的,但WMI有点棘手。问题在于权限。这里有几个链接可以查看。

一种方法。

另一种没有权限的方法。

Win32_Share的Create方法上的文档。-您可以将其与第二个链接结合使用来添加安全描述符。

最新更新