输出部门和直接报告

输出部门和直接报告

问题描述:

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

我目前的问题是,即使该过程与我过去所做的另一个程序相同,该部门也不会打印它。此外,当打印我的直接下属只会打印第一个与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 
+0

这些字段代表什么? 'we38432 | IT-Security | cm03456:04555a:.... etc'。我可以假设一个是用户名,但我希望你告诉我确定。我问,因为你的直接报道不止一个人? – Matt 2015-03-02 17:32:02

+0

IT安全是部门,是的大部分用户名都有一个以上的直接报告,如“”:“”@Matt – narue1992 2015-03-02 17:34:46

+0

你知道你的PowerShell版本是什么吗? 'Get-Host' – Matt 2015-03-02 17:37:27

让我们来看看我们是否可以使这一点更容易和有效。

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

下面的Select-Object只是为了确保创建的CSV列的顺序。当Export-CSV-Delimiter "|"将为您辛苦工作时,无需制作大量Out-File s的CSV文件。

+0

我收到以下错误:Select-Object:无法找到接受参数'E xport-CSV'的位置参数。 我也不熟悉[pscustomobject] @代码 – narue1992 2015-03-02 17:44:45

+0

看到2.0评论和更新。尝试使用新的未指定错误的代码 – Matt 2015-03-02 17:47:27

+0

当我进行更改时,出现错误页面: 'Get-ADUser:无法验证参数'Identity'上的参数。参数是 null。提供一个非空参数,然后再次尝试该命令。' – narue1992 2015-03-02 17:49:40