我有一台 Windows 2008 R2 文件服务器。它的设置是让用户将主驱动器映射到 H:。它位于以下位置\\servername\home\%username%
我一直遇到一个问题,Mac 用户无法看到其他用户的主驱动器(即使启用了枚举)。
我需要更改目录和所有用户子目录的权限。有没有简单的方法可以批量执行此操作(超过一千个)。
我看过 Set-Aclhttp://helgeklein.com/setacl/examples/managing-file-system-permissions-with-setacl-exe/但是我不知道它如何处理所有已存在的用户主驱动器。如果有人知道一个好的工具那就太好了。
我想要将以下权限应用于 %username% 文件夹
SYSTEM - Full control
local\Users special list and read attributes
local\administrators - Full control
%username% = modify
谢谢
答案1
或者如果你更喜欢 PowerShell,我的一位技术人员编写了这个,它对我们来说效果很好。我相信它可以清理一些,但我留下了一些测试行,以便更容易使用和自定义。这使用任务工具你不再需要它,特别是如果你使用 PowerShell v2 和子ACL:
cls
#Add-PSSnapin quest*
#$dirlist = gci -name c:\test -Exclude *.* | sort #my original
$dirlist = gci \\servername\sharename -Exclude *.* | ? { $_.PSIsContainer }
$subinacl = "C:\utils\subinacl.exe"
foreach ($userdir in $dirlist)
{
$username = $userdir.name
$adaccount = Get-QADUser $username
#Verifies user is an active employee, renamed folder to be deleted if not
If (($adaccount.AccountIsDisabled -eq $TRUE) -or (!$adaccount))
{
write-host "$username is not a current employee"
#takeownership
#takeown /f $userdir /R /D Y /A
#rename folder to _DEL_originalname
$newname = "_DEL_$username"
rename-item -path $userdir -newname $newname
}
Else
{
#get full path
Write-Host $userdir.name
#$currentDir = "c:\test\$userdir" #my original
$currentDir = $userdir.FullName # this way you don't dupe the start folder
#takeown /f $userdir /R /D Y /A
#get ACL of folder
$acl = Get-Acl $currentDir
#variable to set new permissions for username of folder
#$permission = "domainname\$userdir",”FullControl”,”ContainerInherit,ObjectInherit”,”None”,”Allow” #original
$permission = "[email protected]",”FullControl”,”ContainerInherit,ObjectInherit”,”None”,”Allow”
$accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission
#actually set the permissions
$acl.SetAccessRule($accessRule)
#$acl | Set-Acl $currentDir #my original
Set-Acl $currentDir $acl
#use subinacl to set owner at parent level and below
$params1 = "/file $currentDir /setowner=domainname\$username"
$params2 = "/subdirectories $currentDir\*.* /setowner=domainname\$username"
$params3 = "/subdirectories $currentDir\* /grant=domainname\$username"
$params4 = "/subdirectories $currentDir\* /grant=domainname\administrators=F"
Invoke-Expression "$subinacl $params1" | out-null
Invoke-Expression "$subinacl $params2" | out-null
Invoke-Expression "$subinacl $params3" | out-null
# Invoke-Expression "$subinacl $params4" | out-null
}
}
答案2
这个脚本是我在 win 2008 上使用过的,用于重置名为 e:\users 的目录上的用户安全性。它将所有权重置为正确的所有者并设置标准安全配置文件。它使用 2008 附带的内置 takeown 和 icacls,因此不需要外部工具。
它假定用户名和目录名相同。例如,e:\users\j.doe 由 mydomain\j.doe 拥有
如果您向其传递 j.doe 之类的参数,它只会“更正”该目录,因此您可以在一个目录上进行测试。在实际使用之前,请检查安全权限是否符合您的要求。在迁移之后,我使用它来更正我在脚本中复制文件的问题。
@echo off
setlocal enabledelayedexpansion
set mydom=mydomainname
set domadmins=%mydom%\Domain Admins
set domadmin=%mydom%\administrator
for /d %%A in (e:\users\%1*) do (
echo %%~nA%%~xA %%A
echo.
echo takeown
takeown /f %%A /r /d y
echo.
echo reset security
icacls %%A\*.* /reset /t
echo.
echo reset user access
icacls %%A\*.* /grant:r "%mydom%\%%~nA%%~xA:(oi)(ci)F"
echo.
echo Add domainadmins
icacls %%A\*.* /grant:r "%domadmins%:(oi)(ci)f" /grant:r "%mydom%\%%~nA%%~xA:(oi)(ci)F" /grant:r "%domadmin%:(oi)(ci)f" /grant:r "SYSTEM:(OI)(CI)F" /t /c
rem echo.
rem echo add user full access
rem icacls %%A /grant:r "%mydom%\%%~nA%%~xA:(oi)(ci)F" /t /c
icacls %%A\*.* /inheiritance:r
echo.
echo reset user ownership
@echo on
icacls %%A\*.* /setowner %mydom%\%%~nA%%~xA /t /c
@echo off)
echo finished
我在发布时做了一些小改动,因此可能存在语法错误。