我正在执行以下powershell命令,以将活动目录(用户及其组)的数据存储在变量$UsersPerGroup
中:
$UsersPerGroup = Get-ADUser -Filter * -SearchBase "OU=Users,OU=ITE,OU=HQ,DC=idb,DC=iadb,DC=org" -Properties DisplayName, memberof | % {
New-Object PSObject -Property @{
UserName = $_.DisplayName
Groups = ($_.memberof | Get-ADGroup | Select -ExpandProperty Name) -join ","
}
} |Sort-Object UserName | Select UserName, Groups
到目前为止,直到我将数据导出到.txt文件为止,效果都还不错,显然组的数量无法容纳在Powershell窗口中,因此将其表示为:“ ...”,因此当我导出{ {txt}文件中的{1}}变量,数据也会像这样存储。
为了更好地理解,让我们在Powershell中然后在.txt文件中查看屏幕的右上角:
我需要所有数据,因为我会操纵它们。
非常感谢您!
答案 0 :(得分:0)
ADDS用户可以属于许多组。几十个。我曾参与过很多客户参与的场景,其中用户已多达100个组。
因此,如果您处于这种情况或喜欢这种情况,则必须重新考虑您的方法。它永远不会适合一行或以这种方式显示在屏幕上或文本文件中。
您必须确定可接受的格式才能查看大量数据。因此,您需要按组列出并列出用户,或者按用户和列出组列出。根据您使用的PS版本,您确实可以执行此操作...
Get-ADPrincipalGroupMembership -Identity $env:username | Select-Object Name
尽管它不能列出间接的组成员身份,并且会出现“未知错误”的错误。
function Get-NestedGroupMember
{
[cmdletbinding()]
[Alias('gngm')]
param
(
[Parameter(Mandatory,ValueFromPipeline)]
[string]$Identity
)
process
{
$user = Get-ADUser -Identity $Identity
$userdn = $user.DistinguishedName
$strFilter = "(member:1.2.840.113556.1.4.1941:=$userdn)"
Get-ADGroup -LDAPFilter $strFilter -ResultPageSize 1000
}
}
$UserList = "$env:USERNAME",'SQLAdmin'
ForEach($User in $UserList)
{
Get-NestedGroupMember -Identity $User |
Select-Object -Property @{Name = 'ADUser';Expression = {$User}},Name
"`n"
}
# Results
ADUser Name
------ ----
Administrator Administrators
Administrator Schema Admins
Administrator Enterprise Admins
Administrator Domain Admins
...
SQLAdmin Administrators
SQLAdmin Users
SQLAdmin WindowsServiceAccounts
SQLAdmin SharePoint Servers
或者以这种方式列出信息...如果只是显示用户名,则避免重复用户名。
# Get users with base properties and their group membership, display user and group name
ForEach ($TargetUser in (Get-ADUser -Filter *))
{
"`n" + "-"*12 + " Showing group membership for " + $TargetUser.SamAccountName
(Get-NestedGroupMember -Identity $TargetUser.SamAccountName).Name
}
# Results
------------ Showing group membership for Administrator
Administrators
Schema Admins
Enterprise Admins
Domain Admins
...
------------ Showing group membership for Guest
Guests
答案 1 :(得分:0)
问题出在Out-File
命令上,因为它正在输出 console 输出,而不是像预期的那样将数据流式传输到文件中。一种解决方案(如@ user4317867指出)是通过Out-String
传递内容以获取所需内容。我在这里Powershell - Creating Wide Tables
$UsersPerGroup | Format-Table -Property * -AutoSize | Out-String -Width 50000 | Out-File -Path Users.txt
这在解决问题的同时,为您提供了巨大的宽文本文件。输出内容的更好方法是使用Add-Content:
$UsersPerGroup | Add-Content -Path Users.txt
这提供了完整的内容行,尽管它的格式不是很好的人类可读格式,例如:
@{UserName=Jplaudir8; Groups=group1,group2}
我认为最好的方法是导出为CSV:
$UsersPerGroup | Export-Csv -Path Users.txt -NoTypeInformation
答案 2 :(得分:0)
提出一个重要的一般性观点:
我需要所有数据,因为我会操纵它们。
要持久保存(序列化)数据以进行后续的程序化操作,切勿使用>
,Out-File
或Set-Content
-您将始终丢失信息。>
Export-Csv
将为您提供机器可分析的输出,但是将缺少类型信息,并且通常不会处理嵌套数据好吧。
PowerShell提供的最健壮的持久性/序列化格式是CLI XML,您可以使用Export-CliXml
生成并使用Import-CliXml
来使用。
尽您所能忠实地序列化/反序列化任何类型的实例,但是即使该方法也有其局限性。
HAL9256's answer向您展示如何通过指定足够大的>
值来解决Out-File
/ ...
省略号问题(用-Width
表示的截断值) ,但如上所述,您不应将此格式用于程序化处理。
根据您的需求,Export-Csv
可能就足够了;有利的一面是它在机器可解析性和人眼友好之间取得了平衡。