输出部门和直接下属

时间:2015-03-02 16:48:08

标签: powershell report output

我正在尝试创建一个“初始”文本文件,该文件将保存所有用户+部门+直接报告的脚本运行。制作此文件后的下一步是以相同的方式创建另一个文件,但将其与原始文件进行比较,以查看用户的部门是否曾更改过。 (还不确定如何比较部门价值)

我目前的问题是,即使该过程与我过去制作的另一个程序相同,该部门也不会打印出来。此外,当它打印我的直接报告时,它只打印第一个,扩展名为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

1 个答案:

答案 0 :(得分:0)

让我们看看我们是否可以让它变得更容易和有效。

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{$_}通过过滤掉空值/空字符串而执行的操作。)并使用{{1}得到那里的名字。由于您可能有多个管理器,因此最有可能返回一个数组,我们使用Get-Aduser来确保只为-join属性提供一个字符串。该属性集合是为每个用户创建的,然后用于创建发送到输出流的DirectReports

以下New-Object只是为了确保创建的CSV中列的顺序。当Select-ObjectOut-File为您付出艰苦努力时,无需制作包含大量Export-CSV的CSV文件。