我执行以下命令在远程服务器中创建文件夹。我在设置新文件夹的权限(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
答案 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}
}