Powershell嵌套哈希表 - 导出到文件

时间:2014-04-29 13:34:11

标签: powershell object collections export

我从AD中提取信息,输出很多信息,以便稍后处理。

我需要将它导出到csv或其他东西,所以我可以有一个回滚(实际上是导入文件,所以我可以处理每个对象,就像我可以使用下面的哈希表。特别是在$ _。MemberOf里面。)

我正在努力处理的哈希表是:

$logging1 = @{
MemberOf="$users.MemberOf"
OriginalOU="$Ou.DistinguishedName"
DisabledWhen="$descriptionDisabled"
}
$logging = @{$users.SamAccountname = $logging1}

脚本的其余部分(未粘贴)是:

遍历一堆ou's。让用户上次登录-90天或更长时间,然后将它们传递给有问题的HashTable,我希望将其附加到稍后要导入的文件中。

我一直在谷歌上搜索几个小时没有到达某个地方

这是完整的脚本:

import-module ActiveDirectory
$descriptionDisabled = get-date -Format yyyyMMdd
$Loggdir = "C:\temp"
$array = @{}
$loggname = get-date -f yyyyMMdd
$90days = ((get-date).AddDays(-90))
$searchBase = 'OU=someou4,OU=someou3,OU=someou2,OU=someou1,DC=name,DC=NO'
$ExclusionList = Someexlutions
$OUlist = Get-ADOrganizationalUnit -SearchBase $searchBase 
foreach ($Ou in $OUlist)
{
$ExpiredADusers = get-aduser -Filter {(LastlogonDate -le $90days) 
                                      -and (Enabled -eq $True)}
                             -SearchBase $ou.distinguishedname
                             -Properties * 
#Get information about every user and their groupmembership
foreach ($Users in $ExpiredADusers)
    {
    $users = get-aduser -Identity $users.SamAccountName
                        -Properties * 
             | Select-Object -Property SamAccountName, MemberOf, 
                                       DistinguishedName, ObjectGUID
    $logging =  @{$person.SamAccountName = @{
    MemberOf=$person.MemberOf;
    OriginalOU=$Ou.DistinguishedName;
    DisabledWhen="$descriptionDisabled"}}
    $Array += $Logging   

    }         
}

$array | export-clixml -path somepath -noclobber      

编辑已解决 已解决的问题和原始脚本已更新,以处理嵌套哈希表

原始问题 我想你可以理解我想做什么。 我需要制作回滚文件。

因此导出的文件需要易于导入。使用哈希表时你可以使用。符号和memberof下的每个对象都被视为对象

回滚需要的是什么,所以我可以遍历导入的信息,将用户移回原来的OU位置并恢复成员资格

1 个答案:

答案 0 :(得分:1)

我认为EBGreen在这里真的很受欢迎。您需要一组自定义对象,然后您可以将其导出为您想要的CSV。这也是代码中的一个微小变化。

$Array = @()
$ForEach($User in $Users){
    $logging1 = New-Object PSObject -Property @{
        MemberOf=$user.MemberOf
        OriginalOU=$Ou.DistinguishedName
        DisabledWhen=$descriptionDisabled
    }
    $Array += $Logging1

}

编辑:嗯,因此您希望能够导出和导入完整对象。您不需要CSV,因为您有嵌套数组,并且CSV不是为处理导出和导入而设计的。您需要XML,因此,如上所述,您需要使用Export-Clixml和Import-Clixml,因为XML可以处理嵌套数组。只要数组包含了所有数据,就可以将数组传输给它,并且你应该全部设置好。

Edit2:哈希表中的哈希表问题......好的,我们将其作为MemberOf="$user.MemberOf",这就是问题所在。它正在将其转换为字符串,因此它会扩展整个$ User变量,并将.MemberOf添加到它的末尾。在这种情况下,我们真的不想这样做,但是如果你想从双引号中访问对象的属性,你需要在它周围放置$()。例如,如果您想将用户的专有名称包含为人类友好输出的一部分,您可以执行以下操作:

Write-Output "$($Users.Name)'s distinguished name is: $($users.distinguishedname)"

会输出类似的内容:

TMTech's distinguished name is: CN=TMTech,OU=Awesome,OU=Administrators,DC=Digital,DC=Ghost,DC=net