![在 PowerShell 中递归获取用户主目录](https://linux22.com/image/523614/%E5%9C%A8%20PowerShell%20%E4%B8%AD%E9%80%92%E5%BD%92%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E4%B8%BB%E7%9B%AE%E5%BD%95.png)
因此,我开始深入研究 PowerShell。我被要求重新设置域中每个主文件夹的权限(它们并不都属于同一个子目录 - 这太容易了)。我编写了一个批处理脚本,它接受两个参数:用户名和主文件夹路径,并通过 SetACL 传输它们。
我想使用 PowerShell 获取 OU 中每个用户的用户名和主文件夹。到目前为止,我可以获取用户名,但我不知道如何获取主目录。
这是我目前的 PowerShell(借用自网络上的各种来源):
$Dom = "LDAP://OU=Accounts,DC=myDomain,DC=local"
$Root = New-Object DirectoryServices.DirectoryEntry $Dom
# Create a selector and start searching from the Root of AD
$selector = New-Object DirectoryServices.DirectorySearcher
$selector.SearchRoot = $root
$Selector.pagesize = 20000
# Basically this will only grab user accounts and not computer accounts.
$adobj= $selector.findall() | where {
$_.properties.objectcategory -match "CN=Person*"
}
foreach ($person in $adobj) {
$prop=$person.properties
Write-host "$($prop.cn)"
}
我最终会将 Write-host 行导入到 setACL 批处理文件中,但目前我只是编写输出以确保其准确性。我尝试添加$($prop.homeDirectory)
到 Write-host 行,但没有成功。
有什么指点或建议吗?
答案1
Microsoft 已更新其 Active Directory powershell 模块,并包含在 RSAT 中。如果您不想使用第三方模块,以下列出了“JustAnOrgUnit”OU 中所有用户的sAMAaccountName
和homeDirectory
属性——与 @nimizen 的回答几乎相同,只是没有 Quest 要求。
Import-Module ActiveDirectory
Get-ADUser -SearchBase "OU=JustAnOrgUnit,DC=example,DC=com" -Filter * -Property * |
Select-Object -Property sAMAccountName,homeDirectory |
Export-CSV -Path C:\somefile.csv
答案2
使用 Quest 的 AD cmdlet,它们是免费的并且确实简化了这类事情。
您可以从http://www.quest.com/powershell/activeroles-server.aspx
加载这些内容后,请尝试以下脚本,同时阅读 Get-QADUser cmdlet。
$csvfile = "C:\somefile.csv"
$root = "OU=Accounts,DC=myDomain,DC=local"
get-qaduser -SearchRoot $root `
-ObjectAttributes @{homeDirectory=’*'} -IncludeAllProperties | `
Select-Object LogonName,HomeDirectory | `
Export-Csv $csvfile
答案3
以下是如何在不使用多个工具的情况下在每个 homeDirectory 上进行更新,以及如何从 OrgUnit 逐个运行每个帐户并递归地遍历每个子 OU。
# source ACL required
$NewAcl = Get-Acl -Path "C:\directory\as\template"
# load active directory powershell module (requires RSAT installed)
Import-Module -Name ActiveDirectory -Force
# get all AD Users in OU from example, then set new Acl from source directory on their home directory paths
Get-ADuser -Filter * -SearchBase "OU=Accounts,DC=myDomain,DC=local" -Properties homeDirectory | ForEach-Object {
$homedir = $_.'homeDirectory'
try {
# set acl settings
Set-Acl -Path $homedir -AclObject $NewAcl -Confirm:$false -ErrorAction Stop
# write output to console if successful
Write-Output "Successfully updated ACL settings for ${homedir}"
}
catch {
Write-Output "Unable to update ACL settings on ${homedir}"
}
}