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

时间:2011-11-21 18:20:04

标签: powershell acl

我在Powershell中有一个关于Get-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更改文件夹的所有者?

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:4)

我有一些来自我们构建人员的系统配置脚本,我记得有关Get-Acl命令“在某些路径上运行不正常”的说明。

# NOTE: This method does not work well?
#$acl = Get-Acl -Path $Path

我们设置权限的路径类型是管理员用户稍后在磁盘映像中捕获的空文件夹。这是我们使用的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

答案 2 :(得分:0)

上面的代码效果很好。想要通过递归方式发布目录并填写一些"缺少"

$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
}