我的为网络共享分配权限的powershell脚本必须运行多次?

问题描述 投票:0回答:1

我有一个脚本,用于配置新用户帐户的各个方面,包括在 NTFS 共享上创建网络文件夹并为其分配权限。

脚本运行并执行没有错误,认为权限已应用,并正确显示权限已应用。但是,检查创建的目录时,却没有权限。

有两个函数作为设置权限的一部分执行。

变量从左到右分别是 Active Directory SAM 用户名、Active Directory 用户主体名称、文件夹路径 1、文件夹路径 2 和文件夹路径 3。

例如,所有文件夹路径的格式为“\ipaddressofserver\Folder old\User Folder”

$CheckPerms = Check-FolderPermissions $ADUserSAMUserN $UserNTAccountObject $ProUACLPath $UserFACLPath $ScansFACLPath

“检查文件夹权限”功能如下。在抛出无法应用权限的错误之前,它应该尝试检查并设置权限 6 次。

function Check-FolderPermissions ($CPermUserSAM, $CPermUserUPN, $CPermProUACLPath, $CPermUserFACLPath, $CPermScansFACLPath) {
    $UserFPerms = $false
    $maxRetries = 5; $retrycount = 0

    while (-not $UserFPerms) {
        $CUserFPerms = get-acl -Path $CPermUserFACLPath | Select-Object -Property *
        if ($CUserFPerms.AccessToString.Contains($CPermUserSAM)) {
            $CUserFPerms.AccessToString
            Write-Host "User Folder Permissions for $CPermUserUPN found"
            $UserFPerms = $true
        }
        else {
            if ($retrycount -ge $maxRetries) {
                throw "Failed to set user folder permissions within '$maxRetries' retries"
            }
            else {
                Write-Host "User Folder permissions not found, trying to set permissions"
                Set-FolderPermissions $CPermUserUPN $CPermProUACLPath $CPermUserFACLPath $CPermScansFACLPath
                $retryCount++
                Write-Host 'Waiting for permissions to propogate, sleeping for 5 seconds'
                Start-Sleep '5'
            }
        }
    }
    return $UserFPerms
}

在 While 循环中的第二个 Else 语句中,调用函数“Set-FolderPermissions”,如下所示。

function Set-FolderPermissions ($SetPermUserUPN, $SetPermProUACLPath, $SetPermUserFACLPath, $SetPermScansFACLPath) {

    $FolderACL = New-Object System.Security.AccessControl.DirectorySecurity
    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "$SetPermUserUPN","Modify", "ContainerInherit, ObjectInherit", "0", "Allow")
    $FolderACL.SetAccessRule($AccessRule)
    Set-Acl -Path "$SetPermProUACLPath" -AclObject $FolderACL
    Set-Acl -Path "$SetPermUserFACLPath" -AclObject $FolderACL
    Set-Acl -Path "$SetPermScansFACLPath" -AclObject $FolderACL
}

Write-Host 语句的输出在下面进行编辑,屏蔽值。

while 语句的第一个循环检查并发现用户权限未应用,因为它尚未尝试设置它们。

调用设置权限的函数,然后休眠 5 秒,以便有时间应用权限。

while 语句再次循环,看到 UserA 的权限已被应用,并打印出访问控制列表的内容,其中 UserA 是列出的第一个条目。

Output Screenshot

我尝试了大约 20 种不同的函数和方法迭代来尝试让它工作,但在所有情况下发生的行为如下。

几乎每次:如果您在文件资源管理器中浏览并检查高级权限列表,则不会在目录上设置权限。

大多数情况下:如果我再次重新运行脚本,我会收到错误消息,它尝试创建的目录已经存在,因为它们是在第一次运行期间创建的,但脚本继续执行并重新应用权限,它们现在将正确浏览到文件夹并确认它们在那里时显示。

很少 > 5%:脚本必须运行两次以上才能应用权限。

我尝试执行此操作的方式有问题吗?我尝试强制它执行硬循环,在其中应用权限,等待 5 秒(测试最多 15 秒),再次应用权限,然后重复此过程 5 次,以绕过它们看似从文件夹中消失的情况。

因为我正在对文件夹的路径执行 Get-ACL 以检查它们是否已应用并且它们被列为在那里,所以我对此处发生的愚蠢行为感到不知所措。

Powershell版本是5.1

powershell permissions active-directory ntfs
1个回答
0
投票

我为服务台创建了一个脚本来为文件夹提供范围内的安全性。我从未尝试过使用 get-acl 而是使用 icacls。

$r = "(OI)(CI)(RX)" # read-only
$m = "(OI)(CI)(M)" # modify

#  Create Directory
$null = New-Item $SharePath -ItemType Directory
Start-Sleep 1
If ( Test-Path $SharePath ) {
    Write-Host "`nSuccessfully created: " -N
    Write-Host "$SharePath" -F Green
} else {
    Write-Host "`nFailed to create: " -N
    Write-Host "$SharePath" -F Red
}

$null = icacls "$SharePath" /grant "domain\$($ShareName):$($m)"
If ( $LastExitCode -ne 0 ) { # try again
    Start-Sleep 3
    $null = icacls "$SharePath" /grant "domain\$($ShareName):$($m)"
}

Start-Sleep 2

#  Check that access applied
$null = icacls "$SharePath" /findsid "domain\$ShareName"
If ( $LastExitCode -eq 0 ) {
    Write-Host "`nModify rights: " -N
    Write-Host "Successfully applied" -F Green
} else {
    Write-Host "`nModify rights: " -N
    Write-Host "Failed to apply to folder." -F Red
    Write-Host "`n`nPlease manually apply rights to the share." -F Yellow
}

我认为它从未应用过权限。我的服务台已经使用它几个月了。

© www.soinside.com 2019 - 2024. All rights reserved.