Powershell 将Active Directory数据存储在.txt文件中

Powershell 将Active Directory数据存储在.txt文件中,powershell,active-directory,Powershell,Active Directory,我正在执行以下powershell命令,以将active directory(用户及其组)的数据存储在变量$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 @{ Use

我正在执行以下powershell命令,以将active directory(用户及其组)的数据存储在变量
$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的窗口中,因此它表示为:“…”,因此当我将
$UsersPerGroup
变量导出到.txt文件时,数据也会这样存储

为了更好地理解,让我们先在powershell中查看我的屏幕右上角,然后在.txt文件中查看:

我需要所有的数据,因为我会处理它


提前非常感谢

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

问题在于
Out File
命令,因为它输出控制台输出,而不是像您期望的那样将数据流式传输到文件。一个解决方案(正如@user4317867所指出的)是通过
Out字符串来获取您想要的内容。我在这里提出了一个解决方案

这在解决问题的同时,为您提供了一个巨大的文本文件。输出内容的更好方法是使用“添加内容”:

$UsersPerGroup | Add-Content -Path Users.txt
这将提供完整的内容行,尽管它的格式不是很好的人类可读格式,例如:

@{UserName=Jplaudir8; Groups=group1,group2}
在我看来,最好的方法是导出到CSV:

$UsersPerGroup | Export-Csv -Path Users.txt -NoTypeInformation

要提出一个重要的一般性观点:

我需要所有的数据,因为我会处理它

若要保留(序列化)数据以供以后的编程操作,请不要使用
输出文件
、或
设置内容
-您将始终丢失信息

Export Csv
将为您提供机器可解析的输出,但它缺少类型信息,通常不会很好地处理嵌套数据

PowerShell提供的最健壮的持久性/序列化格式是CLI XML,您可以使用
导出CliXml
生成该格式,并使用
导入CliXml

这是最接近于忠实地序列化/反序列化任何类型的实例的方法,但即使是该方法也有其局限性


演示如何通过指定足够大的
-Width
值来解决
/
输出文件的省略号问题(用
..
指示的截断值),但如上所述,不应将此格式用于编程处理


根据您的需要,
导出Csv
可能就足够了;好的一面是它在机器可解析性和对人眼友好性之间取得了平衡。

您可以尝试将变量管道化到
格式列表
并在控制台中预览输出,然后管道化到
输出字符串
$UsersPerGroup | Export-Csv -Path Users.txt -NoTypeInformation