【问题标题】:Modifying folder permissions修改文件夹权限
【发布时间】:2016-05-16 04:16:09
【问题描述】:

需要一点帮助。该脚本根本没有更改权限。

我想让文件夹的名称成为具有完全权限的文件夹的所有者。

$foldernames = (Get-ChildItem \\knesmbmdc001\profiles).Name
$user = "$foldernames"
$usercount = 0
foreach($name in $foldernames)
{
If ($usercount -le 5)
{
    Try
    {

        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($user,"FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
        $acl = get-acl $name
        $acl.AddAccessRule($rule)
        Set-acl $name $acl
    }
    catch
    {
    Add-Content C:\user_done.txt $name
    }
}
} 

【问题讨论】:

    标签: powershell powershell-3.0 powershell-4.0


    【解决方案1】:

    脚本的直接问题:

    • 传递给New-Object System.Security.AccessControl.FileSystemAccessRule 的第一个参数应该是$name,而不是$user

    • 您写入日志文件的Add-Content 调用不应出现在catch 子句中,因为只有在ACL 操作成功时才会记录。 p>

    • 通过在您的 catch 子句中没有其他语句,异常会被有效地忽略

    • 您仅将文件夹 names 传递给期望 pathsGet-AclSet-Acl)的 cmdlet,这仅在当前位置发生时才有效成为文件夹的父位置。

    这是您的脚本的重新编写,应该可以按预期工作:

    $dir = '\\knesmbmdc001\profiles'
    $logFile = 'C:\user_done.txt'
    Get-ChildItem -Directory $dir | % {
        $user = $_.Name
        $acl = Get-Acl -LiteralPath $_
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $user, FullControl, "ContainerInherit, ObjectInherit", None, Allow
        $acl.AddAccessRule($rule)
        Set-Acl -LiteralPath $_ -AclObject $acl
        Add-Content $logFile $user
     }
    

    但是请注意,虽然这完全控制目标用户,但它不会使他们成为所有者 文件夹。

    要真正更改所有权,请尝试以下操作(替换 $rule=...$acl.AddAccessRule... 命令):

    $userIdentity = New-Object System.Security.Principal.NTAccount $user
    $acl.SetOwner($userIdentity)
    

    这对我使用本地用户帐户有效,同时以提升的权限运行,但 YMMV。

    【讨论】:

    • 我现在正在运行 robocopy,如果权限仍然不正确,我将开始测试您的脚本。谢谢你的帮助。我刚刚看到最后一个声明。我需要添加什么才能使它们成为所有者?
    • Get-Acl :找不到接受参数“kostxing.im”的位置参数。在 \\kiewitplaza\vdi\appsense_profiles\Take_ownership_profile.ps1:6 char:12 + $acl = Get-Acl $user $_ + ~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Get-Acl], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetAclCommand
    • 您不能在空值表达式上调用方法。在 \\kiewitplaza\vdi\appsense_profiles\Take_ownership_profile.ps1:9 char:5 + $acl.AddAccessRule($rule) + ~~~~~~~~~~~~~~~~~~~~~~~~ ~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull
    • @user770022: Re Get-Acl 错误:看起来你正在传递 2 参数,$user$_,这可能是问题所在;我的代码只通过$_ - 手头的文件夹(路径) - 通过-LiteralPath
    • Re null-vallued expression 错误:此错误是 Get-Acl 错误的结果:变量 $acl 尚未设置,因此是 $null,并且任何尝试调用方法$null 导致该错误。 Get-Acl 错误是一个 non-terminating 错误,与 null-value 错误不同,这就是为什么代码一直追随前者的原因。例如,为了防止这种情况,您可以设置$ErrorActionPreference = 'Stop'
    猜你喜欢
    • 2012-02-16
    • 2011-06-12
    • 1970-01-01
    • 2019-11-03
    • 2012-04-27
    • 2018-09-06
    • 2012-11-20
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多