输出部门和直接下属
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 文件。
我正在尝试创建一个 "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 文件。