在 PowerShell 中递归获取用户主目录

在 PowerShell 中递归获取用户主目录

因此,我开始深入研究 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 中所有用户的sAMAaccountNamehomeDirectory属性——与 @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}"
    }
}

相关内容