PowerShell v3 管理 Share/NTFS 权限

PowerShell v3 Managing Share/NTFS Permissions

背景:

我一直在尝试编写一个 PowerShell 脚本来获得文件夹的 add/remove 权限。该脚本是一系列脚本中的第 5 个脚本。脚本有共享变量等

脚本如下:

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

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

  1. 用户文件夹 - 系统(完整)、管理员(完整)、域管理员(完整)、AD 组(修改)、用户(修改)
  2. 数据文件夹 - 系统(完整)、管理员(完整)、域管理员(完整)、AD 组(修改)、网络服务(完整)、用户(读取)

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

  1. 数据文件夹 - 系统(完整)、管理员(完整)、域管理员(完整)、AD 组(修改)

这是我一直在尝试使用的东西:

如果我在本地使用此方法,效果很好。它可以毫无问题地共享 "C:Test" 等文件夹。但是我无法针对服务器将其发送到 运行(不确定是不是因为我正在使用变量或其他原因)。在这种情况下,只有数据文件夹是我要更改的权限。

# 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:Domain\Account,CHANGE'

服务器 OS 是 2008 R2 和 PowerShell v3。 DC/AD 虽然是 2012 年。


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

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

使用 Remoting 应该很简单,但 WMI 有点棘手。问题是权限。这里有几个 link 值得一看。

One approach.

Another approach without permissions.

Docs on the Create method for Win32_Share. - 您可以将其与第二个 link 结合使用以添加安全描述符。


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

感谢 Rich Chiavaroli 的指点(指向其他 threads/sources),这就是我最终所做的。

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

# Setting NTFS directory permissions

$acl = Get-Acl "\$servername\folderpath"

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("domain\user 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 "\$servername\folderpath" $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)