输出部门和直接下属

Output department and direct reports

我正在尝试创建一个 "initial" 文本文件,其中包含所有用户 + 部门 + 直接下属的脚本 运行。制作此文件后,我的下一步是以相同方式创建另一个文件,但将其与原始文件进行比较,看看用户的部门是否发生过变化。 (还不确定如何比较部门值)

我现在的问题是,即使过程与我过去制作的另一个程序相同,部门也不会打印它。此外,当它打印我的直接下属时,它只打印第一个完整扩展名为 CN=...、OU=... 等的

我希望它以这种方式打印:

username | Department(extensionAttribute14) | Direct Reports (as a single string)
we38432 | IT-Security | cm03456: 04555a: ....etc

我的原始脚本将此代码用于部门:

$deps = Get-Aduser -filter {name -like *} -Properties name, extensionAttribute14 | Select name, extensionAttribute14 | Export-CSV $listing -notypeinformation

这成功了。我尝试了 {name -like *} 但这给了我当前程序的错误。我知道 Export-CSV 可以正常工作,但我不能再使用这种格式了。

对于直接报告,我的原文是这样的:

foreach ($ID in $directReports){
    if ($ID -ne $Null){
    $directreports = get-aduser $ID
    $directreports.name | Out-File $output -Append 
}

此代码逐行打印直接下属,但我希望在将其发送到那里时将它们全部列在同一个 excel 单元格中。

我过去使用“:”打印了一份所有成员的名单,并且有效,但直接下属名单并非如此。当我从我的其他程序中使用这种格式时,我只是遇到错误:

foreach ($member in $empty.members){
    $string = $member.substring(3,$member.indexof(",")-3)
    $members = $members + ":" + $string
}

我希望有人能帮助我解决我的两个问题。

Import-Module ActiveDirectory

$documentOld = "C:\Temp\Old_Supervisor_list_mo_yyyy.txt"

Clear-Content $documentOld

$Header = `
"User ID" <#+ "|" + `
"Department" + "|" + `
"Direct Reports"#>

$Header | Out-File $documentOld -Append

$Users = Get-AdUser -Filter * -Properties name, Enabled, Manager, extensionAttribute14 | Select Enabled, name, Manager, extensionAttribute14

foreach ($user in $Users){
if ($user.enabled –eq $true) {
    $name = $user.name
    $directReports = Get-ADUser -Identity $name -Properties directreports | Select -ExpandProperty directreports
    $department = $user.extensionAttribute14


foreach ($ID in $directReports){
if ($ID -ne $Null){
            $directreports = get-aduser $ID
 #           $string = $directreports + ":"

}#end if $ID
}#end foreach $ID

$listing = `
$name  + "|" +  $deparment + "|" + $directreports#$string

$listing | Out-File $documentOld -Append

}# end if
}# end foreach $user

让我们看看我们是否可以让这更简单、更高效。

Import-Module ActiveDirectory

$documentOld = "C:\Temp\Old_Supervisor_list_mo_yyyy.txt"

$Users = Get-AdUser -Filter *  -Properties name,Enabled,Manager,extensionAttribute14 | Where-Object{$_.Enabled}

$Users | ForEach-Object{
    $props = @{
        Name = $_.Name
        Department = $_.extensionAttribute14
        DirectReports = ($_.Manager | Where-Object{$_} | ForEach-Object{Get-Aduser $_ | Select-object -ExpandProperty Name}) -join ":"
    }

    New-Object -TypeName psobject -Property $props

} | Select-Object Name,Department,DirectReports | Export-CSV -Delimiter "|" -NoTypeInformation -Path $documentOld

首先,我们通过 Get-AdUser -Filter * 从您的目录中获取所有用户,并获取我们想要的规范之外的所有属性。由于您只需要已启用的帐户,我们现在使用 Where-Object{$_.Enabled}.

过滤掉这些帐户

有趣的部分是创建自定义对象数组(这是 Export-CSV 输入所必需的)。创建一个名为 $props 的小型哈希表,我们在其中通过友好名称设置属性。特殊的是 DirectReports,我们在其中获取所有用户管理器 DN(假设他们有一个,其中 Where-Object{$_} 通过过滤掉 nulls/empty 字符串来完成。)并使用 Get-Aduser 来得到那里的名字。由于您可能有多个管理器,因此很可能会返回一个数组,我们使用 -join 来确保只为 DirectReports 属性 提供一个字符串。该 属性 集合是为每个用户创建的,然后用于创建发送到输出流的 New-Object

后面的Select-Object只是为了确保创建的CSV中列的顺序。当 Export-CSV-Delimiter "|" 会为您完成繁重的工作时,无需制作包含大量 Out-File 的 CSV 文件。