簡體   English   中英

將Active Directory數據存儲在.txt文件中

[英]Storing Active Directory Data in .txt File

我正在執行以下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文件為止,效果都很好,顯然組的數量無法容納在$UsersPerGroup窗口中,因此將其表示為:“ ...”,因此,當我將$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-FileOut-File命令上,因為它正在輸出控制台輸出,而不是像您期望的那樣將數據流式傳輸到文件中。 一種解決方案(如@ user4317867指出的)是通過Out-String傳遞內容以獲取所需內容。 我在這里提出一個解決方案Powershell-創建寬表

$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

提出重要的一般觀點:

我需要所有數據,因為我會操縱它。

要持久保存(序列化)數據以進行以后的編程操作 ,切勿使用>Out-FileSet-Content始終會丟失信息。

Export-Csv將為您提供機器可解析的輸出,但是它將缺少類型信息,並且通常無法很好地處理嵌套數據。

PowerShell提供的最健壯的持久性/序列化格式是CLI XML,您可以使用Export-CliXml並使用Import-CliXml
這與忠實地序列化/反序列化任何類型的實例一樣近 ,但是即使該方法也有其局限性。


HAL9256的答案顯示了如何通過指定足夠大的-Width值來解決> / Out-File省略號問題(用...表示截斷的值),但是-Width ,您不應使用此格式進行程序化處理。

根據您的需求, Export-Csv 可能就足夠了; 有利的一面是它在機器可解析性和人眼友好之間取得了平衡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM