【问题标题】:Output department and direct reports输出部门和直接报告
【发布时间】:2015-03-02 16:48:08
【问题描述】:

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

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

【问题讨论】:

  • 这些字段代表什么? we38432 | IT-Security | cm03456: 04555a: ....etc。我可以假设一个是用户名,但我希望你告诉我确定。我问是因为您的直接下属不止一个人吗?
  • IT-Security 是部门,是的,大多数用户名都有多个直接下属,如“”:“”@Matt
  • 您知道您的 PowerShell 版本是什么吗? Get-Host

标签: powershell report output


【解决方案1】:

让我们看看能不能让这件事变得更简单、更高效。

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,该New-Object 被发送到输出流。

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

【讨论】:

  • 我收到以下错误:Select-Object:找不到接受参数“Export-CSV”的位置参数。我也不熟悉 [pscustomobject]@ 代码
  • 看到 2.0 评论并更新。使用新的非打字代码重试
  • 当我进行更改时,我收到一页页的错误消息:Get-ADUser : Cannot validate argument on parameter 'Identity'. The argument is null. Supply a non-null argument and try the command again.
  • 我删除了在编辑中生成$users 的位置。请再试一次。这对我来说测试OK.... nvm 出了点问题。对于有错误的用户,他们没有经理吗?
  • 我的错误没有显示哪个用户拥有它:Get-ADUser : Cannot validate argument on parameter 'Identity'. The argument is null. Supply a non-null argument and try the command again. \Supervisor_oldFile2.ps1:51 char:64 + DirectReports = ($_.Manager | ForEach-Object{Get-Aduser &lt;&lt;&lt;&lt; $_ | Se lect-object -ExpandProperty Name}) -join ":" + CategoryInfo : InvalidData: (:) [Get-ADUser], ParameterBindingV alidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Activ eDirectory.Management.Commands.GetADUser
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
相关资源
最近更新 更多