从Get-ADGroupMember获取UPN

时间:2016-07-25 19:41:27

标签: powershell active-directory powershell-v3.0 cmdlets

我的任务是从多域AD林中的多个组中的用户获取 userPrincipalName 属性。

问题是我无法使用Select-Object从Get-ADGroupMember获取用户的UPN,因为此cmdlet仅返回有限数量的属性(samaccountname,name,SID和DN),而UPN不是他们。

我写了这段代码(得到“名字”而不是用“名字”搜索UPN):

    $ScriptPath = Split-Path $MyInvocation.MyCommand.Path
    $LocalSite = (Get-ADDomainController -Discover).Site
    $NewTargetGC = Get-ADDomainController -Discover -Service 6 -SiteName 
    $LocalSite
    IF (!$NewTargetGC)
    { $NewTargetGC = Get-ADDomainController -Discover -Service 6 -NextClosestSite }
    $NewTargetGCHostName = $NewTargetGC.HostName
    $LocalGC = “$NewTargetGCHostName” + “:3268”

    $domains = (Get-ADForest).domains
    $MembersOfSFDC_Groups = foreach ($domain in $domains) {
    $Group = Get-ADGroup -Filter { Name -like "*groupname*" } -Server $Domain 
    $Group | Get-ADGroupMember -Server $domain | Select @{
    Name="Domain";Expression={$Domain}},@{
    Name="Group";Expression={$Group.Name}}, name}

    $DisplayNames = $MembersOfSFDC_Groups.name
    $DisplayNames |Out-file (Join-Path $ScriptPath 'DisplayNames.txt')

    Get-content (Join-Path $ScriptPath 'DisplayNames.txt') |
    $displaynames | ForEach-Object {
    Get-ADUser -Server $LocalGC -Filter {Name -eq $_}  | 
    Select-Object -Property userPrincipalName} | 
    Out-File (Join-Path $ScriptPath 'upnOfSDFC_AD_GroupsMembers.txt')

但接下来的问题是此代码运行大约30分钟(Measure-Command cmdlet)。我们在多个域中拥有大量用户。

我的问题是如何改进我的代码让用户的UPN更强更快

我了解 System.DirectoryServices.DirectorySearcher ,但不知道如何使用我的txt文件(“名称”列表)实现此方法。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

最快的方法可能完全避免Get-ADGroupMember,只搜索该组,然后搜索属于该组的对象:

$Group = Get-ADGroup -Filter { Name -like "*groupname*" } -Server $Domain 
$Members = Get-ADObject -LDAPFilter "(memberOf=$($Group.DistinguishedName))" -Properties UserPrincipalName
$Members |Select-Object UserPrincipalName |Out-File (Join-Path $ScriptPath 'upnOfSDFC_AD_GroupsMembers.txt')

现在你需要2个查询,而不是2 + N(其中N是成员数)

答案 1 :(得分:0)

好的,伙计们,我得到了它:

  function Get-DomainFromDN ($param)
  {   
  $dn1 = $param -split "," | ? {$_ -like "DC=*"}
  $dn2 = $dn1 -join "." -replace ("DC=", "")
  $script:test = $dn2
  return $dn2
  }

foreach ($Group in $Groups) {
$Members = Get-ADObject -LDAPFilter "(&(objectCategory=user)(memberOf=$($Group.DistinguishedName)))" -Properties UserPrincipalName -Server (Get-DomainFromDN ($group.DistinguishedName))
$UPN_Of_SFDC_Groups += $Members |Select-Object UserPrincipalName }

$UPN_Of_SFDC_Groups | Out-file (Join-Path $ScriptPath 'upnOfSDFC_AD_GroupsMembers.txt')

答案 2 :(得分:0)

您实际上可以从一行代码中获取它。简单......:)

Get-ADGroupMember -Identity "group name" |%{get-aduser $_.SamAccountName | select userPrincipalName } > c:\scripts\upnofADgroup.txt