2015-03-02 68 views
0

我正在嘗試創建一個「初始」文本文件,該文件將包含所有用戶+部門+直接報告的腳本運行。創建該文件後的下一步是以相同的方式創建另一個文件,但將其與原始文件進行比較以查看用戶的部門是否曾更改。 (還不確定如何比較部門價值)輸出部門和直接報告

我目前的問題是,即使該過程與我過去所做的另一個程序相同,該部門也不會打印它。此外,當打印我的直接下屬只會打印第一個與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

回答

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{$_}通過過濾空/空字符串所做的),並使用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