我有一个脚本,用于配置新用户帐户的各个方面,包括在 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 是列出的第一个条目。
我尝试了大约 20 种不同的函数和方法迭代来尝试让它工作,但在所有情况下发生的行为如下。
几乎每次:如果您在文件资源管理器中浏览并检查高级权限列表,则不会在目录上设置权限。
大多数情况下:如果我再次重新运行脚本,我会收到错误消息,它尝试创建的目录已经存在,因为它们是在第一次运行期间创建的,但脚本继续执行并重新应用权限,它们现在将正确浏览到文件夹并确认它们在那里时显示。
很少 > 5%:脚本必须运行两次以上才能应用权限。
我尝试执行此操作的方式有问题吗?我尝试强制它执行硬循环,在其中应用权限,等待 5 秒(测试最多 15 秒),再次应用权限,然后重复此过程 5 次,以绕过它们看似从文件夹中消失的情况。
因为我正在对文件夹的路径执行 Get-ACL 以检查它们是否已应用并且它们被列为在那里,所以我对此处发生的愚蠢行为感到不知所措。
Powershell版本是5.1
我为服务台创建了一个脚本来为文件夹提供范围内的安全性。我从未尝试过使用 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
}
我认为它从未应用过权限。我的服务台已经使用它几个月了。