[英]Powershell - How to remove trailing spaces from a list of groups a user is in
我已经复制/创建了一个脚本来获取用户所属的组的所有成员,包括嵌套组。 但是,我的输出并不完全是我想要的方式。
它以两种方式之一进行。 要么输出为一个看起来不错的大字符串,但每行都有尾随空格,因此我不能简单地将其复制并粘贴到 AD 中。 或者,如果我将 Out-String 更改为使用 -stream,它会显示为乱码,但可能允许我修剪空格。
我目前在一个简单的 GUI 中将输出输入到 TextBox 中。
Function Get-ADUserNestedGroups {
Param
(
[string]$DistinguishedName,
[array]$Groups = @()
)
#Get the AD object, and get group membership.
$ADObject = Get-ADObject -Filter "DistinguishedName -eq '$DistinguishedName'" -Properties memberOf, DistinguishedName;
#If object exists.
If($ADObject)
{
#Enummurate through each of the groups.
Foreach($GroupDistinguishedName in $ADObject.memberOf)
{
#Get member of groups from the enummerated group.
$CurrentGroup = Get-ADObject -Filter "DistinguishedName -eq '$GroupDistinguishedName'" -Properties memberOf, DistinguishedName;
#Check if the group is already in the array.
If(($Groups | Where-Object {$_.DistinguishedName -eq $GroupDistinguishedName}).Count -eq 0)
{
#Add group to array.
$Groups += $CurrentGroup;
#Get recursive groups.
$Groups = Get-ADUserNestedGroups -DistinguishedName $GroupDistinguishedName -Groups $Groups;
}
}
}
#Return groups.
Return $Groups;
}
Function Display-UserGroups {
#Get all groups.
$Groups = Get-ADUserNestedGroups -DistinguishedName (Get-ADUser -Identity $userSAM).DistinguishedName;
$ResultsTextBox.Text = $Groups | Select-Object Name| Sort-Object name | Out-String
第一种方式的输出如下所示:
组名1(这里有八个空格)
组名2(这里有八个空格)
第二种方式的输出如下所示:
组名1组名2组名3
谢谢你的帮助!
您需要修剪输出,这可以使用String.Trim方法轻松完成。 但是,它只能应用于字符串。 $Groups
将是ADObject
类型的数组。 您将需要返回这些对象的Name
值并将Trim()
方法应用于这些值。
($Groups | Select -Expand Name | Sort).Trim() -join "`r`n"
您可以使用$Groups += $CurrentGroup.trimEnd()
添加删除尾随空格的值。
您可能想研究的其他一些方法
.trim() # Trim leading and trailing
.trimEnd() # Trim trailing
.trimStart() # Trim leading
填充是由 PowerShell 的格式化系统引起的。 Select-Object
正在返回单个属性(名称)对象。 PowerShell 将其输出为表格,其中可能有一些填充。 Out-String
保留了填充,这就是为什么它会反映在您的最终输出中...
该组的名称属性已经是一个字符串。 如果您从$Groups
变量/集合中展开 Name 属性,则无需使用Out-String
。
对可读性和测试进行了一些其他调整。 下面将发出一个字符串,每个组在一个新行上。 那应该可以粘贴到 AD 中,我认为您的意思是 Active Directory 用户和计算机。
Function Get-ADUserNestedGroups
{
Param
(
[string]$DistinguishedName,
[array]$Groups = @()
)
# Get the AD object, and get group membership.
$ADObject = Get-ADObject $DistinguishedName -Properties memberOf, DistinguishedName
# If object exists.
If( $ADObject )
{
# Enummurate through each of the groups.
Foreach( $GroupDistinguishedName in $ADObject.memberOf )
{
# Get member of groups from the enummerated group.
$CurrentGroup = Get-ADObject $GroupDistinguishedName -Properties memberOf, DistinguishedName
# Check if the group is already in the array.
If( $Groups.DistinguishedName -notcontains $GroupDistinguishedName )
{
# Add group to array.
$Groups += $CurrentGroup
# Get recursive groups.
$Groups = Get-ADUserNestedGroups -DistinguishedName $GroupDistinguishedName -Groups $Groups
}
}
}
# Return groups.
Return $Groups
}
$userSAM = 'UserName'
# Get all groups.
$Groups = Get-ADUserNestedGroups -DistinguishedName (Get-ADUser -Identity $userSAM).DistinguishedName
($Groups.Name | Sort-Object) -join [System.Environment]::NewLine
在您将看到的次要更改中,我删除了几个地方的-Filter
参数。 DistinguishedName 可用作-Identity
参数,因此无需过滤。
此外,在您检查$Groups
集合是否已经具有当前组的地方,我使用了-notContains
运算符。 这应该比使用|Where{...}
重复迭代集合更快,代码也更短,更易读。
注意:如果我们反转操作数,我们可以使用
-notin
,它可能看起来更好
一边; 您应该避免使用+=
附加数组。 这样做会导致性能问题,因为它会创建一个新数组,任何复制内容的数组。 处理此问题的最佳方法是让 PowerShell 为您累积结果。 如果您必须直接进行追加,请考虑使用数组列表。 这方面的资料很多,自己google一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.