Powershell:计算AD组的成员

nar*_*992 -2 powershell count

接受了一个例子我可以使用和更正的代码

我目前的问题是如何计算组中的成员数量而不是打印出组中的所有成员(包括其ID名称或PC名称).注释掉的代码打印每个成员.我只想数数.

我在foreach循环中尝试了$ members.count,$ member.count和$ string.count但没有打印出来.请帮忙

Import-Module ActiveDirectory

$pathEmpty = "C:\Temp\groupsEmpty.txt"

Clear-Content $pathEmpty

$Header = `
"Group ID Name" + "|" + `
"Display Name" + "|" + `
"Description" + "|" + `
"Members"


#Write out the header
$Header | Out-File $pathEmpty -Append


$emptys = get-adgroup -properties name, displayname, description, members -filter  name -like "WA*" -or name -like "workstation*"} `
 | Select name, displayname, description, members

foreach ($empty in $emptys)
{
#clears previous 
$members = ""
foreach ($member in $empty.members)
  {
    $string = $member.substring(3,$member.indexof(",")-3)
    #$members = $members + ":" + $string
    $string.count 
  }
$listing =`
$empty.Name + "|" + `
$empty.DisplayName + "|" + `
$empty.Description + "|" + `
$members

$listing | Out-File $pathEmpty -Append
}
Run Code Online (Sandbox Code Playgroud)

我根据Alex McKenzie的评论进行了编辑.你给我的最初的例子提出了问题.我尝试添加一些编辑但是我收到一个错误:无法验证参数'Identity'的参数.参数为null或空.提供非null或空的参数,然后再次尝试该命令.

foreach ($empty in $emptys)
{
#clears previous 
$members = ""
foreach ($member in $empty.members)
  {
    #$string = $member.substring(3,$member.indexof(",")-3)
    #$members = $members + ":" + $string

    if($member -eq $null){
        $users = 0
        }
    else{
        $users = (Get-ADGroupMember -Identity $($_.DistinguishedName)).Count
        #$users.count
    }
  }
Run Code Online (Sandbox Code Playgroud)

下面是我完成的代码.我只为我需要的每件事制作了单独的.txt文件,并将它们分别导入excel. 问题已修复

Import-Module ActiveDirectory

##########################################################################
#This Section involves filtering WA groups and retriving their information
#In the info section (aka Notes section) is very important to look
#over if groups require approvals or not

##########################################################################

$pathAll = "C:\Temp\groupsEALL.txt"

Clear-Content $pathALL

$Header = `
"Group ID Name" + "|" + `
"Description" + "|" + `
"Notes Field" + " |" + "Members"


#Write out the header
$Header | Out-File $pathALL -Append

 $emptys = get-adgroup -properties name, description, members, info -filter {name -like "WA*" -or name -like "workstation*"} `
 | Select name, description, members, info

foreach ($empty in $emptys)
{

#clears previous 
$members = ""
foreach ($member in $empty.members)
  {
    #$users = (Get-ADGroupMember -Identity $member.DistinguishedName).Count
    $string = $member.substring(3,$member.indexof(",")-3)
    $members = $members + ":" + $string
   }

$listing =`
$empty.Name + "|" + `
$empty.Description + "|" + `
$empty.Info + "|" + `
$members

$listing | Out-File $pathALL -Append
}

################################################################
#This next section will determine the member count in the groups

################################################################

$pathCount = "C:\Temp\Groupcount.txt"
Clear-Content $pathcount

$groups = Get-ADGroup -filter {(name -like "WA*") -or (name -like "workstation*")}
foreach($group in $groups){
 #initializing
 $countUser = ""
   $countUser = ((get-Adgroup $group -properties members).members).count


"The group $($group.Name) has $countUser user(s)." | Out-File $pathCount -Append
}
Run Code Online (Sandbox Code Playgroud)

如果我想让它计数,我会在原始脚本中添加一个计数器

foreach ($empty in $emptys)
{

#clears previous 
$members = ""
#initialize member counting
$count = 0
foreach ($member in $empty.members)
  {
    #counts how many members
    $count += 1
    $countSum = "The group $($group.Name) has $count user(s)."
    $string = $member.substring(3,$member.indexof(",")-3)
    $members = $members + ":" + $string
   }
    $listing =`
$empty.Name + "|" + `
$empty.Description + "|" + `
#$empty.Info + "|" + `
$empty.info + "|" + `
$members + "|" + $countSum

$listing | Out-File $pathALL -Append
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*zie 13

"Get-ADGroupMember"cmdlet将以比您绑定更有效的方式解决此问题.

举个例子:

$users = Get-ADGroupMember -Identity 'Group Name'
$users.count
132
Run Code Online (Sandbox Code Playgroud)

编辑:

为了澄清事情,并使你的脚本更简单.这是一个适用于您的环境的通用脚本,它输出与您的过滤器匹配的每个组的用户数.

$groups = Get-ADGroup -filter {(name -like "WA*") -or (name -like "workstation*")}
foreach($group in $groups){
  $countUser = (Get-ADGroupMember $group.DistinguishedName).count
  Write-Host "The group $($group.Name) has $countUser user(s)."
}
Run Code Online (Sandbox Code Playgroud)


小智 6

每一个回答都遗漏了一个细节。如果组只有 1 个用户怎么办。

$count = @(get-adgroupmember $group).count
Run Code Online (Sandbox Code Playgroud)

将命令放在@() 包装器中,以便无论如何结果都是一个数组,因此即使它是 1 个项目,您也会得到一个计数。


小智 5

简单的方法:获取实际用户数:

$ADInfo = Get-ADGroup -Identity '<groupname>' -Properties Members
$AdInfo.Members.Count
Run Code Online (Sandbox Code Playgroud)

并且您很容易获得计数,对于 20k+ 用户来说也非常快

  • 我认为这是一个更好的方法。使用 Get-ADGroupMember 的第一种技术对我来说失败了,出现了“Get-ADGroupMember : The size limit for this request was exceeded”错误。我的组织相当大,一个组中有 10,000 多个 ID。我敢打赌 Get-ADGroup 是一种重量更轻的方法,并且不会枚举组中每个 ID 的所有属性。 (2认同)