問題分解
所以我試圖回傳一個用戶所在的所有安全用戶組的串列,但讓它被經理分解。我采取了幾個步驟來做到這一點:
- 讓所有用戶進入 UserList
- 使用用戶串列收集經理串列。
- 將經理串列排序為唯一串列。
- 獲取經理 SamAccountNames。
- 從經理那里獲取 directreports 屬性以創建下屬串列。
- 獲取他們的 SamAccountNames
- 使用 SamAccountNames 提取 AD 安全組和描述。
小塊使用時,一切都有效。如果您為 $DirectReports 宣告一些名稱,然后運行最終的 for 回圈,它會適當地回傳所有內容。
但是,在運行腳本時,它只回傳經理名稱、直接報告名稱和安全組的所有行,但安全組的行中沒有任何內容。
沒有相關的錯誤資訊。在此先感謝您的幫助。
代碼
#Search Organizational Unit to find all Users
$UserList = @(Get-ADUser -Filter * -SearchBase "COMPANY'S ORG UNITS").SamAccountName
#For every user found in OU, select their manager
foreach ($User in $UserList) {
$Manager = @(Get-ADUser $User -Properties * | Select-Object @{Name = "Manager";Expression = {($_.manager -split ',*..=')[1]}})
$Managers = $Manager
}
#Sort and Select Unique Managers
$Managers = $Managers | Sort-Object -Property Manager -Unique
#Get SamAccountName From Manager Name
for ($a = 0; $a -lt $Managers.Count; $a ) {
$FilterString = "Name -eq '{0}'" -f $Managers[$a].Manager
$SAM = @(Get-ADUser -Filter "$FilterString" | Select SamAccountName)
$SAMs = $SAM
}
#Get subordinates for each manager
for ($b=0; $b -lt 1; $b ) {
#Get direct reporting individuals, second line cleans up output.
$DirectReports = @(Get-ADUser $SAMs[$b].SamAccountName -Properties directreports | select-object -ExpandProperty DirectReports)
$DirectReports = $DirectReports -replace "(CN=)(.*?),.*",'$2'
$Managers[$b 1]
Write-Output "`n"
#Get SAM names for direct reporting individuals and use to get user properties
for ($c = 0; $c -lt $DirectReports.Count; $c ) {
$FilterString2 = "Name -eq '{0}'" -f $DirectReports[$c]
$DirectReports[$c]
$SAM2 = @(Get-ADUser -Filter "$FilterString2")
$SAM2.SamAccountName
Get-ADPrincipalGroupMembership -Identity $SAM2.SamAccountName | Get-ADGroup -Properties * | select name, description
Write-Output "`n"
}
}
uj5u.com熱心網友回復:
好的,我們需要在您的解決方案中改進幾件事,但您走在正確的道路上。
你正在做的:
- 獲取所有 AD 用戶
- 讓所有經理唯一
- 獲取經理廣告資訊
- 讓經理直接下屬
- 獲取所有直接下屬的組成員身份
如果您只想回傳每個用戶的 SG 串列,您可以使用:
$users = Get-ADUser -Filter * -Properties MemberOf
foreach ($membership in $users.MemberOf) {
Get-ADGroup -Identity $membership
}
如果你想從經理自己那里得到一些東西,你可以去:
## Get list of managers (DirectReports not null)
$managers = Get-ADUser -Filter { -not (DirectReports -like '*') } -Properties DirectReports
#Get subordinates for each manager
foreach ($manager in $managers) {
foreach ($user in $manager.DirectReports) {
$groupMembership = Get-ADUser -Identity $user -Properties MemberOf
foreach ($membership in $groupMembership.MemberOf) {
Get-ADGroup -Identity $membership | Select-Object Name, Description
}
}
}
但對我來說,這只是額外的多余作業。
您還可以使用 Get-ADGroup cmdlet 列出所有組。
現在讓我解釋一下我對您的腳本所做的更改。
foreach 回圈而不是 for 回圈。這使得物件管理更容易
DistinguishedName 與 SamAccountName、SID、ObjectGUId 一起是一個身份...決議 CN 的 DN 是不可靠的。
與其獲取用戶,然后獲取經理,然后再次獲取用戶,然后獲取組,為什么不直接獲取所有組?
無需使用 Get-ADPrincipalGroupMembership,用戶物件上有一個名為“MemberOf”的屬性。
使用 ActiveDirectory PS 模塊時值得一提的事情:
小心使用“-Filter *”,一些 AD 結構太大,你最終會超時。
盡可能少地使用“-Properties *”。向 LDAP 查詢添加屬性會大大降低它的速度!你可能會超時。您可以改為使用特定屬性,例如“-Properties MemberOf”。
即使在指定單個屬性時,標準屬性也總是組合在一起。它們是:DistinguishedName、Enabled、GivenName、Name、ObjectClassm ObjectGUID、SamAccountName、SID、Surname、UserPrincipalName。
我希望它有幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474160.html
上一篇:Powershell-在單詞后面的第14、24、36、46和55個字符后添加字串
下一篇:如何從鏈接中獲取特定值?電源外殼
