2013-05-14 37 views
0

我有一個記事本列表的100個用戶。通常我使用下面的腳本來獲取一個OU中的所有用戶,但是這次我有來自不同OU的用戶,我必須使用Samaccountname進行搜索。Powershell獲取用戶屬性給定samaaccount

clear 
$UserInfoFile = New-Item -type file -force "C:\Scripts\UserInfo.txt" 
"Login`tGivenname`tEmail" | Out-File $UserInfoFile -encoding ASCII 
Import-CSV "C:\Scripts\OU.txt" | ForEach-Object { 
    $dn = $_.dn 
    $ObjFilter = "(&(objectCategory=User)(objectCategory=Person))" 
    $objSearch = New-Object System.DirectoryServices.DirectorySearcher 
    $objSearch.PageSize = 15000 
    $objSearch.Filter = $ObjFilter 
    $objSearch.SearchRoot = "LDAP://$dn" 
    $AllObj = $objSearch.FindAll() 
foreach ($Obj in $AllObj) 
     { $objItemS = $Obj.Properties 
      $Ssamaccountname = $objItemS.samaccountname 
      $SsamaccountnameGN = $objItemS.givenname 
      $SsamaccountnameSN = $objItemS.sn 
      $SsamaccountnameEN = $objItemS.mail 
      "$Ssamaccountname`t$SsamaccountnameGN`t$SsamaccountnameSN`t$SsamaccountnameEN" | Out-File $UserInfoFile -encoding ASCII -append 
     } # End of foreach 
    } # End of ForEach-Object 

我想使用samaccountname列表來獲取這些用戶的名稱和電子郵件。我是Powershell的新手,所以上面的腳本本身對我來說有點難以掌握,現在我面臨着更加困難的任務。

+0

我建議使用任務pssnapin:http://www.quest.com/powershell/activeroles-server.aspx – 2013-05-14 16:54:08

回答

0

不知道如果我正確地理解你的問題,但如果你想過濾由帳戶名用戶列表中,你可以做這樣的事情:

$accounts = Get-Content userlist.txt 

... 

$objSearch.FindAll() | ? { 
    $accounts -contains $_.Properties.sAMAccountName 
} | % { 
    "{0}`t{1}`t{2}" -f ($_.Properties.givenname, $_.Properties.sn, $_.Properties.mail) 
} 

順便說一句,我建議你使用PowerShell的ActiveDirectory模塊如果可能的話。這將允許您使用簡單的Get-ADUser檢索用戶帳戶,從而簡化您的代碼。通過在第一個逗號分割dn,可以從用戶的專有名稱中提取OU。事情是這樣的:

$accounts = Get-Content userlist.txt 
Get-ADUser * -Properties * | ? { 
    $accounts -contains $_.Properties.sAMAccountName 
} | select @{n="ou";e={($_.distinguishedName -split ",", 2)[1]}}, mail, givenName, sn, homeDirectory 

或像這樣:

Get-Content userlist.txt | Get-ADUser -Properties * | 
    select @{n="ou";e={($_.distinguishedName -split ",", 2)[1]}}, mail, givenName, sn, homeDirectory 

未經檢驗的,雖然,因爲我沒有在手的廣告在這裏。

+0

我正在使用AD PowerShell模塊。我有一個100 samaccountname的名單,我需要找到他們的OU,電子郵件,名字,主目錄。 – Harmond 2013-05-14 18:04:58

+0

查看更新的答案。 – 2013-05-14 19:27:25

+0

我得到了一些錯誤說無法找到默認的活動目錄服務器,但我相信你的命令是完美無瑕的。我最終做的是我在另一個AD工具上運行了一個類似於你的命令,並獲得了所有具有電子郵件,名稱,samaccount,OU的用戶的列表。一旦我這樣做了,我將它保存在一個文本文件中,並在該文本文件上運行一些C#代碼以獲取與我的Samaccounts匹配的記錄。這對我來說是一種替代方案。 – Harmond 2013-05-15 14:21:01

0

我現在無法測試,但試試這個。如果您知道用戶的DN,則不需要搜索AD。您可以使用DN直接綁定到它。

Import-CSV "C:\Scripts\OU.txt" | ForEach-Object { 
    $dn = $_.dn 
    $user = [adsi]"LDAP://$dn" 

    New-Object PSObject -Propertry @{ 
     samaccountname = $user.Properties['samaccountname'] 
     givenname = $user.Properties['givenname'] 
     sn = $user.Properties['sn'] 
     mail = $user.Properties['mail'] 
    } 

} | Export-Csv $UserInfoFile 
+0

在這種情況下,他沒有可分辨的名稱,只是具有帳戶名稱的文件。這個問題有點令人誤解,因爲他發佈了他用於完成不同任務的代碼。 – 2013-05-14 19:30:55

+0

@AnsgarWiechers嘿,謝謝澄清! – 2013-05-15 08:46:08

+0

@AnsgarWiechers我曾說過,「通常我使用下面的腳本來獲取一個OU中的所有用戶,但是這次我有來自不同OU的用戶,我必須使用Samaccountname進行搜索。」 – Harmond 2013-05-15 13:47:14