Powershell 脚本返回空白行,正确的输出行数,但其中没有任何内容
Powershell Script Returning Blank Lines, Correct Amount of Lines for Output but nothing in Them
问题分解
所以我正在尝试 return 一个用户所在的所有安全用户组的列表,但让管理员将其分解。我采取了几个步骤来做到这一点:
- 将所有用户放入UserList
- 使用用户列表收集管理员列表。
- 将经理列表排序为唯一列表。
- 获取经理 SamAccountNames。
- 从经理处获取 directreports 属性以创建下属列表。
- 获取他们的 SamAccountNames
- 使用 SamAccountNames 提取 AD 安全组和描述。
小块使用时一切正常。如果您为 $DirectReports 声明了一些名称,然后 运行 最后一个 for 循环它 return 一切都适当。
然而,当 运行 运行脚本时,它 return 只有经理姓名、直接下属姓名和安全组的所有行,但安全行中没有任何内容组。
没有相关的错误信息。在此先感谢您的帮助。
代码
#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=)(.*?),.*",''
$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"
}
}
好的,我们需要在您的解决方案中改进一些地方,但您的方向是正确的。
你在做:
- 获取所有AD用户
- 获得唯一的所有经理
- 获取管理员广告信息
- 直接向经理汇报
- 获取所有直接下属的群组成员资格
如果您只想 return 每个用户的 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 *',一些广告结构太大,你最终会超时。
尽可能少地使用“-Properties *”。向 LDAP 查询添加属性会大大降低它的速度!你可能会超时。您可以改用特定属性,例如“-Properties MemberOf”。
即使指定单个属性,标准属性也总是在一起。它们是:DistinguishedName、Enabled、GivenName、Name、ObjectClassm ObjectGUID、SamAccountName、SID、Surname、UserPrincipalName。
希望对您有所帮助!
问题分解
所以我正在尝试 return 一个用户所在的所有安全用户组的列表,但让管理员将其分解。我采取了几个步骤来做到这一点:
- 将所有用户放入UserList
- 使用用户列表收集管理员列表。
- 将经理列表排序为唯一列表。
- 获取经理 SamAccountNames。
- 从经理处获取 directreports 属性以创建下属列表。
- 获取他们的 SamAccountNames
- 使用 SamAccountNames 提取 AD 安全组和描述。
小块使用时一切正常。如果您为 $DirectReports 声明了一些名称,然后 运行 最后一个 for 循环它 return 一切都适当。
然而,当 运行 运行脚本时,它 return 只有经理姓名、直接下属姓名和安全组的所有行,但安全行中没有任何内容组。
没有相关的错误信息。在此先感谢您的帮助。
代码
#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=)(.*?),.*",''
$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"
}
}
好的,我们需要在您的解决方案中改进一些地方,但您的方向是正确的。
你在做:
- 获取所有AD用户
- 获得唯一的所有经理
- 获取管理员广告信息
- 直接向经理汇报
- 获取所有直接下属的群组成员资格
如果您只想 return 每个用户的 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 *',一些广告结构太大,你最终会超时。
尽可能少地使用“-Properties *”。向 LDAP 查询添加属性会大大降低它的速度!你可能会超时。您可以改用特定属性,例如“-Properties MemberOf”。
即使指定单个属性,标准属性也总是在一起。它们是:DistinguishedName、Enabled、GivenName、Name、ObjectClassm ObjectGUID、SamAccountName、SID、Surname、UserPrincipalName。
希望对您有所帮助!