我更改了 Windows 2008 计算机上的用户配额,之后一些用户报告说他们能够读取但不能写入映射的主文件夹。如果我在服务器管理器中重新输入主文件夹路径并接受默认提示...
"The \\server\folder home folder already exists. Do you want this user to be granted full control on this folder?"
...问题消失了。
有没有办法用 Powershell 做同样的事情,脚本会检查用户是否具有权限,如果没有,则重新分配?
如何列出文件夹权限以及所有者以确定谁没有完全权限?我花了几个小时研究这个第二个问题,结果好坏参半。
以下脚本似乎没有列出权限不匹配的文件夹。
get-acl "D:\users\*" | select Path -Expand Access | where
{ $_.Identityreference -notcontains 'NT AUTHORITY\SYSTEM'
-and $_.Identityreference -notcontains 'CREATOR OWNER'
-and $_.Identityreference -notcontains 'BUILTIN\Administrators'
-and $_.Identityreference -notcontains 'BUILTIN\Users'
-and $_.Identityreference -notcontains 'BUILTIN\Account Operators'
-and $_.Identityreference -notcontains 'BUILTIN\BUILTIN\Users'} |
select @{Expression={$_.path};Label="Folder"},
@{Expression={$_.IdentityReference};Label="User"},
@{Expression={$_.AccessControlType};Label="Permissions"} |
Format-Table -Wrap -AutoSize
答案1
既然您正在 AD 中设置主文件夹,为什么不使用 ADUC 和变量重新分配?
假设你的文件夹以你的用户名命名
您可以过滤视图以仅显示当前已为其主文件夹设置值的用户。
选择所有要更新的用户,然后转到这些用户的属性,然后转到选项Profile
卡。
输入主文件夹的路径如下:
\\<servername>\Home Folders\%USERNAME%
然后点击确定。它将循环并根据各个文件夹的用户名重置每个文件夹的权限。
您将需要更改路径以匹配您的路径,但重要的部分是%USERNAME%
。
答案2
要检查文件夹或文件的所有权,可以使用 GetOwner 方法:
$acl = Get-Acl $dir.fullname
$acl.GetOwner([System.Security.Principal.NTAccount])
并设置新主人:
$objUser = New-Object System.Security.Principal.NTAccount("YourDomain", "YourUser")
$acl.SetOwner($objUser)
答案3
这可能会有所帮助。我必须修复我之前采用的共享文件夹配置的权限。使用 powershell 和 subinacl.exe(因为远程更改所有者通常不起作用)。这也用于进行一些清理,因此这里有一些额外的代码来重命名已禁用或已删除的用户帐户文件夹。这是一个旧脚本,也使用 Quest cmdlet,现在可以用本机 AD cmdlet 替换。
Add-PSSnapin quest*
$dirlist = gci \\server\share | ? { $_.PSIsContainer }
$subinacl = "C:\utils\subinacl.exe"
foreach ($userdir in $dirlist)
{
#the foldername was a funny format (citrix 2008 profile with .2k8 suffix)
$username = $userdir.name.Split('.')[0]
$adaccount = Get-QADUser $username
If (($adaccount.AccountIsDisabled -eq $TRUE) -or (!$adaccount))
{
write-host "$username is not a current employee"
#rename folder to _DEL_originalname
$newname = "_DEL_$username"
rename-item -path $userdir -newname $newname
}
Else
{
#get full path
Write-Host "$userdir - changing permissions"
$currentDir = $userdir.FullName # this way you don't duplicate the start folder
#get ACL of folder
$acl = Get-Acl $currentDir
If ($acl.access -notcontains $username) {
#variable to set new permissions for username of folder
$permission = "domain\$username",”FullControl”,”ContainerInherit,ObjectInherit”,”None”,”Allow”
$accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission
#actually set the permissions
$acl.SetAccessRule($accessRule)
Set-Acl $currentDir $acl
#use subinacl to set owner at parent level and below
$params1 = "/file $currentDir /setowner=domain\$username"
$params2 = "/subdirectories $currentDir\*.* /setowner=domain\$username"
$params3 = "/subdirectories $currentDir\* /grant=domain\$username"
$params4 = "/subdirectories $currentDir\* /grant=domain\administrators=F"
Invoke-Expression "$subinacl $params1" | out-null
Invoke-Expression "$subinacl $params2" | out-null
Invoke-Expression "$subinacl $params3" | out-null
}
}
}