Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Get Acl返回时,如何使用Powershell更改文件夹的所有者;访问被拒绝;?_Powershell_Acl - Fatal编程技术网

当Get Acl返回时,如何使用Powershell更改文件夹的所有者;访问被拒绝;?

当Get Acl返回时,如何使用Powershell更改文件夹的所有者;访问被拒绝;?,powershell,acl,Powershell,Acl,我有一个关于在Powershell中获取Acl的问题。我一直收到错误消息,“访问路径被拒绝”。我想将文件夹的所有者更改为我自己,然后使用Powershell授予我自己对该文件夹的完全权限。下面是给出错误的代码行: $acl = Get-Acl "C:\SomeFolder" 在运行脚本之前,我正在使用Windows资源管理器设置“SomeFolder”的权限。详情如下: 访问控制列表中没有条目 主人不是我自己 如果在运行Powershell脚本之前使用Windows资源管理器GUI使自己成

我有一个关于在Powershell中获取Acl的问题。我一直收到错误消息,“访问路径被拒绝”。我想将文件夹的所有者更改为我自己,然后使用Powershell授予我自己对该文件夹的完全权限。下面是给出错误的代码行:

$acl = Get-Acl "C:\SomeFolder"
在运行脚本之前,我正在使用Windows资源管理器设置“SomeFolder”的权限。详情如下:

  • 访问控制列表中没有条目
  • 主人不是我自己
如果在运行Powershell脚本之前使用Windows资源管理器GUI使自己成为所有者,则不会收到错误消息。我不明白为什么允许我使用Windows资源管理器更改所有者,但不使用Powershell?我对这台机器有完全的管理员权限。Windows 7、Powershell 2.0、.NET 3.5


我假设更改所有者的唯一方法是使用Get Acl,在Acl上设置所有者,然后使用set Acl将其写回文件夹。如果有别的办法,请告诉我?如何使用Powershell更改文件夹的所有者

Windows Vista及更高版本包含名为takeown.exe的命令行工具,可从提升的命令提示符(或提升的powershell控制台)使用该工具更改文件系统对象的所有权

takeown /F "C:\SomeFolder" /R /D Y

应该授予您对C:\SomeFolder及其包含的文件系统对象的所有权。

我从构建人员那里得到了一些系统配置脚本,我还记得关于
Get Acl
命令“在某些路径上无法正常工作”的说明

我们设置权限的路径类型是管理员用户创建的空文件夹,后来在磁盘映像中捕获。这是我们使用的PowerShell命令

$acl = (Get-Item $path).GetAccessControl("Access")

哦,一旦你有了ACL对象,它就会变得非常模糊。我不知道这是否是最好的方法,但这是我上面提到的同一个脚本的片段

$acl = (Get-Item $path).GetAccessControl("Access")

# Setup the access rule.
$allInherit = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit", "ObjectInherit"
$allPropagation = [System.Security.AccessControl.PropagationFlags]"None"
$AR = New-Object System.Security.AccessControl.FileSystemAccessRule $user, $permissions, $allInherit, $allPropagation, "Allow"

# Check if Access already exists.
if ($acl.Access | Where { $_.IdentityReference -eq $User}) 
{
    $accessModification = New-Object System.Security.AccessControl.AccessControlModification
    $accessModification.value__ = 2
    $modification = $false
    $acl.ModifyAccessRule($accessModification, $AR, [ref]$modification) | Out-Null
} 
else 
{
    $acl.AddAccessRule($AR)
}

Set-Acl -AclObject $acl -Path $Path

上面的代码非常有效。想发布一个调整,以递归地遍历目录并填充一些“缺失的”

$HomeFolders=Get ChildItem“将目录根放在此处”-目录-递归
foreach($HomeFolders中的HomeFolder){
$Path=$HomeFolder.FullName
$acl=(获取项$Path).GetAccessControl('Access'))
$allInherit=[System.Security.AccessControl.InheritanceFlags]“ContainerInherit”、“ObjectInherit”
$allPropagation=[System.Security.AccessControl.PropagationFlags]“无”
$permissions=“FullControl”
$Username=“”
$AR=New Object System.Security.AccessControl.FileSystemAccessRule($Username、$permissions、$allInherit、$allPropagation,“Allow”)
if($acl.Access |其中{$\ IdentityReference-eq$Username})
{
$accessModification=新对象System.Security.AccessControl.AccessControlModification
$accessModification.value\uux=2
$modification=$false
$acl.ModifyAccessRule($accessModification,$AR,[ref]$modification)| Out Null
} 
其他的
{
$acl.AddAccessRule($AR)
}
设置Acl-path$path-Acl对象$Acl
}

感谢您的回复。我仍然在代码的第一行收到拒绝访问的消息
$acl=(Get Item$path).GetAccessControl(“Access”)
我甚至尝试了GetAccessControl方法接受的所有可能参数(None、Audit、Owner、Access、Owner、Group、all)。但仍然没有运气,访问被拒绝。你必须有一个基本的用户权限问题。开始在不同的目录(Windows\中的目录、同一用户创建的目录等)上尝试该命令。您是正确的。我有一个许可问题。谢谢我使用了
whoami/priv
cmdlet。我发现我没有启用AkeOwnershipPrivilege。使用powershell启用它非常麻烦。下面是一个关于如何启用它的示例启用特权后,我创建了一个新ACL,设置了该新ACL的所有者,最后使用set ACL将ACL保存回文件夹。谢谢你的帮助,请开诚布公。它有助于向后来者表明,您从这个答案中得到了一些帮助。您也可以在Windows 7上通过/setowner开关使用我相信的icacls。只是想提一下takeown.exe的替代方案。
$acl = (Get-Item $path).GetAccessControl("Access")

# Setup the access rule.
$allInherit = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit", "ObjectInherit"
$allPropagation = [System.Security.AccessControl.PropagationFlags]"None"
$AR = New-Object System.Security.AccessControl.FileSystemAccessRule $user, $permissions, $allInherit, $allPropagation, "Allow"

# Check if Access already exists.
if ($acl.Access | Where { $_.IdentityReference -eq $User}) 
{
    $accessModification = New-Object System.Security.AccessControl.AccessControlModification
    $accessModification.value__ = 2
    $modification = $false
    $acl.ModifyAccessRule($accessModification, $AR, [ref]$modification) | Out-Null
} 
else 
{
    $acl.AddAccessRule($AR)
}

Set-Acl -AclObject $acl -Path $Path
$HomeFolders = Get-ChildItem "put your directory root here" -Directory -recurse
foreach ($HomeFolder in $HomeFolders) {
    $Path = $HomeFolder.FullName
    $acl = (Get-Item $Path).GetAccessControl('Access')
    $allInherit = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit", "ObjectInherit"
    $allPropagation = [System.Security.AccessControl.PropagationFlags]"None"
    $permissions = "FullControl"
    $Username = "<put your name here>"
    $AR = New-Object System.Security.AccessControl.FileSystemAccessRule($Username, $permissions, $allInherit, $allPropagation, "Allow")
    if ($acl.Access | Where { $_.IdentityReference -eq $Username}) 
    {
        $accessModification = New-Object System.Security.AccessControl.AccessControlModification
        $accessModification.value__ = 2
        $modification = $false
        $acl.ModifyAccessRule($accessModification, $AR, [ref]$modification) | Out-Null
    } 
    else 
    {
        $acl.AddAccessRule($AR)
    }
    Set-Acl -path $Path -AclObject $Acl
}