簡體   English   中英

Powershell:計算 AD 組的成員

[英]Powershell: count members of a AD group

收到一個我可以使用和更正代碼的示例

我目前的問題是如何計算組中成員的數量,而不是打印出組中的所有成員(包括他們的 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
}

我根據 Alex McKenzie 的評論進行了編輯。 你給我的最初的例子有問題。 我嘗試向其中添加一些編輯,但出現錯誤:無法驗證參數“身份”上的參數。 參數為 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
    }
  }

下面是我完成的代碼。 我只是為我需要的每個東西制作了單獨的 .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
}

如果我希望它也被計數,我會在原始腳本中添加一個計數器

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
}

Get-ADGroupMember cmdlet 將以比您綁定的方式更有效的方式解決此問題。

舉個例子:

$users = @(Get-ADGroupMember -Identity 'Group Name')
$users.count
132

編輯:

為了澄清事情,並使您的腳本更簡單。 這是一個適用於您的環境的通用腳本,該腳本輸出與您的過濾器匹配的每個組的用戶數。

$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)."
}

每一個回答都遺漏了一個細節。 如果組只有 1 個用戶怎么辦。

$count = @(get-adgroupmember $group).count

將命令放在@() 包裝器中,以便無論如何結果都是一個數組,因此即使它是 1 個項目,您也會得到一個計數。

簡單的方法:獲取實際用戶數:

$ADInfo = Get-ADGroup -Identity '<groupname>' -Properties Members
$AdInfo.Members.Count

並且您很容易獲得計數,對於 20k+ 用戶來說也非常快

$users = Get-ADGroupMember -Identity 'Client Services' -Recursive ; $users.count

上面的單行代碼給出了找到的遞歸成員的干凈計數。 簡單,容易,一行。

如果您不能使用ActiveDirectory模塊或Get-ADGroupMember cmdlet,您可以使用 LDAP“鏈中”匹配規則來實現:

$GroupDN = "CN=MyGroup,OU=Groups,DC=mydomain,DC=tld"
$LDAPFilter = "(&(objectClass=user)(objectCategory=Person)(memberOf:1.2.840.113556.1.4.1941:=$GroupDN))"

# Ideally using an instance of adsisearcher here:
Get-ADObject -LDAPFilter $LDAPFilter

有關在 Active Directory 中實現的其他 LDAP 匹配規則,請參閱MSDN

在 Powershell 中,您需要導入活動目錄模塊,然后使用 get-adgroupmember,然后使用 measure-object。 例如,要獲取屬於“域用戶”組的用戶數,請執行以下操作:

Import-Module activedirecotry
Get-ADGroupMember "domain users" | Measure-Object

在“Get-ADGroupMember”后輸入組名時,如果名稱是單個字符串,沒有空格,則不需要引號。 如果組名中有空格,請使用引號將其括起來。

輸出將類似於:

Count    : 12345
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

注意 - 如果您已經將 PowerShell 用於其他 AD 管理任務,則導入活動目錄模塊可能是多余的。

有什么想分享的。。

$adinfo.members實際上是實際成員數量的兩倍。 $adinfo.member沒有“s” )返回正確的金額。 即使在轉儲$adinfo.members$adinfo.member以篩選輸出較低數量的成員時。

不知道如何解釋這個!

這個怎么樣?

Get-ADGroupMember 'Group name' | measure-object | select count

嘗試:

$group = Get-ADGroup -Identity your-group-name -Properties *

$group.members | count

這對我有超過 17000 名成員的小組有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM