顺便说一下,我是 powershell 新手。
我正在尝试修复前任管理员严重搞乱的权限和所有权。 我们有一个网络共享,用于 AD 中的文件夹重定向。我们还拥有 3 个 DC。
我已经修复了共享文件夹和子目录的用户权限。我剩下的就是修复文件夹的所有权,因为它们全部归以前的管理员所有,并且这些文件夹用于用户的主页。
我一直在写一个脚本,我原以为只需要一个小时,但现在已经花了 4 个小时,这真的让我很困惑。
这是我的脚本:
$sharedDir = '\\Jupiter\Users'
# Loop over shared directory to process each directory
Get-ChildItem $sharedDir|foreach-object {
# Directories are usernames
$userName = $_.Name
$userDir = $_.FullName
try {
Write-Host 'Processing: ' $userName
# Get AD Details for the user with properties
$adDetails = Get-ADUser -Identity $userName -Properties *
# Check if the user is enabled
if ($adDetails.Enabled -eq $FALSE) {
Write-Host '- is disabled'
Write-Host '- Skipped'
} else {
Write-Host '- is ENABLED'
# Fetch ACL for the directory
$acl = $null; # Reset
$acl = Get-Acl -Path $userDir
# Fetch the current ownership
$ownership = $acl.sddl -replace 'o:(.+?)G:.+','$1'
# Check if ownership matches
if ($ownership -eq $adDetails.SID) {
Write-Host '- Has correct ownership'
Write-Host '- Skipped'
} else {
Write-Host '- Need to fix ownership'
$objSID = New-Object 'Security.Principal.SecurityIdentifier' $adDetails.SID
# Fix ownership
#$objUser = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList ($sid)
#$acl.SetOwner($objSID)
$objUser = New-Object System.Security.Principal.NTAccount("FFGROUP", $userName);
$acl.SetOwner([System.Security.Principal.IdentityReference]$objUser)
Set-Acl -Path $userDir -AclObject $acl
Write-Host $userDir
Write-Host $adDetails.SID
Get-ACL -Path $userDir
exit # Only do this one for now
}
}
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
# User does not exist handling
Write-Host '- Does not exist.'
Write-Host '- Skipped'
}
# Sanity seperator
Write-Host '--------------------------------------------------'
}
输出示例:
--------------------------------------------------
Processing: ClaudiaO
- is ENABLED
- Has correct ownership
- Skipped
--------------------------------------------------
Processing: ClaudiaV
- Does not exist.
- Skipped
--------------------------------------------------
Processing: Conference
- is ENABLED
- Need to fix ownership
Set-Acl : Some or all identity references could not be translated.
At \\jupiter\Users\Jeremy\My Documents\WindowsPowerShell\fixPermissionsOnUsersDirectory.ps1:46 char:17
+ Set-Acl -Path $userDir -AclObject $acl
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (\\Jupiter\Users\Conference:String) [Set-Acl], IdentityNotMappedException
+ FullyQualifiedErrorId : System.Security.Principal.IdentityNotMappedException,Microsoft.PowerShell.Commands.SetAclCommand
根据我的理解,这意味着它找不到用户。该用户确实存在。它对每个用户都这样做。
我可以做什么来解决所有权问题?缺少什么才能找到用户?我已经使用
Get-ADUser
获取用户,那么为什么它会给出 IdentityNotMappedException
?
我尝试过使用SID和用户名。我发现了大约 5 种不同的方法来创建这些,但都不起作用。我总是收到这个错误。我想我可能需要将其指向 DC,但不知道如何操作。
我是域管理员并拥有完全控制权。访问此共享时,我没有任何权限问题,并且此脚本是从我的用户运行的。
这是一个紧急情况,所以我正在处理这个问题,同时手动修复了数百个目录。任何帮助将不胜感激!
似乎您的代码过于复杂,您可以在 AD 用户的 .Translate
上使用
.SID
方法来获取
NTAccount
。无需手动执行此操作。
} else {
Write-Host '- Need to fix ownership'
$ntaccount = $adDetails.SID.Translate([System.Security.Principal.NTAccount])
$acl.SetOwner($ntaccount)
Set-Acl -Path $userDir -AclObject $acl
Write-Host $userDir
Write-Host $adDetails.SID
Get-Acl -Path $userDir
return # use `return` instead of `exit` here to end early
}