文件夹权限设置

时间:2014-08-05 22:38:18

标签: powershell permissions directory

我执行以下命令在远程服务器中创建文件夹。我在设置新文件夹的权限(F驱动器中的团队)时收到了访问控制列表的错误消息,你能帮我解决这个问题。

$acl=Get-Acl "\\9018\F$\Team Data"$path=md "F:\Team" | set-acl -aclobject $acl
Invoke-Command -ComputerName (Get-Content C:\Server.txt) -ScriptBlock {
param($acl,$path)
} -ArgumentList $acl,$path

错误消息:

set-acl : The security identifier is not allowed to be the owner of this object.
At F:\folder.ps1:2 char:26
+ $path=md "F:\Team" | set-acl -aclobject $acl
+                          ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (F:\CDS Team:String) [Set-Acl], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.SetAclCommand

2 个答案:

答案 0 :(得分:0)

Get-ACL将获得对象的所有安全权限,因此当您将其传递给Set-ACL时,您可能会告诉它设置每个权限。

你可以尝试改变

$acl=Get-Acl "\9018\F$\Team Data"$path=md "F:\Team"

$acl=(Get-Item "\9018\F$\Team Data").GetAccessControl('Access') | Set-ACL -Path F:\Team

我使用下面的代码(我的虚拟服务器上的文件夹)使用下面的代码对其进行了测试(这很有用),所以也许您可以使用代码并使其正常工作:

$acl=(Get-Item \\core\testshare$).GetAccessControl('Access')
$acl | Set-Acl -Path \\core\changeacl

您的代码建议您可能需要为多个服务器执行此操作,您可以执行此操作的方法是在您的代码之前添加一个foreach

$servers = Get-Content C:\Servers.txt
ForEach ($server in $servers)
{
    $acl=(Get-Item \\core\testshare$).GetAccessControl('Access')
    $acl | Set-Acl -Path "$server\Team"
}

答案 1 :(得分:0)

谢谢Bluecakes,我已经创建了这样的命令,它运行正常。要保留访问控制列表和所有者权限,我们需要使用New-Object System.Security.Principal.NTAccount(" domainname"," ownername")

$j=Invoke-Command -ComputerName (Get-Content F:\ExchServerlist.txt) -ScriptBlock {md   "F:\Team"} -asjob
$servers = Get-Content F:\ExchServerlist.txt
ForEach ($server in $servers)
{
$ChkFile = "\\$server\f$\Team" 
$FileExists = Test-Path $ChkFile
If ($FileExists -eq $True) 
{
Write-Host "File Exists/Created in $server"
Write-Host "Waiting to complete" $server
$objUser = New-Object System.Security.Principal.NTAccount("domainname", "ownername")
$objfile =  Get-Acl "\\9018\f$\Team Data"
$objFile.SetOwner($objUser)
$path = Set-Acl -aclobject $objFile -path "\\$server\f$\Team"
Invoke-Command -ComputerName $server -ScriptBlock {param($objUser,$objfile,$path)} -ArgumentList $objuser,$objfile,$path -asjob
}
else {$j | wait-job -Timeout 30}
}