2013-05-14 98 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